@onekeyfe/hd-core 1.2.0-alpha.65 → 1.2.0-alpha.66

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 (314) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +313 -0
  2. package/__tests__/DeviceCommands.test.ts +59 -13
  3. package/__tests__/DeviceEventRegistration.test.ts +6 -0
  4. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +198 -3
  5. package/__tests__/connectSettings.test.ts +5 -47
  6. package/__tests__/core-initialization.test.ts +23 -0
  7. package/__tests__/device-connector-protocol.test.ts +81 -0
  8. package/__tests__/device-lifecycle-events.test.ts +105 -3
  9. package/__tests__/device-pool-state.test.ts +22 -0
  10. package/__tests__/device-settings.test.ts +39 -18
  11. package/__tests__/device-state-contract.test.ts +1 -0
  12. package/__tests__/device-state-mapper.test.ts +13 -1
  13. package/__tests__/device-utils.test.ts +48 -1
  14. package/__tests__/deviceSettings.test.ts +11 -1
  15. package/__tests__/deviceUploadNft.test.ts +316 -0
  16. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +31 -59
  17. package/__tests__/get-device-state.test.ts +132 -12
  18. package/__tests__/homescreen.test.ts +41 -1
  19. package/__tests__/kaspa-use-tweak-pro2.test.ts +2 -2
  20. package/__tests__/kaspaSignTransaction.test.ts +3 -26
  21. package/__tests__/logBlockEvent.test.ts +1 -1
  22. package/__tests__/method-protocol-support.test.ts +19 -0
  23. package/__tests__/open-wallet-session.test.ts +568 -37
  24. package/__tests__/pro2Nft.test.ts +108 -0
  25. package/__tests__/protocol-binding.test.ts +89 -0
  26. package/__tests__/protocol-v2-resources.test.ts +340 -0
  27. package/__tests__/protocol-v2-ui-lifecycle.test.ts +91 -0
  28. package/__tests__/protocol-v2-unlock-policy.test.ts +300 -37
  29. package/__tests__/protocol-v2.test.ts +1506 -1097
  30. package/__tests__/protocolV2FileWrite.test.ts +152 -0
  31. package/__tests__/protocolV2UiInteraction.test.ts +63 -0
  32. package/__tests__/public-pro2-api-boundary.test.ts +1 -0
  33. package/__tests__/search-devices.test.ts +12 -3
  34. package/__tests__/tron-sign-message-init.test.ts +2 -2
  35. package/__tests__/uiProgressThrottle.test.ts +74 -0
  36. package/__tests__/uiPromiseRegistry.test.ts +115 -0
  37. package/dist/api/BaseMethod.d.ts +3 -1
  38. package/dist/api/BaseMethod.d.ts.map +1 -1
  39. package/dist/api/CheckAllFirmwareRelease.d.ts +2 -1
  40. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  41. package/dist/api/DetectDeviceConnectProtocol.d.ts +7 -0
  42. package/dist/api/DetectDeviceConnectProtocol.d.ts.map +1 -0
  43. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  44. package/dist/api/FirmwareUpdateV2.d.ts +0 -11
  45. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  46. package/dist/api/FirmwareUpdateV3.d.ts +3 -7
  47. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  48. package/dist/api/FirmwareUpdateV4.d.ts +13 -27
  49. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  50. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  51. package/dist/api/OpenWalletSession.d.ts.map +1 -1
  52. package/dist/api/SearchDevices.d.ts.map +1 -1
  53. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  54. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  55. package/dist/api/device/DeviceUnlock.d.ts +2 -2
  56. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  57. package/dist/api/device/DeviceUpdateBootloader.d.ts +1 -5
  58. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  59. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +4 -11
  60. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  61. package/dist/api/firmware/getBinary.d.ts +0 -7
  62. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  63. package/dist/api/firmware/updateBootloader.d.ts +0 -2
  64. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  65. package/dist/api/firmware/uploadFirmware.d.ts +1 -9
  66. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  67. package/dist/api/helpers/protocolV2FileWrite.d.ts +9 -0
  68. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -1
  69. package/dist/api/index.d.ts +2 -0
  70. package/dist/api/index.d.ts.map +1 -1
  71. package/dist/api/kaspa/KaspaGetAddress.d.ts +1 -1
  72. package/dist/api/kaspa/KaspaSignTransaction.d.ts +1 -1
  73. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  74. package/dist/api/polkadot/PolkadotGetAddress.d.ts +1 -1
  75. package/dist/api/polkadot/networks.d.ts +1 -1
  76. package/dist/api/protocol-v2/DeviceUploadNft.d.ts +31 -0
  77. package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +1 -0
  78. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
  79. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  80. package/dist/api/solana/SolSignMessage.d.ts +1 -1
  81. package/dist/api/solana/SolSignOffchainMessage.d.ts +1 -1
  82. package/dist/api/solana/SolSignTransaction.d.ts +2 -2
  83. package/dist/api/stellar/StellarSignTransaction.d.ts +1 -1
  84. package/dist/api/sui/SuiGetAddress.d.ts +1 -1
  85. package/dist/api/sui/SuiGetPublicKey.d.ts +1 -1
  86. package/dist/api/sui/SuiSignMessage.d.ts +1 -1
  87. package/dist/api/sui/SuiSignTransaction.d.ts +1 -1
  88. package/dist/api/ton/TonGetAddress.d.ts +1 -1
  89. package/dist/api/ton/TonSignMessage.d.ts +1 -1
  90. package/dist/api/ton/TonSignProof.d.ts +1 -1
  91. package/dist/api/tron/TronSignMessage.d.ts +2 -2
  92. package/dist/api/tron/TronSignTransaction.d.ts +1 -1
  93. package/dist/core/deviceEventRegistration.d.ts +2 -0
  94. package/dist/core/deviceEventRegistration.d.ts.map +1 -1
  95. package/dist/core/index.d.ts.map +1 -1
  96. package/dist/core/uiPromiseRegistry.d.ts +6 -0
  97. package/dist/core/uiPromiseRegistry.d.ts.map +1 -0
  98. package/dist/data-manager/DataManager.d.ts +9 -4
  99. package/dist/data-manager/DataManager.d.ts.map +1 -1
  100. package/dist/data-manager/TransportManager.d.ts.map +1 -1
  101. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  102. package/dist/device/Device.d.ts +29 -6
  103. package/dist/device/Device.d.ts.map +1 -1
  104. package/dist/device/DeviceCommands.d.ts +4 -4
  105. package/dist/device/DeviceCommands.d.ts.map +1 -1
  106. package/dist/device/DeviceConnector.d.ts +2 -1
  107. package/dist/device/DeviceConnector.d.ts.map +1 -1
  108. package/dist/device/DevicePool.d.ts.map +1 -1
  109. package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts.map +1 -1
  110. package/dist/events/device.d.ts +4 -0
  111. package/dist/events/device.d.ts.map +1 -1
  112. package/dist/events/logBlockEvent.d.ts.map +1 -1
  113. package/dist/events/ui-promise.d.ts +4 -2
  114. package/dist/events/ui-promise.d.ts.map +1 -1
  115. package/dist/events/ui-request.d.ts +31 -2
  116. package/dist/events/ui-request.d.ts.map +1 -1
  117. package/dist/events/ui-response.d.ts +10 -2
  118. package/dist/events/ui-response.d.ts.map +1 -1
  119. package/dist/index.d.ts +243 -248
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +3051 -3774
  122. package/dist/inject.d.ts +6 -1
  123. package/dist/inject.d.ts.map +1 -1
  124. package/dist/lowLevelInject.d.ts.map +1 -1
  125. package/dist/protocols/protocol-v2/features.d.ts +0 -4
  126. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  127. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  128. package/dist/protocols/protocol-v2/resources.d.ts +30 -0
  129. package/dist/protocols/protocol-v2/resources.d.ts.map +1 -0
  130. package/dist/protocols/protocol-v2/uiInteraction.d.ts +7 -4
  131. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -1
  132. package/dist/protocols/protocol-v2/unlockPolicy.d.ts +1 -3
  133. package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -1
  134. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +22 -0
  135. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +1 -0
  136. package/dist/protocols/protocol-v2/walletSession.d.ts +6 -1
  137. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
  138. package/dist/topLevelInject.d.ts.map +1 -1
  139. package/dist/types/api/checkAllFirmwareRelease.d.ts +3 -5
  140. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  141. package/dist/types/api/detectDeviceConnectProtocol.d.ts +4 -0
  142. package/dist/types/api/detectDeviceConnectProtocol.d.ts.map +1 -0
  143. package/dist/types/api/deviceUnlock.d.ts +5 -1
  144. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  145. package/dist/types/api/deviceUpdateBootloader.d.ts +0 -6
  146. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  147. package/dist/types/api/export.d.ts +2 -4
  148. package/dist/types/api/export.d.ts.map +1 -1
  149. package/dist/types/api/firmwareUpdate.d.ts +4 -71
  150. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  151. package/dist/types/api/index.d.ts +7 -10
  152. package/dist/types/api/index.d.ts.map +1 -1
  153. package/dist/types/api/protocolV2.d.ts +3 -0
  154. package/dist/types/api/protocolV2.d.ts.map +1 -1
  155. package/dist/types/device.d.ts +2 -2
  156. package/dist/types/device.d.ts.map +1 -1
  157. package/dist/types/params.d.ts +1 -0
  158. package/dist/types/params.d.ts.map +1 -1
  159. package/dist/types/settings.d.ts +38 -21
  160. package/dist/types/settings.d.ts.map +1 -1
  161. package/dist/utils/deviceFeaturesCompat.d.ts +0 -1
  162. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -1
  163. package/dist/utils/deviceFeaturesUtils.d.ts +4 -0
  164. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  165. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  166. package/dist/utils/deviceSettings.d.ts.map +1 -1
  167. package/dist/utils/homescreen.d.ts +4 -0
  168. package/dist/utils/homescreen.d.ts.map +1 -1
  169. package/dist/utils/index.d.ts +1 -1
  170. package/dist/utils/index.d.ts.map +1 -1
  171. package/dist/utils/patch.d.ts +1 -1
  172. package/dist/utils/patch.d.ts.map +1 -1
  173. package/dist/utils/pro2Nft.d.ts +31 -0
  174. package/dist/utils/pro2Nft.d.ts.map +1 -0
  175. package/dist/utils/pro2Wallpaper.d.ts +10 -0
  176. package/dist/utils/pro2Wallpaper.d.ts.map +1 -1
  177. package/dist/utils/uiProgressThrottle.d.ts +3 -0
  178. package/dist/utils/uiProgressThrottle.d.ts.map +1 -0
  179. package/package.json +4 -4
  180. package/src/api/BaseMethod.ts +8 -10
  181. package/src/api/CheckAllFirmwareRelease.ts +59 -60
  182. package/src/api/DetectDeviceConnectProtocol.ts +18 -0
  183. package/src/api/FirmwareUpdate.ts +7 -15
  184. package/src/api/FirmwareUpdateV2.ts +126 -316
  185. package/src/api/FirmwareUpdateV3.ts +63 -265
  186. package/src/api/FirmwareUpdateV4.ts +597 -1005
  187. package/src/api/GetPassphraseState.ts +7 -1
  188. package/src/api/OpenWalletSession.ts +71 -17
  189. package/src/api/SearchDevices.ts +3 -1
  190. package/src/api/allnetwork/AllNetworkGetAddress.ts +21 -21
  191. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +36 -11
  192. package/src/api/device/DeviceSettings.ts +5 -4
  193. package/src/api/device/DeviceUnlock.ts +8 -3
  194. package/src/api/device/DeviceUpdateBootloader.ts +6 -125
  195. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +27 -83
  196. package/src/api/firmware/updateBootloader.ts +4 -19
  197. package/src/api/firmware/uploadFirmware.ts +39 -144
  198. package/src/api/helpers/protocolV2FileWrite.ts +202 -63
  199. package/src/api/index.ts +2 -0
  200. package/src/api/kaspa/KaspaGetAddress.ts +1 -1
  201. package/src/api/kaspa/KaspaSignTransaction.ts +2 -13
  202. package/src/api/polkadot/networks.ts +3 -3
  203. package/src/api/protocol-v2/DeviceUploadNft.ts +197 -0
  204. package/src/api/protocol-v2/ProtocolInfoRequest.ts +3 -1
  205. package/src/api/protocol-v2/helpers.ts +1 -1
  206. package/src/api/solana/SolSignMessage.ts +1 -1
  207. package/src/api/solana/SolSignOffchainMessage.ts +1 -1
  208. package/src/api/solana/SolSignTransaction.ts +2 -2
  209. package/src/api/sui/SuiGetAddress.ts +1 -1
  210. package/src/api/sui/SuiGetPublicKey.ts +1 -1
  211. package/src/api/sui/SuiSignMessage.ts +1 -1
  212. package/src/api/sui/SuiSignTransaction.ts +1 -1
  213. package/src/api/ton/TonGetAddress.ts +1 -1
  214. package/src/api/ton/TonSignMessage.ts +1 -1
  215. package/src/api/ton/TonSignProof.ts +1 -1
  216. package/src/api/tron/TronSignMessage.ts +2 -2
  217. package/src/api/tron/TronSignTransaction.ts +1 -1
  218. package/src/core/deviceEventRegistration.ts +4 -0
  219. package/src/core/index.ts +213 -111
  220. package/src/core/uiPromiseRegistry.ts +63 -0
  221. package/src/data/messages/messages-protocol-v2.json +25 -0
  222. package/src/data-manager/DataManager.ts +113 -41
  223. package/src/data-manager/TransportManager.ts +6 -0
  224. package/src/data-manager/connectSettings.ts +0 -11
  225. package/src/device/Device.ts +274 -49
  226. package/src/device/DeviceCommands.ts +31 -4
  227. package/src/device/DeviceConnector.ts +33 -13
  228. package/src/device/DevicePool.ts +21 -7
  229. package/src/deviceProfile/buildDeviceFeatures.ts +2 -2
  230. package/src/deviceProfile/protocolV2DeviceIdentity.ts +3 -0
  231. package/src/events/device.ts +4 -0
  232. package/src/events/logBlockEvent.ts +1 -0
  233. package/src/events/ui-promise.ts +4 -2
  234. package/src/events/ui-request.ts +36 -2
  235. package/src/events/ui-response.ts +12 -2
  236. package/src/index.ts +0 -5
  237. package/src/inject.ts +60 -24
  238. package/src/lowLevelInject.ts +7 -8
  239. package/src/protocols/protocol-v2/features.ts +10 -7
  240. package/src/protocols/protocol-v2/firmware.ts +2 -0
  241. package/src/protocols/protocol-v2/resources.ts +390 -0
  242. package/src/protocols/protocol-v2/uiInteraction.ts +46 -6
  243. package/src/protocols/protocol-v2/unlockPolicy.ts +1 -105
  244. package/src/protocols/protocol-v2/unlockPolicyRunner.ts +131 -0
  245. package/src/protocols/protocol-v2/walletSession.ts +214 -36
  246. package/src/topLevelInject.ts +7 -8
  247. package/src/types/api/checkAllFirmwareRelease.ts +3 -5
  248. package/src/types/api/detectDeviceConnectProtocol.ts +6 -0
  249. package/src/types/api/deviceUnlock.ts +12 -1
  250. package/src/types/api/deviceUpdateBootloader.ts +0 -6
  251. package/src/types/api/export.ts +1 -18
  252. package/src/types/api/firmwareUpdate.ts +6 -79
  253. package/src/types/api/index.ts +13 -14
  254. package/src/types/api/protocolV2.ts +13 -0
  255. package/src/types/device.ts +15 -3
  256. package/src/types/params.ts +7 -1
  257. package/src/types/settings.ts +60 -22
  258. package/src/utils/deviceFeaturesCompat.ts +5 -6
  259. package/src/utils/deviceFeaturesUtils.ts +14 -3
  260. package/src/utils/deviceInfoUtils.ts +2 -0
  261. package/src/utils/deviceSettings.ts +3 -0
  262. package/src/utils/homescreen.ts +32 -6
  263. package/src/utils/index.ts +6 -1
  264. package/src/utils/pro2Nft.ts +142 -0
  265. package/src/utils/pro2Wallpaper.ts +35 -8
  266. package/src/utils/uiProgressThrottle.ts +63 -0
  267. package/__tests__/device-initialize-timeout.test.ts +0 -56
  268. package/__tests__/firmware-update/check-all-firmware-release.test.ts +0 -175
  269. package/__tests__/firmware-update/firmware-artifact-source.test.ts +0 -119
  270. package/__tests__/firmware-update/firmware-host-binding.test.ts +0 -70
  271. package/__tests__/firmware-update/firmware-preparation-error.test.ts +0 -27
  272. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +0 -200
  273. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +0 -13
  274. package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +0 -394
  275. package/__tests__/firmware-update/firmware-update-plan.test.ts +0 -593
  276. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +0 -213
  277. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +0 -58
  278. package/__tests__/firmware-update/firmware-upload-source.test.ts +0 -70
  279. package/dist/api/firmware/FirmwareArtifactSource.d.ts +0 -25
  280. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +0 -1
  281. package/dist/api/firmware/FirmwareHostBinding.d.ts +0 -6
  282. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +0 -1
  283. package/dist/api/firmware/FirmwarePreparationError.d.ts +0 -3
  284. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +0 -1
  285. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +0 -3
  286. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +0 -1
  287. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +0 -25
  288. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +0 -1
  289. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +0 -32
  290. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +0 -1
  291. package/dist/api/firmware/progressThrottle.d.ts +0 -3
  292. package/dist/api/firmware/progressThrottle.d.ts.map +0 -1
  293. package/dist/protocols/protocol-v2/lockedError.d.ts +0 -2
  294. package/dist/protocols/protocol-v2/lockedError.d.ts.map +0 -1
  295. package/dist/protocols/protocol-v2/unlockRetry.d.ts +0 -10
  296. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +0 -1
  297. package/dist/types/api/firmwareUpdateCapabilities.d.ts +0 -9
  298. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +0 -1
  299. package/dist/types/api/firmwareUpdatePlan.d.ts +0 -28
  300. package/dist/types/api/firmwareUpdatePlan.d.ts.map +0 -1
  301. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +0 -42
  302. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +0 -1
  303. package/src/api/firmware/FirmwareArtifactSource.ts +0 -278
  304. package/src/api/firmware/FirmwareHostBinding.ts +0 -100
  305. package/src/api/firmware/FirmwarePreparationError.ts +0 -12
  306. package/src/api/firmware/FirmwareUpdateCapabilities.ts +0 -9
  307. package/src/api/firmware/FirmwareUpdatePlan.ts +0 -772
  308. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +0 -449
  309. package/src/api/firmware/progressThrottle.ts +0 -44
  310. package/src/protocols/protocol-v2/lockedError.ts +0 -10
  311. package/src/protocols/protocol-v2/unlockRetry.ts +0 -109
  312. package/src/types/api/firmwareUpdateCapabilities.ts +0 -9
  313. package/src/types/api/firmwareUpdatePlan.ts +0 -38
  314. package/src/types/api/firmwareUpdatePreparedPlan.ts +0 -53
@@ -1,45 +1,308 @@
1
- import * as publicMethods from '../src/api';
2
- import {
3
- PROTOCOL_V2_RETRY_ON_LOCKED_METHODS,
4
- getProtocolV2UnlockPolicy,
5
- } from '../src/protocols/protocol-v2/unlockPolicy';
1
+ import { DeviceSessionPinType } from '@onekeyfe/hd-transport';
2
+
3
+ import ConfluxSignMessageCIP23 from '../src/api/conflux/ConfluxSignMessageCIP23';
4
+ import DeviceLock from '../src/api/device/DeviceLock';
5
+ import OpenWalletSession from '../src/api/OpenWalletSession';
6
+ import { runMethodWithUnlockPolicy } from '../src/protocols/protocol-v2/unlockPolicyRunner';
6
7
 
7
8
  jest.mock('../src/data/config', () => ({
8
9
  DEFAULT_DOMAIN: 'https://example.com/',
9
10
  getSDKVersion: () => '0.0.0-test',
10
11
  }));
11
12
 
12
- describe('Protocol V2 public method unlock policy', () => {
13
- test('classifies the complete public method table with an explicit replay allowlist', () => {
14
- const publicMethodNames = Object.keys(publicMethods);
15
- const retryMethodNames = new Set<string>(PROTOCOL_V2_RETRY_ON_LOCKED_METHODS);
16
-
17
- expect(publicMethodNames.length).toBeGreaterThan(100);
18
- expect(new Set(PROTOCOL_V2_RETRY_ON_LOCKED_METHODS).size).toBe(
19
- PROTOCOL_V2_RETRY_ON_LOCKED_METHODS.length
20
- );
21
-
22
- for (const methodName of PROTOCOL_V2_RETRY_ON_LOCKED_METHODS) {
23
- expect(publicMethods).toHaveProperty(methodName);
24
- }
25
-
26
- for (const methodName of publicMethodNames) {
27
- expect(getProtocolV2UnlockPolicy(methodName)).toBe(
28
- retryMethodNames.has(methodName) ? 'retry-on-locked' : 'none'
29
- );
30
- }
31
- });
32
-
33
- test.each([
34
- 'deviceUnlock',
35
- 'deviceLock',
36
- 'deviceWipe',
37
- 'deviceChangePin',
38
- 'deviceSettings',
39
- 'firmwareUpdateV4',
40
- 'deviceUploadWallpaper',
41
- 'uploadPortfolio',
42
- ])('does not make the state-changing method %s replayable by default', methodName => {
43
- expect(getProtocolV2UnlockPolicy(methodName)).toBe('none');
13
+ describe('Protocol V2 unlock semantics', () => {
14
+ test('wallet business methods inherit the wallet-session unlock requirement', () => {
15
+ const method = new ConfluxSignMessageCIP23({
16
+ id: 1,
17
+ payload: { method: 'confluxSignMessageCIP23' },
18
+ });
19
+
20
+ expect(method.useDevicePassphraseState).toBe(true);
21
+ expect(method.unlockPolicy).toBe('none');
22
+ expect(method.getSupportedProtocols()).toContain('V2');
23
+ });
24
+
25
+ test('lock-free Protocol V2 controls explicitly opt out of wallet-session handling', () => {
26
+ const method = new DeviceLock({
27
+ id: 1,
28
+ payload: { method: 'deviceLock' },
29
+ });
30
+
31
+ method.init();
32
+
33
+ expect(method.useDevicePassphraseState).toBe(false);
34
+ expect(method.unlockPolicy).toBe('none');
35
+ });
36
+
37
+ test('pre-unlocks openWalletSession before opening or restoring a wallet session', async () => {
38
+ const method = new OpenWalletSession({
39
+ id: 1,
40
+ payload: { method: 'openWalletSession', mode: 'standard' },
41
+ });
42
+ method.init();
43
+ const run = jest.fn().mockResolvedValue({ walletType: 'standard' });
44
+ method.run = run as any;
45
+ const features = { unlocked: false };
46
+ const device = {
47
+ features,
48
+ commands: {
49
+ typedCall: jest.fn().mockResolvedValue({ message: { unlocked: false } }),
50
+ },
51
+ isProtocolV2: () => true,
52
+ isBootloader: () => false,
53
+ isRomloader: () => false,
54
+ updateProtocolV2Status: jest.fn(() => features),
55
+ unlockDevice: jest.fn().mockImplementation(() => {
56
+ features.unlocked = true;
57
+ return Promise.resolve(features);
58
+ }),
59
+ };
60
+
61
+ await expect(runMethodWithUnlockPolicy(method, device as any)).resolves.toEqual({
62
+ walletType: 'standard',
63
+ });
64
+
65
+ expect(method.unlockPolicy).toBe('unlock-before-run');
66
+ expect(device.unlockDevice).toHaveBeenCalledTimes(1);
67
+ expect(run).toHaveBeenCalledTimes(1);
68
+ });
69
+
70
+ test('pre-unlocks an unregistered wallet business method', async () => {
71
+ const features = { unlocked: false };
72
+ const method = {
73
+ name: 'newWalletBusinessMethod',
74
+ unlockPolicy: 'none',
75
+ useDevicePassphraseState: true,
76
+ run: jest.fn().mockResolvedValue({ message: 'ok' }),
77
+ };
78
+ const device = {
79
+ features,
80
+ commands: {
81
+ typedCall: jest.fn().mockResolvedValue({ message: { unlocked: false } }),
82
+ },
83
+ isProtocolV2: () => true,
84
+ isBootloader: () => false,
85
+ isRomloader: () => false,
86
+ updateProtocolV2Status: jest.fn(() => features),
87
+ unlockDevice: jest.fn().mockImplementation(() => {
88
+ features.unlocked = true;
89
+ return Promise.resolve(features);
90
+ }),
91
+ };
92
+
93
+ await expect(runMethodWithUnlockPolicy(method as any, device as any)).resolves.toEqual({
94
+ message: 'ok',
95
+ });
96
+ expect(device.unlockDevice).toHaveBeenCalledTimes(1);
97
+ expect(method.run).toHaveBeenCalledTimes(1);
98
+ });
99
+
100
+ test('allows either PIN type when pre-unlocking a known hidden wallet', async () => {
101
+ const features = { unlocked: false };
102
+ const method = {
103
+ name: 'btcGetAddress',
104
+ unlockPolicy: 'none',
105
+ useDevicePassphraseState: true,
106
+ payload: { passphraseState: 'expected-hidden-wallet-state' },
107
+ run: jest.fn().mockResolvedValue({ address: 'bc1qexample' }),
108
+ };
109
+ const device = {
110
+ features,
111
+ commands: {
112
+ typedCall: jest.fn().mockResolvedValue({ message: { unlocked: false } }),
113
+ },
114
+ isProtocolV2: () => true,
115
+ isBootloader: () => false,
116
+ isRomloader: () => false,
117
+ updateProtocolV2Status: jest.fn(() => features),
118
+ unlockDevice: jest.fn().mockImplementation(() => {
119
+ features.unlocked = true;
120
+ return Promise.resolve(features);
121
+ }),
122
+ };
123
+
124
+ await expect(runMethodWithUnlockPolicy(method as any, device as any)).resolves.toEqual({
125
+ address: 'bc1qexample',
126
+ });
127
+
128
+ expect(device.unlockDevice).toHaveBeenCalledWith(DeviceSessionPinType.Any, expect.any(Object));
129
+ expect(method.run).toHaveBeenCalledTimes(1);
130
+ });
131
+
132
+ test('does not let an unrelated control opt into Any with a passphraseState-shaped field', async () => {
133
+ const features = { unlocked: false };
134
+ const method = {
135
+ name: 'securityControl',
136
+ unlockPolicy: 'unlock-before-run',
137
+ useDevicePassphraseState: false,
138
+ payload: { passphraseState: 'untrusted-field' },
139
+ run: jest.fn().mockResolvedValue({ message: 'ok' }),
140
+ };
141
+ const device = {
142
+ features,
143
+ commands: {
144
+ typedCall: jest.fn().mockResolvedValue({ message: { unlocked: false } }),
145
+ },
146
+ isProtocolV2: () => true,
147
+ isBootloader: () => false,
148
+ isRomloader: () => false,
149
+ updateProtocolV2Status: jest.fn(() => features),
150
+ unlockDevice: jest.fn().mockImplementation(() => {
151
+ features.unlocked = true;
152
+ return Promise.resolve(features);
153
+ }),
154
+ };
155
+
156
+ await expect(runMethodWithUnlockPolicy(method as any, device as any)).resolves.toEqual({
157
+ message: 'ok',
158
+ });
159
+
160
+ expect(device.unlockDevice).toHaveBeenCalledWith(DeviceSessionPinType.Main, expect.any(Object));
161
+ });
162
+
163
+ test('pre-unlocks a locked standard wallet before wallet-session preparation', async () => {
164
+ const calls: string[] = [];
165
+ const features = {
166
+ unlocked: false,
167
+ passphraseProtection: true,
168
+ };
169
+ const method = {
170
+ name: 'btcGetPublicKey',
171
+ unlockPolicy: 'none',
172
+ useDevicePassphraseState: true,
173
+ payload: { useEmptyPassphrase: true },
174
+ run: jest.fn().mockImplementation(() => {
175
+ calls.push('run');
176
+ return Promise.resolve({ message: 'ok' });
177
+ }),
178
+ };
179
+ const device = {
180
+ features,
181
+ commands: {
182
+ typedCall: jest.fn().mockImplementation(() => {
183
+ calls.push('status');
184
+ return Promise.resolve({
185
+ message: {
186
+ unlocked: false,
187
+ passphraseProtection: true,
188
+ },
189
+ });
190
+ }),
191
+ },
192
+ isProtocolV2: () => true,
193
+ isBootloader: () => false,
194
+ isRomloader: () => false,
195
+ updateProtocolV2Status: jest.fn(() => features),
196
+ unlockDevice: jest.fn().mockImplementation(() => {
197
+ calls.push('pre-unlock');
198
+ features.unlocked = true;
199
+ return Promise.resolve(features);
200
+ }),
201
+ };
202
+
203
+ await expect(
204
+ runMethodWithUnlockPolicy(method as any, device as any, {
205
+ prepare: () => {
206
+ calls.push('prepare');
207
+ expect(features.unlocked).toBe(true);
208
+ return Promise.resolve();
209
+ },
210
+ })
211
+ ).resolves.toEqual({ message: 'ok' });
212
+
213
+ expect(calls).toEqual(['status', 'pre-unlock', 'prepare', 'run']);
214
+ expect(device.unlockDevice).toHaveBeenCalledTimes(1);
215
+ expect(device.unlockDevice).toHaveBeenCalledWith(DeviceSessionPinType.Main, expect.any(Object));
216
+ });
217
+
218
+ test('reuses a Main PIN selected by pre-unlock when locked status hides passphrase state', async () => {
219
+ const calls: string[] = [];
220
+ const features: {
221
+ unlocked: boolean;
222
+ passphraseProtection?: boolean;
223
+ unlockedAttachPin?: boolean;
224
+ } = {
225
+ unlocked: false,
226
+ };
227
+ const method: any = {
228
+ name: 'btcGetPublicKey',
229
+ unlockPolicy: 'none',
230
+ useDevicePassphraseState: true,
231
+ payload: { useEmptyPassphrase: true },
232
+ run: jest.fn().mockImplementation(() => {
233
+ calls.push('run');
234
+ return Promise.resolve({ message: 'ok' });
235
+ }),
236
+ };
237
+ const device = {
238
+ features,
239
+ commands: {
240
+ typedCall: jest.fn().mockImplementation(() => {
241
+ calls.push('status');
242
+ return Promise.resolve({
243
+ message: {
244
+ unlocked: false,
245
+ },
246
+ });
247
+ }),
248
+ },
249
+ isProtocolV2: () => true,
250
+ isBootloader: () => false,
251
+ isRomloader: () => false,
252
+ updateProtocolV2Status: jest.fn(() => features),
253
+ unlockDevice: jest.fn().mockImplementation(() => {
254
+ calls.push('main-pin');
255
+ features.unlocked = true;
256
+ features.passphraseProtection = true;
257
+ features.unlockedAttachPin = false;
258
+ return Promise.resolve(features);
259
+ }),
260
+ };
261
+
262
+ await expect(
263
+ runMethodWithUnlockPolicy(method, device as any, {
264
+ prepare: async () => {
265
+ if (!(features.unlocked && features.unlockedAttachPin === false)) {
266
+ await device.unlockDevice();
267
+ }
268
+ },
269
+ })
270
+ ).resolves.toEqual({ message: 'ok' });
271
+
272
+ expect(calls).toEqual(['status', 'main-pin', 'run']);
273
+ expect(device.unlockDevice).toHaveBeenCalledTimes(1);
274
+ });
275
+
276
+ test('runs fresh-status validation before starting unlock', async () => {
277
+ const identityError = new Error('Unexpected device');
278
+ const method = {
279
+ name: 'walletBusinessMethod',
280
+ unlockPolicy: 'none',
281
+ useDevicePassphraseState: true,
282
+ run: jest.fn(),
283
+ };
284
+ const features = { unlocked: false };
285
+ const device = {
286
+ features,
287
+ commands: {
288
+ typedCall: jest.fn().mockResolvedValue({ message: { unlocked: false } }),
289
+ },
290
+ isProtocolV2: () => true,
291
+ isBootloader: () => false,
292
+ isRomloader: () => false,
293
+ updateProtocolV2Status: jest.fn(() => features),
294
+ unlockDevice: jest.fn(),
295
+ };
296
+
297
+ await expect(
298
+ runMethodWithUnlockPolicy(method as any, device as any, {
299
+ afterStatusBeforeUnlock: () => {
300
+ throw identityError;
301
+ },
302
+ })
303
+ ).rejects.toBe(identityError);
304
+
305
+ expect(device.unlockDevice).not.toHaveBeenCalled();
306
+ expect(method.run).not.toHaveBeenCalled();
44
307
  });
45
308
  });