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

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 (315) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +0 -313
  2. package/__tests__/DeviceCommands.test.ts +13 -59
  3. package/__tests__/DeviceEventRegistration.test.ts +0 -6
  4. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +3 -198
  5. package/__tests__/connectSettings.test.ts +47 -5
  6. package/__tests__/device-initialize-timeout.test.ts +56 -0
  7. package/__tests__/device-lifecycle-events.test.ts +3 -105
  8. package/__tests__/device-pool-state.test.ts +0 -22
  9. package/__tests__/device-settings.test.ts +18 -39
  10. package/__tests__/device-state-contract.test.ts +0 -1
  11. package/__tests__/device-state-mapper.test.ts +1 -13
  12. package/__tests__/device-utils.test.ts +1 -48
  13. package/__tests__/deviceSettings.test.ts +1 -11
  14. package/__tests__/firmware-update/check-all-firmware-release.test.ts +175 -0
  15. package/__tests__/firmware-update/device-update-bootloader.test.ts +87 -0
  16. package/__tests__/firmware-update/firmware-artifact-source.test.ts +119 -0
  17. package/__tests__/firmware-update/firmware-host-binding.test.ts +70 -0
  18. package/__tests__/firmware-update/firmware-preparation-error.test.ts +27 -0
  19. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +200 -0
  20. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +13 -0
  21. package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +394 -0
  22. package/__tests__/firmware-update/firmware-update-plan.test.ts +593 -0
  23. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +231 -0
  24. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +59 -31
  25. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +58 -0
  26. package/__tests__/firmware-update/firmware-upload-source.test.ts +70 -0
  27. package/__tests__/get-device-state.test.ts +12 -132
  28. package/__tests__/homescreen.test.ts +1 -41
  29. package/__tests__/kaspa-use-tweak-pro2.test.ts +2 -2
  30. package/__tests__/kaspaSignTransaction.test.ts +26 -3
  31. package/__tests__/logBlockEvent.test.ts +1 -1
  32. package/__tests__/method-protocol-support.test.ts +0 -19
  33. package/__tests__/open-wallet-session.test.ts +37 -568
  34. package/__tests__/protocol-v2-unlock-policy.test.ts +37 -300
  35. package/__tests__/protocol-v2.test.ts +1153 -1458
  36. package/__tests__/protocolV2FileWrite.test.ts +0 -152
  37. package/__tests__/protocolV2UiInteraction.test.ts +0 -63
  38. package/__tests__/public-pro2-api-boundary.test.ts +0 -1
  39. package/__tests__/search-devices.test.ts +3 -12
  40. package/__tests__/tron-sign-message-init.test.ts +2 -2
  41. package/dist/api/BaseMethod.d.ts +1 -3
  42. package/dist/api/BaseMethod.d.ts.map +1 -1
  43. package/dist/api/CheckAllFirmwareRelease.d.ts +1 -2
  44. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  45. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  46. package/dist/api/FirmwareUpdateV2.d.ts +10 -0
  47. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  48. package/dist/api/FirmwareUpdateV3.d.ts +7 -3
  49. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  50. package/dist/api/FirmwareUpdateV4.d.ts +27 -13
  51. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  52. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  53. package/dist/api/OpenWalletSession.d.ts.map +1 -1
  54. package/dist/api/SearchDevices.d.ts.map +1 -1
  55. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  56. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  57. package/dist/api/device/DeviceUnlock.d.ts +2 -2
  58. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  59. package/dist/api/device/DeviceUpdateBootloader.d.ts +5 -1
  60. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  61. package/dist/api/firmware/FirmwareArtifactSource.d.ts +25 -0
  62. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +1 -0
  63. package/dist/api/firmware/FirmwareHostBinding.d.ts +6 -0
  64. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -0
  65. package/dist/api/firmware/FirmwarePreparationError.d.ts +3 -0
  66. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +1 -0
  67. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +11 -4
  68. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  69. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +3 -0
  70. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +1 -0
  71. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +25 -0
  72. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -0
  73. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +32 -0
  74. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -0
  75. package/dist/api/firmware/getBinary.d.ts +7 -0
  76. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  77. package/dist/api/firmware/progressThrottle.d.ts +3 -0
  78. package/dist/api/firmware/progressThrottle.d.ts.map +1 -0
  79. package/dist/api/firmware/updateBootloader.d.ts +2 -0
  80. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  81. package/dist/api/firmware/uploadFirmware.d.ts +9 -1
  82. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  83. package/dist/api/helpers/protocolV2FileWrite.d.ts +0 -9
  84. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -1
  85. package/dist/api/index.d.ts +0 -2
  86. package/dist/api/index.d.ts.map +1 -1
  87. package/dist/api/kaspa/KaspaGetAddress.d.ts +1 -1
  88. package/dist/api/kaspa/KaspaSignTransaction.d.ts +1 -1
  89. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  90. package/dist/api/polkadot/PolkadotGetAddress.d.ts +1 -1
  91. package/dist/api/polkadot/networks.d.ts +1 -1
  92. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
  93. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  94. package/dist/api/solana/SolSignMessage.d.ts +1 -1
  95. package/dist/api/solana/SolSignOffchainMessage.d.ts +1 -1
  96. package/dist/api/solana/SolSignTransaction.d.ts +2 -2
  97. package/dist/api/stellar/StellarSignTransaction.d.ts +1 -1
  98. package/dist/api/sui/SuiGetAddress.d.ts +1 -1
  99. package/dist/api/sui/SuiGetPublicKey.d.ts +1 -1
  100. package/dist/api/sui/SuiSignMessage.d.ts +1 -1
  101. package/dist/api/sui/SuiSignTransaction.d.ts +1 -1
  102. package/dist/api/ton/TonGetAddress.d.ts +1 -1
  103. package/dist/api/ton/TonSignMessage.d.ts +1 -1
  104. package/dist/api/ton/TonSignProof.d.ts +1 -1
  105. package/dist/api/tron/TronSignMessage.d.ts +2 -2
  106. package/dist/api/tron/TronSignTransaction.d.ts +1 -1
  107. package/dist/core/deviceEventRegistration.d.ts +0 -2
  108. package/dist/core/deviceEventRegistration.d.ts.map +1 -1
  109. package/dist/core/index.d.ts.map +1 -1
  110. package/dist/data-manager/DataManager.d.ts +4 -9
  111. package/dist/data-manager/DataManager.d.ts.map +1 -1
  112. package/dist/data-manager/TransportManager.d.ts.map +1 -1
  113. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  114. package/dist/device/Device.d.ts +6 -29
  115. package/dist/device/Device.d.ts.map +1 -1
  116. package/dist/device/DeviceCommands.d.ts +4 -4
  117. package/dist/device/DeviceCommands.d.ts.map +1 -1
  118. package/dist/device/DeviceConnector.d.ts +1 -2
  119. package/dist/device/DeviceConnector.d.ts.map +1 -1
  120. package/dist/device/DevicePool.d.ts.map +1 -1
  121. package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts.map +1 -1
  122. package/dist/events/device.d.ts +0 -4
  123. package/dist/events/device.d.ts.map +1 -1
  124. package/dist/events/logBlockEvent.d.ts.map +1 -1
  125. package/dist/events/ui-promise.d.ts +2 -4
  126. package/dist/events/ui-promise.d.ts.map +1 -1
  127. package/dist/events/ui-request.d.ts +2 -31
  128. package/dist/events/ui-request.d.ts.map +1 -1
  129. package/dist/events/ui-response.d.ts +2 -10
  130. package/dist/events/ui-response.d.ts.map +1 -1
  131. package/dist/index.d.ts +247 -243
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +3773 -3054
  134. package/dist/inject.d.ts +1 -6
  135. package/dist/inject.d.ts.map +1 -1
  136. package/dist/lowLevelInject.d.ts.map +1 -1
  137. package/dist/protocols/protocol-v2/features.d.ts +4 -0
  138. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  139. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  140. package/dist/protocols/protocol-v2/lockedError.d.ts +2 -0
  141. package/dist/protocols/protocol-v2/lockedError.d.ts.map +1 -0
  142. package/dist/protocols/protocol-v2/uiInteraction.d.ts +4 -7
  143. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -1
  144. package/dist/protocols/protocol-v2/unlockPolicy.d.ts +3 -1
  145. package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -1
  146. package/dist/protocols/protocol-v2/unlockRetry.d.ts +10 -0
  147. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +1 -0
  148. package/dist/protocols/protocol-v2/walletSession.d.ts +1 -6
  149. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
  150. package/dist/topLevelInject.d.ts.map +1 -1
  151. package/dist/types/api/checkAllFirmwareRelease.d.ts +5 -3
  152. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  153. package/dist/types/api/deviceUnlock.d.ts +1 -5
  154. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  155. package/dist/types/api/deviceUpdateBootloader.d.ts +6 -0
  156. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  157. package/dist/types/api/export.d.ts +4 -2
  158. package/dist/types/api/export.d.ts.map +1 -1
  159. package/dist/types/api/firmwareUpdate.d.ts +70 -4
  160. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  161. package/dist/types/api/firmwareUpdateCapabilities.d.ts +9 -0
  162. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +1 -0
  163. package/dist/types/api/firmwareUpdatePlan.d.ts +28 -0
  164. package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -0
  165. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +42 -0
  166. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +1 -0
  167. package/dist/types/api/index.d.ts +10 -7
  168. package/dist/types/api/index.d.ts.map +1 -1
  169. package/dist/types/api/protocolV2.d.ts +0 -3
  170. package/dist/types/api/protocolV2.d.ts.map +1 -1
  171. package/dist/types/device.d.ts +2 -2
  172. package/dist/types/device.d.ts.map +1 -1
  173. package/dist/types/params.d.ts +0 -1
  174. package/dist/types/params.d.ts.map +1 -1
  175. package/dist/types/settings.d.ts +21 -38
  176. package/dist/types/settings.d.ts.map +1 -1
  177. package/dist/utils/deviceFeaturesCompat.d.ts +1 -0
  178. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -1
  179. package/dist/utils/deviceFeaturesUtils.d.ts +0 -4
  180. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  181. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  182. package/dist/utils/deviceSettings.d.ts.map +1 -1
  183. package/dist/utils/homescreen.d.ts +0 -4
  184. package/dist/utils/homescreen.d.ts.map +1 -1
  185. package/dist/utils/index.d.ts +1 -1
  186. package/dist/utils/index.d.ts.map +1 -1
  187. package/dist/utils/patch.d.ts +1 -1
  188. package/dist/utils/patch.d.ts.map +1 -1
  189. package/dist/utils/pro2Wallpaper.d.ts +0 -10
  190. package/dist/utils/pro2Wallpaper.d.ts.map +1 -1
  191. package/package.json +4 -4
  192. package/src/api/BaseMethod.ts +10 -8
  193. package/src/api/CheckAllFirmwareRelease.ts +60 -59
  194. package/src/api/FirmwareUpdate.ts +15 -7
  195. package/src/api/FirmwareUpdateV2.ts +298 -126
  196. package/src/api/FirmwareUpdateV3.ts +265 -63
  197. package/src/api/FirmwareUpdateV4.ts +1017 -602
  198. package/src/api/GetPassphraseState.ts +1 -7
  199. package/src/api/OpenWalletSession.ts +17 -71
  200. package/src/api/SearchDevices.ts +1 -3
  201. package/src/api/allnetwork/AllNetworkGetAddress.ts +21 -21
  202. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +11 -36
  203. package/src/api/device/DeviceSettings.ts +4 -5
  204. package/src/api/device/DeviceUnlock.ts +3 -8
  205. package/src/api/device/DeviceUpdateBootloader.ts +125 -6
  206. package/src/api/firmware/FirmwareArtifactSource.ts +278 -0
  207. package/src/api/firmware/FirmwareHostBinding.ts +100 -0
  208. package/src/api/firmware/FirmwarePreparationError.ts +12 -0
  209. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +83 -27
  210. package/src/api/firmware/FirmwareUpdateCapabilities.ts +9 -0
  211. package/src/api/firmware/FirmwareUpdatePlan.ts +772 -0
  212. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +449 -0
  213. package/src/api/firmware/progressThrottle.ts +44 -0
  214. package/src/api/firmware/updateBootloader.ts +19 -4
  215. package/src/api/firmware/uploadFirmware.ts +144 -39
  216. package/src/api/helpers/protocolV2FileWrite.ts +63 -202
  217. package/src/api/index.ts +0 -2
  218. package/src/api/kaspa/KaspaGetAddress.ts +1 -1
  219. package/src/api/kaspa/KaspaSignTransaction.ts +13 -2
  220. package/src/api/polkadot/networks.ts +3 -3
  221. package/src/api/protocol-v2/ProtocolInfoRequest.ts +1 -3
  222. package/src/api/protocol-v2/helpers.ts +1 -1
  223. package/src/api/solana/SolSignMessage.ts +1 -1
  224. package/src/api/solana/SolSignOffchainMessage.ts +1 -1
  225. package/src/api/solana/SolSignTransaction.ts +2 -2
  226. package/src/api/sui/SuiGetAddress.ts +1 -1
  227. package/src/api/sui/SuiGetPublicKey.ts +1 -1
  228. package/src/api/sui/SuiSignMessage.ts +1 -1
  229. package/src/api/sui/SuiSignTransaction.ts +1 -1
  230. package/src/api/ton/TonGetAddress.ts +1 -1
  231. package/src/api/ton/TonSignMessage.ts +1 -1
  232. package/src/api/ton/TonSignProof.ts +1 -1
  233. package/src/api/tron/TronSignMessage.ts +2 -2
  234. package/src/api/tron/TronSignTransaction.ts +1 -1
  235. package/src/core/deviceEventRegistration.ts +0 -4
  236. package/src/core/index.ts +111 -213
  237. package/src/data/messages/messages-protocol-v2.json +0 -25
  238. package/src/data-manager/DataManager.ts +41 -113
  239. package/src/data-manager/TransportManager.ts +0 -6
  240. package/src/data-manager/connectSettings.ts +11 -0
  241. package/src/device/Device.ts +49 -274
  242. package/src/device/DeviceCommands.ts +4 -31
  243. package/src/device/DeviceConnector.ts +13 -33
  244. package/src/device/DevicePool.ts +7 -21
  245. package/src/deviceProfile/buildDeviceFeatures.ts +2 -2
  246. package/src/deviceProfile/protocolV2DeviceIdentity.ts +0 -3
  247. package/src/events/device.ts +0 -4
  248. package/src/events/logBlockEvent.ts +0 -1
  249. package/src/events/ui-promise.ts +2 -4
  250. package/src/events/ui-request.ts +2 -36
  251. package/src/events/ui-response.ts +2 -12
  252. package/src/index.ts +5 -0
  253. package/src/inject.ts +24 -60
  254. package/src/lowLevelInject.ts +8 -7
  255. package/src/protocols/protocol-v2/features.ts +7 -10
  256. package/src/protocols/protocol-v2/firmware.ts +0 -2
  257. package/src/protocols/protocol-v2/lockedError.ts +10 -0
  258. package/src/protocols/protocol-v2/uiInteraction.ts +6 -46
  259. package/src/protocols/protocol-v2/unlockPolicy.ts +105 -1
  260. package/src/protocols/protocol-v2/unlockRetry.ts +109 -0
  261. package/src/protocols/protocol-v2/walletSession.ts +36 -214
  262. package/src/topLevelInject.ts +8 -7
  263. package/src/types/api/checkAllFirmwareRelease.ts +5 -3
  264. package/src/types/api/deviceUnlock.ts +1 -12
  265. package/src/types/api/deviceUpdateBootloader.ts +6 -0
  266. package/src/types/api/export.ts +18 -1
  267. package/src/types/api/firmwareUpdate.ts +78 -6
  268. package/src/types/api/firmwareUpdateCapabilities.ts +9 -0
  269. package/src/types/api/firmwareUpdatePlan.ts +38 -0
  270. package/src/types/api/firmwareUpdatePreparedPlan.ts +53 -0
  271. package/src/types/api/index.ts +14 -13
  272. package/src/types/api/protocolV2.ts +0 -13
  273. package/src/types/device.ts +3 -15
  274. package/src/types/params.ts +1 -7
  275. package/src/types/settings.ts +22 -60
  276. package/src/utils/deviceFeaturesCompat.ts +6 -5
  277. package/src/utils/deviceFeaturesUtils.ts +3 -14
  278. package/src/utils/deviceInfoUtils.ts +0 -2
  279. package/src/utils/deviceSettings.ts +0 -3
  280. package/src/utils/homescreen.ts +6 -32
  281. package/src/utils/index.ts +1 -6
  282. package/src/utils/pro2Wallpaper.ts +8 -35
  283. package/__tests__/core-initialization.test.ts +0 -23
  284. package/__tests__/device-connector-protocol.test.ts +0 -81
  285. package/__tests__/deviceUploadNft.test.ts +0 -316
  286. package/__tests__/pro2Nft.test.ts +0 -108
  287. package/__tests__/protocol-binding.test.ts +0 -89
  288. package/__tests__/protocol-v2-resources.test.ts +0 -340
  289. package/__tests__/protocol-v2-ui-lifecycle.test.ts +0 -91
  290. package/__tests__/uiProgressThrottle.test.ts +0 -74
  291. package/__tests__/uiPromiseRegistry.test.ts +0 -115
  292. package/dist/api/DetectDeviceConnectProtocol.d.ts +0 -7
  293. package/dist/api/DetectDeviceConnectProtocol.d.ts.map +0 -1
  294. package/dist/api/protocol-v2/DeviceUploadNft.d.ts +0 -31
  295. package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +0 -1
  296. package/dist/core/uiPromiseRegistry.d.ts +0 -6
  297. package/dist/core/uiPromiseRegistry.d.ts.map +0 -1
  298. package/dist/protocols/protocol-v2/resources.d.ts +0 -30
  299. package/dist/protocols/protocol-v2/resources.d.ts.map +0 -1
  300. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +0 -22
  301. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +0 -1
  302. package/dist/types/api/detectDeviceConnectProtocol.d.ts +0 -4
  303. package/dist/types/api/detectDeviceConnectProtocol.d.ts.map +0 -1
  304. package/dist/utils/pro2Nft.d.ts +0 -31
  305. package/dist/utils/pro2Nft.d.ts.map +0 -1
  306. package/dist/utils/uiProgressThrottle.d.ts +0 -3
  307. package/dist/utils/uiProgressThrottle.d.ts.map +0 -1
  308. package/src/api/DetectDeviceConnectProtocol.ts +0 -18
  309. package/src/api/protocol-v2/DeviceUploadNft.ts +0 -197
  310. package/src/core/uiPromiseRegistry.ts +0 -63
  311. package/src/protocols/protocol-v2/resources.ts +0 -390
  312. package/src/protocols/protocol-v2/unlockPolicyRunner.ts +0 -131
  313. package/src/types/api/detectDeviceConnectProtocol.ts +0 -6
  314. package/src/utils/pro2Nft.ts +0 -142
  315. package/src/utils/uiProgressThrottle.ts +0 -63
@@ -1,308 +1,45 @@
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';
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';
7
6
 
8
7
  jest.mock('../src/data/config', () => ({
9
8
  DEFAULT_DOMAIN: 'https://example.com/',
10
9
  getSDKVersion: () => '0.0.0-test',
11
10
  }));
12
11
 
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();
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');
307
44
  });
308
45
  });