@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
@@ -13,14 +13,11 @@ import { PROTOBUF_MESSAGE_CONFIG } from '../data-manager/MessagesConfig';
13
13
  import { getDeviceType } from './deviceInfoUtils';
14
14
  import { getDeviceFirmwareVersion } from './deviceVersionUtils';
15
15
  import { existCapability } from './capabilitieUtils';
16
+ import { getProtocolV2WalletSession } from '../protocols/protocol-v2/walletSession';
16
17
 
17
18
  import type { Device } from '../device/Device';
18
19
  import type { Features, IDeviceType, SupportFeatureType } from '../types';
19
20
 
20
- // 生成的 GetPassphraseState 已包含 _only_main_pin / allow_create_attach_pin,
21
- // 不再需要手动扩展字段。
22
- type GetPassphraseStateMessage = GetPassphraseState;
23
-
24
21
  export const getSupportProtocolV1MessageSchema = (
25
22
  features: Features | undefined
26
23
  ): { messages: JSON; protocolV1MessageSchema: ProtocolV1MessageSchema } => {
@@ -33,6 +30,18 @@ export const getSupportProtocolV1MessageSchema = (
33
30
  const currentDeviceVersion = getDeviceFirmwareVersion(features).join('.');
34
31
  const deviceType = getDeviceType(features);
35
32
 
33
+ // In bootloader mode the major/minor/patch fields carry the bootloader version, not the
34
+ // firmware version; normalizing them would mis-route to the legacy schema (e.g. 2.x < 3.3.0).
35
+ // The legacy getDeviceFirmwareVersion returned 0.0.0 here and landed on v1CurrentSchema, so
36
+ // force v1CurrentSchema for every bootloader device, including in-place upgrades on
37
+ // Classic1s/Touch/Pro where firmware is still present.
38
+ if (features.bootloaderMode === true) {
39
+ return {
40
+ messages: DataManager.messages.v1CurrentSchema,
41
+ protocolV1MessageSchema: 'v1CurrentSchema',
42
+ };
43
+ }
44
+
36
45
  const deviceVersionConfigs =
37
46
  PROTOBUF_MESSAGE_CONFIG[deviceType] ||
38
47
  (DeviceTypeToModels[deviceType] &&
@@ -58,11 +67,15 @@ export const getSupportProtocolV1MessageSchema = (
58
67
  };
59
68
  };
60
69
 
61
- export const supportInputPinOnSoftware = (features: Features): SupportFeatureType => {
70
+ export const supportInputPinOnSoftware = (features?: Features): SupportFeatureType => {
62
71
  if (!features) return { support: false };
63
72
 
64
73
  const deviceType = getDeviceType(features);
65
- if (deviceType === EDeviceType.Touch || deviceType === EDeviceType.Pro) {
74
+ if (
75
+ deviceType === EDeviceType.Touch ||
76
+ deviceType === EDeviceType.Pro ||
77
+ deviceType === EDeviceType.Pro2
78
+ ) {
66
79
  return { support: false };
67
80
  }
68
81
 
@@ -92,13 +105,33 @@ export const getPassphraseStateWithRefreshDeviceInfo = async (
92
105
  options?: {
93
106
  expectPassphraseState?: string;
94
107
  onlyMainPin?: boolean;
95
- allowCreateAttachPin?: boolean;
108
+ initSession?: boolean;
96
109
  }
97
110
  ) => {
111
+ if (device.isProtocolV2()) {
112
+ if (!device.features) {
113
+ return {
114
+ passphraseState: undefined,
115
+ newSession: undefined,
116
+ unlockedAttachPin: undefined,
117
+ };
118
+ }
119
+
120
+ return getProtocolV2WalletSession(device, {
121
+ initSession: options?.initSession,
122
+ expectedPassphraseState: options?.expectPassphraseState,
123
+ onlyMainPin: options?.onlyMainPin,
124
+ });
125
+ }
126
+
98
127
  const { features } = device;
99
128
  const locked = features?.unlocked === false;
100
129
  const deviceType = device.getCurrentDeviceType();
101
130
 
131
+ if (options?.initSession) {
132
+ device.clearInternalState();
133
+ }
134
+
102
135
  const { passphraseState, newSession, unlockedAttachPin } = await getPassphraseState(device, {
103
136
  ...options,
104
137
  });
@@ -128,14 +161,17 @@ export const getPassphraseStateWithRefreshDeviceInfo = async (
128
161
  passphraseState,
129
162
  deviceId,
130
163
  newSession,
131
- device.features?.sessionId
164
+ options?.initSession ? null : device.features?.sessionId
132
165
  );
133
166
 
134
- return { passphraseState, newSession, unlockedAttachPin };
167
+ return {
168
+ passphraseState,
169
+ newSession,
170
+ unlockedAttachPin: unlockedAttachPin ?? device.features?.unlockedAttachPin,
171
+ };
135
172
  };
136
173
 
137
- // 仅适用于 Protocol V1 Pro:Pro2 走独立版本线,不能套用 4.15.0 门槛
138
- // (Pro2 在 getPassphraseState 中通过 isProtocolV2 直接判定支持)。
174
+ // Applies to Protocol V1 Pro only; Pro2 has an independent version line.
139
175
  const supportProSeriesAttachPinPassphrase = (deviceType: IDeviceType, firmwareVersion: string) =>
140
176
  deviceType === EDeviceType.Pro && semver.gte(firmwareVersion, '4.15.0');
141
177
 
@@ -144,7 +180,7 @@ export const getPassphraseState = async (
144
180
  options?: {
145
181
  expectPassphraseState?: string;
146
182
  onlyMainPin?: boolean;
147
- allowCreateAttachPin?: boolean;
183
+ initSession?: boolean;
148
184
  }
149
185
  ): Promise<{
150
186
  passphraseState: string | undefined;
@@ -153,31 +189,32 @@ export const getPassphraseState = async (
153
189
  }> => {
154
190
  const { features, commands } = device;
155
191
 
156
- // 设备尚未建立任何状态时无法判定,保持旧的空返回语义
192
+ // Preserve legacy empty-result semantics until the device has established state.
157
193
  if (!features)
158
194
  return { passphraseState: undefined, newSession: undefined, unlockedAttachPin: undefined };
159
195
 
160
196
  const firmwareVersion = device.getCurrentFirmwareVersionString() ?? '0.0.0';
161
197
  const deviceType = device.getCurrentDeviceType();
162
198
 
199
+ if (device.isProtocolV2()) {
200
+ return getProtocolV2WalletSession(device, {
201
+ initSession: options?.initSession,
202
+ expectedPassphraseState: options?.expectPassphraseState,
203
+ onlyMainPin: options?.onlyMainPin,
204
+ });
205
+ }
206
+
163
207
  const supportAttachPinCapability = existCapability(
164
208
  features,
165
209
  Enum_Capability.Capability_AttachToPin
166
210
  );
167
- // Pro2 (Protocol V2) 协议自带 GetPassphraseState(10028),固件从首个版本即支持,
168
- // 不依赖 Pro 系列的 4.15.0 版本线;V2 也没有 GetAddress Testnet 探测这条 legacy 回退路径。
169
211
  const supportGetPassphraseState =
170
- device.isProtocolV2() ||
171
- supportAttachPinCapability ||
172
- supportProSeriesAttachPinPassphrase(deviceType, firmwareVersion);
212
+ supportAttachPinCapability || supportProSeriesAttachPinPassphrase(deviceType, firmwareVersion);
173
213
 
174
214
  if (supportGetPassphraseState) {
175
- const payload: GetPassphraseStateMessage = options?.onlyMainPin
176
- ? { _only_main_pin: true }
177
- : { passphrase_state: options?.expectPassphraseState };
178
- if (options?.allowCreateAttachPin) {
179
- payload.allow_create_attach_pin = true;
180
- }
215
+ const payload: GetPassphraseState = {
216
+ passphrase_state: options?.onlyMainPin ? undefined : options?.expectPassphraseState,
217
+ };
181
218
 
182
219
  const { message, type } = await commands.typedCall(
183
220
  'GetPassphraseState',
@@ -276,6 +313,9 @@ export const getFirmwareUpdateField = ({
276
313
  if (deviceType === EDeviceType.Pro) {
277
314
  return latestFirmwareField;
278
315
  }
316
+ if (deviceType === EDeviceType.Pro2) {
317
+ return 'firmware-v1';
318
+ }
279
319
  return 'firmware';
280
320
  };
281
321
  /**
@@ -319,6 +359,10 @@ export const getFirmwareUpdateFieldArray = (
319
359
  return ['firmware-v8'];
320
360
  }
321
361
 
362
+ if (deviceType === 'pro2') {
363
+ return ['firmware-v1'];
364
+ }
365
+
322
366
  return ['firmware'];
323
367
  };
324
368
 
@@ -1,51 +1,22 @@
1
1
  import { isEmpty } from 'lodash';
2
- import { EDeviceType, EFirmwareType } from '@onekeyfe/hd-shared';
3
- import { Enum_Capability } from '@onekeyfe/hd-transport';
2
+ import { EDeviceType } from '@onekeyfe/hd-shared';
4
3
 
5
4
  import { DeviceModelToTypes } from '../types';
6
- import { existCapability } from './capabilitieUtils';
5
+ import {
6
+ resolveDeviceBleName,
7
+ resolveDeviceFirmwareType,
8
+ resolveDeviceSerialNo,
9
+ resolveDeviceType,
10
+ } from './deviceFeaturesCompat';
7
11
 
8
- import type { Features, IDeviceModel, IDeviceType, IVersionRange } from '../types';
12
+ import type { IDeviceModel, IDeviceType, IVersionRange } from '../types';
13
+ import type { DeviceFeaturesInput } from './deviceFeaturesCompat';
9
14
 
10
15
  /**
11
16
  * get device type by features
12
17
  */
13
- export const getDeviceType = (features?: Features): IDeviceType => {
14
- if (!features || typeof features !== 'object') {
15
- return EDeviceType.Unknown;
16
- }
17
- if (features.deviceType) {
18
- return features.deviceType;
19
- }
20
-
21
- if (features.model === EDeviceType.Pro2 || features.model === 'pro2') {
22
- return EDeviceType.Pro2;
23
- }
24
-
25
- // low version hardware
26
- // onekey_serial_no > onekey_serial > serial_no
27
- const serialNo = getDeviceUUID(features);
28
-
29
- // not exist serialNo, bootloader mode, model 1 is classic
30
- if (isEmpty(serialNo) && features.bootloaderMode === true && features.model === '1') {
31
- return EDeviceType.Classic;
32
- }
33
-
34
- if (isEmpty(serialNo)) return EDeviceType.Unknown;
35
-
36
- const miniFlag = serialNo.slice(0, 2);
37
- // By May 2021, the miniFlag is 'bixin' for all classic devices
38
- if (miniFlag.toLowerCase() === 'bi') return EDeviceType.Classic;
39
- if (miniFlag.toLowerCase() === 'cl') return EDeviceType.Classic;
40
- if (miniFlag.toLowerCase() === 'cp') return EDeviceType.ClassicPure;
41
- if (miniFlag.toLowerCase() === 'mi') return EDeviceType.Mini;
42
- if (miniFlag.toLowerCase() === 'tc') return EDeviceType.Touch;
43
- if (miniFlag.toLowerCase() === 'pr') return EDeviceType.Pro;
44
- if (miniFlag.toLowerCase() === 'p2') return EDeviceType.Pro2;
45
-
46
- // unknown device
47
- return EDeviceType.Unknown;
48
- };
18
+ export const getDeviceType = (features?: DeviceFeaturesInput): IDeviceType =>
19
+ resolveDeviceType(features);
49
20
 
50
21
  /**
51
22
  * get device type by ble name
@@ -70,28 +41,30 @@ export const getDeviceTypeByBleName = (name?: string): IDeviceType => {
70
41
  * Get Connected Device ble name by features
71
42
  * @returns
72
43
  */
73
- export const getDeviceBleName = (features?: Features): string | null => {
74
- if (features == null) return null;
75
- return features.bleName || null;
76
- };
44
+ export const getDeviceBleName = (features?: DeviceFeaturesInput): string | null =>
45
+ resolveDeviceBleName(features);
77
46
 
78
47
  /**
79
- * Get Connected Device UUID by features
48
+ * Get Connected Device serial number by features
80
49
  */
81
- export const getDeviceUUID = (features: Features) => {
82
- return features.serialNo ?? '';
83
- };
50
+ export const getDeviceSerialNo = (features?: DeviceFeaturesInput): string =>
51
+ resolveDeviceSerialNo(features);
52
+
53
+ /**
54
+ * @deprecated Use getDeviceSerialNo instead.
55
+ */
56
+ export const getDeviceUUID = getDeviceSerialNo;
84
57
 
85
58
  /**
86
59
  * Get Connected Device label by features
87
60
  */
88
- export const getDeviceLabel = (features?: Features) => {
61
+ export const getDeviceLabel = (features?: DeviceFeaturesInput) => {
89
62
  if (!features) return null;
90
63
 
91
64
  const deviceType = getDeviceType(features);
92
65
  if (deviceType == null) return null;
93
66
 
94
- if (typeof features.label === 'string' && !isEmpty(features.label)) {
67
+ if ('label' in features && typeof features.label === 'string' && !isEmpty(features.label)) {
95
68
  return features.label;
96
69
  }
97
70
 
@@ -110,7 +83,7 @@ export const getDeviceLabel = (features?: Features) => {
110
83
  * Type has a higher priority than Model
111
84
  */
112
85
  export const getMethodVersionRange = (
113
- features: Features | undefined,
86
+ features: DeviceFeaturesInput | undefined,
114
87
  getVersionRange: (deviceModel: IDeviceType | IDeviceModel) => IVersionRange | undefined
115
88
  ): IVersionRange | undefined => {
116
89
  const deviceType = getDeviceType(features);
@@ -141,16 +114,5 @@ export const getMethodVersionRange = (
141
114
  export const isMethodVersionRangeUnsupported = (versionRange?: IVersionRange): boolean =>
142
115
  versionRange?.unsupported === true;
143
116
 
144
- export const getFirmwareType = (features: Features | undefined) => {
145
- if (!features) {
146
- return EFirmwareType.Universal;
147
- }
148
- if (features.firmwareType) {
149
- return features.firmwareType;
150
- }
151
- // old firmware
152
- return features?.capabilities?.length > 0 &&
153
- !existCapability(features, Enum_Capability.Capability_Bitcoin_like)
154
- ? EFirmwareType.BitcoinOnly
155
- : EFirmwareType.Universal;
156
- };
117
+ export const getFirmwareType = (features?: DeviceFeaturesInput) =>
118
+ resolveDeviceFirmwareType(features);
@@ -1,6 +1,52 @@
1
1
  import { EDeviceType } from '@onekeyfe/hd-shared';
2
+ import { Enum_SafetyCheckLevel } from '@onekeyfe/hd-transport';
2
3
 
3
4
  import type { IDeviceType } from '../types';
5
+ import type { DeviceSettingsParams } from '../types/api/deviceSettings';
6
+ import type { SafetyCheckLevel } from '@onekeyfe/hd-transport';
7
+
8
+ export type DeviceSettingsProtocol = 'V1' | 'V2';
9
+ export type DeviceSettingsField = keyof DeviceSettingsParams;
10
+
11
+ export const DEVICE_SETTINGS_SHARED_FIELDS = [
12
+ 'language',
13
+ 'label',
14
+ 'usePassphrase',
15
+ 'autoLockDelayMs',
16
+ 'autoShutdownDelayMs',
17
+ 'hapticFeedback',
18
+ 'bluetoothEnabled',
19
+ ] as const satisfies readonly DeviceSettingsField[];
20
+
21
+ export const DEVICE_SETTINGS_V1_ONLY_FIELDS = [
22
+ 'homescreen',
23
+ 'passphraseSource',
24
+ 'displayRotation',
25
+ 'passphraseAlwaysOnDevice',
26
+ 'safetyChecks',
27
+ 'experimentalFeatures',
28
+ 'changeBrightness',
29
+ ] as const satisfies readonly DeviceSettingsField[];
30
+
31
+ export const DEVICE_SETTINGS_V2_ONLY_FIELDS = [
32
+ 'brightness',
33
+ 'airgapMode',
34
+ 'animationEnabled',
35
+ 'tapToWake',
36
+ 'deviceNameDisplayEnabled',
37
+ 'fidoEnabled',
38
+ 'usbLockEnabled',
39
+ 'randomKeypad',
40
+ ] as const satisfies readonly DeviceSettingsField[];
41
+
42
+ export const PROTOCOL_V2_NEVER_TIMEOUT_MS = 0x10000000;
43
+
44
+ export const normalizeSafetyCheckLevel = (
45
+ value: SafetyCheckLevel | null | undefined
46
+ ): Enum_SafetyCheckLevel | null | undefined => {
47
+ if (typeof value === 'number' || value === null || value === undefined) return value;
48
+ return Enum_SafetyCheckLevel[value];
49
+ };
4
50
 
5
51
  export const LANGUAGE_LABELS = {
6
52
  en: 'English',
@@ -19,6 +65,40 @@ export const LANGUAGE_LABELS = {
19
65
  export type LanguageKey = keyof typeof LANGUAGE_LABELS;
20
66
  export type LanguageOption = { code: LanguageKey; label: (typeof LANGUAGE_LABELS)[LanguageKey] };
21
67
 
68
+ export const PROTOCOL_V2_LANGUAGE_BY_KEY: Record<LanguageKey, string> = {
69
+ en: 'en-Latn-US',
70
+ zh_cn: 'zh-Hans-CN',
71
+ zh_hk: 'zh-Hant-HK',
72
+ ja: 'ja-Jpan-JP',
73
+ ko: 'ko-Kore-KR',
74
+ fr: 'fr-Latn-FR',
75
+ de: 'de-Latn-DE',
76
+ ru: 'ru-Cyrl-RU',
77
+ es: 'es-Latn-ES',
78
+ it: 'it-Latn-IT',
79
+ pt_br: 'pt-Latn-BR',
80
+ };
81
+
82
+ export const mapLanguageToProtocolV2 = (language?: string) =>
83
+ language ? PROTOCOL_V2_LANGUAGE_BY_KEY[language as LanguageKey] ?? language : undefined;
84
+
85
+ const PROTOCOL_V2_LANGUAGE_KEY_BY_TAG = Object.fromEntries(
86
+ Object.entries(PROTOCOL_V2_LANGUAGE_BY_KEY).map(([key, tag]) => [tag, key])
87
+ ) as Record<string, LanguageKey>;
88
+
89
+ export const mapLanguageFromProtocolV2 = (language?: string) =>
90
+ language ? PROTOCOL_V2_LANGUAGE_KEY_BY_TAG[language] ?? language : undefined;
91
+
92
+ const PRO2_LANGUAGE_OPTIONS = [
93
+ ...Object.entries(LANGUAGE_LABELS).map(([code, label]) => ({ code, label })),
94
+ { code: 'zh-Hant-TW', label: '繁體中文(台灣)' },
95
+ { code: 'vi-Latn-VN', label: 'Tiếng Việt' },
96
+ { code: 'tr-Latn-TR', label: 'Türkçe' },
97
+ { code: 'id-Latn-ID', label: 'Bahasa Indonesia' },
98
+ { code: 'fil-Latn-PH', label: 'Filipino' },
99
+ { code: 'uk-Cyrl-UA', label: 'Українська' },
100
+ ] as const;
101
+
22
102
  export const getLanguageConfig = (deviceType: IDeviceType): Record<string, string>[] => {
23
103
  let keys: LanguageKey[] = [];
24
104
 
@@ -36,6 +116,8 @@ export const getLanguageConfig = (deviceType: IDeviceType): Record<string, strin
36
116
  case EDeviceType.Pro:
37
117
  keys = Object.keys(LANGUAGE_LABELS) as LanguageKey[];
38
118
  break;
119
+ case EDeviceType.Pro2:
120
+ return PRO2_LANGUAGE_OPTIONS.map(option => ({ ...option }));
39
121
  default:
40
122
  keys = [];
41
123
  break;
@@ -44,66 +126,106 @@ export const getLanguageConfig = (deviceType: IDeviceType): Record<string, strin
44
126
  return keys.map(key => ({ code: key, label: LANGUAGE_LABELS[key] }));
45
127
  };
46
128
 
47
- export type DurationParts = {
48
- seconds: number;
49
- minute: number;
50
- hour: number;
51
- day: number;
129
+ export type DeviceSettingsDurationOption = {
130
+ label: string;
131
+ valueMs: number;
52
132
  };
53
133
 
54
- export const getAutoLockOptions = (_deviceType: IDeviceType): DurationParts[] => {
55
- switch (_deviceType) {
134
+ export type DeviceSettingsValueOption<T> = {
135
+ label: string;
136
+ value: T;
137
+ };
138
+
139
+ const durationOption = (valueMs: number): DeviceSettingsDurationOption => {
140
+ if (valueMs === 0 || valueMs === PROTOCOL_V2_NEVER_TIMEOUT_MS) {
141
+ return { label: 'Never', valueMs };
142
+ }
143
+ if (valueMs < 60_000) {
144
+ return { label: `${valueMs / 1000} seconds`, valueMs };
145
+ }
146
+ const minutes = valueMs / 60_000;
147
+ return { label: `${minutes} ${minutes === 1 ? 'minute' : 'minutes'}`, valueMs };
148
+ };
149
+
150
+ const withNever = (
151
+ values: readonly number[],
152
+ protocol: DeviceSettingsProtocol
153
+ ): DeviceSettingsDurationOption[] =>
154
+ [...values, protocol === 'V2' ? PROTOCOL_V2_NEVER_TIMEOUT_MS : 0].map(durationOption);
155
+
156
+ export const getAutoLockOptions = (
157
+ deviceType: IDeviceType,
158
+ protocol: DeviceSettingsProtocol
159
+ ): DeviceSettingsDurationOption[] => {
160
+ switch (deviceType) {
56
161
  case EDeviceType.Mini:
57
162
  case EDeviceType.Classic:
58
163
  case EDeviceType.Classic1s:
59
164
  case EDeviceType.ClassicPure:
60
- return [
61
- { seconds: 0, minute: 1, hour: 0, day: 0 },
62
- { seconds: 0, minute: 2, hour: 0, day: 0 },
63
- { seconds: 0, minute: 5, hour: 0, day: 0 },
64
- { seconds: 0, minute: 10, hour: 0, day: 0 },
65
- { seconds: 0, minute: 0, hour: 0, day: 0 },
66
- ];
165
+ return withNever([60_000, 120_000, 300_000, 600_000], protocol);
67
166
  case EDeviceType.Touch:
68
167
  case EDeviceType.Pro:
69
- return [
70
- { seconds: 30, minute: 0, hour: 0, day: 0 },
71
- { seconds: 0, minute: 1, hour: 0, day: 0 },
72
- { seconds: 0, minute: 2, hour: 0, day: 0 },
73
- { seconds: 0, minute: 5, hour: 0, day: 0 },
74
- { seconds: 0, minute: 10, hour: 0, day: 0 },
75
- { seconds: 0, minute: 30, hour: 0, day: 0 },
76
- { seconds: 0, minute: 0, hour: 0, day: 0 },
77
- ];
168
+ case EDeviceType.Pro2:
169
+ return withNever([30_000, 60_000, 120_000, 300_000, 600_000, 1_800_000], protocol);
78
170
  default:
79
171
  return [];
80
172
  }
81
173
  };
82
174
 
83
- export const getAutoShutDownOptions = (_deviceType: IDeviceType): DurationParts[] => {
84
- switch (_deviceType) {
175
+ export const getAutoShutDownOptions = (
176
+ deviceType: IDeviceType,
177
+ protocol: DeviceSettingsProtocol
178
+ ): DeviceSettingsDurationOption[] => {
179
+ switch (deviceType) {
85
180
  case EDeviceType.Mini:
86
181
  return [];
87
182
  case EDeviceType.Classic:
88
183
  case EDeviceType.Classic1s:
89
184
  case EDeviceType.ClassicPure:
90
- return [
91
- { seconds: 0, minute: 1, hour: 0, day: 0 },
92
- { seconds: 0, minute: 3, hour: 0, day: 0 },
93
- { seconds: 0, minute: 5, hour: 0, day: 0 },
94
- { seconds: 0, minute: 10, hour: 0, day: 0 },
95
- { seconds: 0, minute: 0, hour: 0, day: 0 },
96
- ];
185
+ return withNever([60_000, 180_000, 300_000, 600_000], protocol);
97
186
  case EDeviceType.Touch:
98
187
  case EDeviceType.Pro:
99
- return [
100
- { seconds: 0, minute: 1, hour: 0, day: 0 },
101
- { seconds: 0, minute: 2, hour: 0, day: 0 },
102
- { seconds: 0, minute: 5, hour: 0, day: 0 },
103
- { seconds: 0, minute: 10, hour: 0, day: 0 },
104
- { seconds: 0, minute: 0, hour: 0, day: 0 },
105
- ];
188
+ return withNever([60_000, 120_000, 300_000, 600_000], protocol);
189
+ case EDeviceType.Pro2:
190
+ return withNever([60_000, 120_000, 300_000, 600_000, 1_800_000], protocol);
106
191
  default:
107
192
  return [];
108
193
  }
109
194
  };
195
+
196
+ export type DeviceSettingsCapabilities = {
197
+ protocol: DeviceSettingsProtocol;
198
+ supportedFields: readonly DeviceSettingsField[];
199
+ languageOptions: ReadonlyArray<Record<string, string>>;
200
+ autoLockDelayOptions: readonly DeviceSettingsDurationOption[];
201
+ autoShutdownDelayOptions: readonly DeviceSettingsDurationOption[];
202
+ ranges: {
203
+ brightness?: { min: number; max: number };
204
+ };
205
+ safetyCheckOptions: ReadonlyArray<DeviceSettingsValueOption<Enum_SafetyCheckLevel>>;
206
+ onDeviceConfirmationFields: readonly DeviceSettingsField[];
207
+ };
208
+
209
+ export const getDeviceSettingsCapabilities = (
210
+ deviceType: IDeviceType,
211
+ protocol: DeviceSettingsProtocol
212
+ ): DeviceSettingsCapabilities => ({
213
+ protocol,
214
+ supportedFields:
215
+ protocol === 'V2'
216
+ ? [...DEVICE_SETTINGS_SHARED_FIELDS, ...DEVICE_SETTINGS_V2_ONLY_FIELDS]
217
+ : [...DEVICE_SETTINGS_SHARED_FIELDS, ...DEVICE_SETTINGS_V1_ONLY_FIELDS],
218
+ languageOptions: getLanguageConfig(deviceType),
219
+ autoLockDelayOptions: getAutoLockOptions(deviceType, protocol),
220
+ autoShutdownDelayOptions: getAutoShutDownOptions(deviceType, protocol),
221
+ ranges: protocol === 'V2' ? { brightness: { min: 10, max: 100 } } : {},
222
+ safetyCheckOptions:
223
+ protocol === 'V1'
224
+ ? [
225
+ { label: 'Strict', value: Enum_SafetyCheckLevel.Strict },
226
+ { label: 'Prompt Always', value: Enum_SafetyCheckLevel.PromptAlways },
227
+ { label: 'Prompt Temporarily', value: Enum_SafetyCheckLevel.PromptTemporarily },
228
+ ]
229
+ : [],
230
+ onDeviceConfirmationFields: protocol === 'V2' ? ['usePassphrase', 'airgapMode'] : [],
231
+ });
@@ -1,61 +1,42 @@
1
1
  import semver from 'semver';
2
2
 
3
- import type { Features, IVersionArray } from '../types';
3
+ import {
4
+ resolveDeviceBleFirmwareVersion,
5
+ resolveDeviceBoardVersion,
6
+ resolveDeviceBootloaderVersion,
7
+ resolveDeviceFirmwareVersion,
8
+ } from './deviceFeaturesCompat';
4
9
 
5
- /**
6
- * Get Connected Device version by features
7
- */
8
- export const getDeviceFirmwareVersion = (features: Features | undefined): IVersionArray => {
9
- if (!features) return [0, 0, 0];
10
+ import type { IVersionArray } from '../types';
11
+ import type { DeviceFeaturesInput } from './deviceFeaturesCompat';
10
12
 
11
- if (features.firmwareVersion && semver.valid(features.firmwareVersion)) {
12
- return features.firmwareVersion.split('.').map(Number) as IVersionArray;
13
- }
13
+ const EMPTY_VERSION: IVersionArray = [0, 0, 0];
14
14
 
15
- return [0, 0, 0];
15
+ const parseDeviceVersion = (version?: string | null): IVersionArray => {
16
+ const parsed = version ? semver.parse(version) : null;
17
+ return parsed ? [parsed.major, parsed.minor, parsed.patch] : [...EMPTY_VERSION];
16
18
  };
17
19
 
18
20
  /**
19
- * Get Connected Device bluetooth firmware version by features
21
+ * Get Connected Device version by features
20
22
  */
21
- export const getDeviceBLEFirmwareVersion = (features: Features): IVersionArray => {
22
- const bleVer = features?.bleVersion;
23
-
24
- if (!bleVer) {
25
- return [0, 0, 0];
26
- }
27
-
28
- if (!semver.valid(bleVer)) {
29
- return [0, 0, 0];
30
- }
31
-
32
- if (bleVer) {
33
- return bleVer.split('.').map(Number) as IVersionArray;
34
- }
35
- return [0, 0, 0];
36
- };
23
+ export const getDeviceFirmwareVersion = (features?: DeviceFeaturesInput): IVersionArray =>
24
+ parseDeviceVersion(resolveDeviceFirmwareVersion(features));
37
25
 
38
26
  /**
39
27
  * Get Connected Device bootloader version by features
40
28
  */
41
- export const getDeviceBootloaderVersion = (features: Features | undefined): IVersionArray => {
42
- if (!features) return [0, 0, 0];
43
-
44
- // classic1s 3.5.0 pro 4.6.0
45
- if (features.bootloaderVersion && semver.valid(features.bootloaderVersion)) {
46
- return features.bootloaderVersion.split('.').map(Number) as IVersionArray;
47
- }
48
-
49
- return [0, 0, 0];
50
- };
29
+ export const getDeviceBootloaderVersion = (features?: DeviceFeaturesInput): IVersionArray =>
30
+ parseDeviceVersion(resolveDeviceBootloaderVersion(features));
51
31
 
52
32
  /**
53
- * Get Connected Device boardloader version by features
33
+ * Get Connected Device boardloader/romloader version by features
54
34
  */
55
- export const getDeviceBoardloaderVersion = (features: Features): IVersionArray => {
56
- if (features?.boardVersion && semver.valid(features.boardVersion)) {
57
- return features.boardVersion.split('.').map(Number) as IVersionArray;
58
- }
35
+ export const getDeviceBoardloaderVersion = (features?: DeviceFeaturesInput): IVersionArray =>
36
+ parseDeviceVersion(resolveDeviceBoardVersion(features));
59
37
 
60
- return [0, 0, 0];
61
- };
38
+ /**
39
+ * Get Connected Device bluetooth firmware version by features
40
+ */
41
+ export const getDeviceBLEFirmwareVersion = (features?: DeviceFeaturesInput): IVersionArray =>
42
+ parseDeviceVersion(resolveDeviceBleFirmwareVersion(features));
@@ -1,11 +1,11 @@
1
- import { getDeviceType, getDeviceUUID } from './deviceInfoUtils';
1
+ import { getDeviceSerialNo, getDeviceType } from './deviceInfoUtils';
2
2
 
3
3
  import type { Features } from '../types';
4
4
 
5
5
  /**
6
6
  * 检测故障固件设备
7
7
  * 检测规则:
8
- * - 序列号范围:21032200001 21032201500
8
+ * - Serial number range: 21032200001 through 21032201500
9
9
  * - SE版本为 1.1.0.2
10
10
  *
11
11
  * 对齐之前版本的检测逻辑
@@ -27,7 +27,7 @@ export const findDefectiveBatchDevice = (features: Features) => {
27
27
  */
28
28
  export const getDefectiveDeviceInfo = (features: Features) => {
29
29
  if (!findDefectiveBatchDevice(features)) return null;
30
- const serialNo = getDeviceUUID(features);
30
+ const serialNo = getDeviceSerialNo(features);
31
31
  const deviceType = getDeviceType(features);
32
32
  const { seVersion } = features;
33
33