@onekeyfe/hd-core 1.2.0-alpha.56 → 1.2.0-alpha.62

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 (262) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +0 -231
  2. package/__tests__/DeviceCommands.test.ts +0 -45
  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-state-contract.test.ts +0 -1
  9. package/__tests__/device-state-mapper.test.ts +1 -1
  10. package/__tests__/deviceSettings.test.ts +1 -1
  11. package/__tests__/firmware-update/check-all-firmware-release.test.ts +175 -0
  12. package/__tests__/firmware-update/firmware-artifact-source.test.ts +119 -0
  13. package/__tests__/firmware-update/firmware-host-binding.test.ts +70 -0
  14. package/__tests__/firmware-update/firmware-preparation-error.test.ts +27 -0
  15. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +200 -0
  16. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +13 -0
  17. package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +294 -0
  18. package/__tests__/firmware-update/firmware-update-plan.test.ts +593 -0
  19. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +213 -0
  20. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +59 -31
  21. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +58 -0
  22. package/__tests__/firmware-update/firmware-upload-source.test.ts +70 -0
  23. package/__tests__/get-device-state.test.ts +12 -132
  24. package/__tests__/homescreen.test.ts +1 -41
  25. package/__tests__/kaspaSignTransaction.test.ts +26 -3
  26. package/__tests__/logBlockEvent.test.ts +1 -1
  27. package/__tests__/method-protocol-support.test.ts +0 -19
  28. package/__tests__/open-wallet-session.test.ts +37 -568
  29. package/__tests__/protocol-v2-unlock-policy.test.ts +35 -201
  30. package/__tests__/protocol-v2.test.ts +1046 -1388
  31. package/__tests__/protocolV2FileWrite.test.ts +0 -39
  32. package/__tests__/protocolV2UiInteraction.test.ts +0 -63
  33. package/__tests__/public-pro2-api-boundary.test.ts +0 -1
  34. package/__tests__/search-devices.test.ts +3 -12
  35. package/dist/api/BaseMethod.d.ts +1 -3
  36. package/dist/api/BaseMethod.d.ts.map +1 -1
  37. package/dist/api/CheckAllFirmwareRelease.d.ts +1 -2
  38. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  39. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  40. package/dist/api/FirmwareUpdateV2.d.ts +11 -0
  41. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  42. package/dist/api/FirmwareUpdateV3.d.ts +7 -3
  43. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  44. package/dist/api/FirmwareUpdateV4.d.ts +25 -11
  45. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  46. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  47. package/dist/api/OpenWalletSession.d.ts.map +1 -1
  48. package/dist/api/SearchDevices.d.ts.map +1 -1
  49. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  50. package/dist/api/device/DeviceUnlock.d.ts +2 -2
  51. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  52. package/dist/api/device/DeviceUpdateBootloader.d.ts +5 -1
  53. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  54. package/dist/api/firmware/FirmwareArtifactSource.d.ts +25 -0
  55. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +1 -0
  56. package/dist/api/firmware/FirmwareHostBinding.d.ts +6 -0
  57. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -0
  58. package/dist/api/firmware/FirmwarePreparationError.d.ts +3 -0
  59. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +1 -0
  60. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +9 -0
  61. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  62. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +3 -0
  63. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +1 -0
  64. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +25 -0
  65. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -0
  66. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +32 -0
  67. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -0
  68. package/dist/api/firmware/getBinary.d.ts +7 -0
  69. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  70. package/dist/api/firmware/progressThrottle.d.ts +3 -0
  71. package/dist/api/firmware/progressThrottle.d.ts.map +1 -0
  72. package/dist/api/firmware/updateBootloader.d.ts +2 -0
  73. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  74. package/dist/api/firmware/uploadFirmware.d.ts +9 -1
  75. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  76. package/dist/api/helpers/protocolV2FileWrite.d.ts +0 -2
  77. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -1
  78. package/dist/api/index.d.ts +0 -2
  79. package/dist/api/index.d.ts.map +1 -1
  80. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  81. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
  82. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  83. package/dist/api/stellar/StellarSignTransaction.d.ts +1 -1
  84. package/dist/core/deviceEventRegistration.d.ts +0 -2
  85. package/dist/core/deviceEventRegistration.d.ts.map +1 -1
  86. package/dist/core/index.d.ts.map +1 -1
  87. package/dist/data-manager/DataManager.d.ts +2 -4
  88. package/dist/data-manager/DataManager.d.ts.map +1 -1
  89. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  90. package/dist/device/Device.d.ts +6 -29
  91. package/dist/device/Device.d.ts.map +1 -1
  92. package/dist/device/DeviceCommands.d.ts +4 -4
  93. package/dist/device/DeviceCommands.d.ts.map +1 -1
  94. package/dist/device/DevicePool.d.ts.map +1 -1
  95. package/dist/events/device.d.ts +0 -4
  96. package/dist/events/device.d.ts.map +1 -1
  97. package/dist/events/logBlockEvent.d.ts.map +1 -1
  98. package/dist/events/ui-promise.d.ts +2 -4
  99. package/dist/events/ui-promise.d.ts.map +1 -1
  100. package/dist/events/ui-request.d.ts +2 -31
  101. package/dist/events/ui-request.d.ts.map +1 -1
  102. package/dist/events/ui-response.d.ts +2 -10
  103. package/dist/events/ui-response.d.ts.map +1 -1
  104. package/dist/index.d.ts +231 -214
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +3530 -2634
  107. package/dist/inject.d.ts +1 -6
  108. package/dist/inject.d.ts.map +1 -1
  109. package/dist/lowLevelInject.d.ts.map +1 -1
  110. package/dist/protocols/protocol-v2/features.d.ts +4 -0
  111. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  112. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  113. package/dist/protocols/protocol-v2/lockedError.d.ts +2 -0
  114. package/dist/protocols/protocol-v2/lockedError.d.ts.map +1 -0
  115. package/dist/protocols/protocol-v2/uiInteraction.d.ts +4 -7
  116. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -1
  117. package/dist/protocols/protocol-v2/unlockPolicy.d.ts +3 -1
  118. package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -1
  119. package/dist/protocols/protocol-v2/unlockRetry.d.ts +10 -0
  120. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +1 -0
  121. package/dist/protocols/protocol-v2/walletSession.d.ts +1 -6
  122. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
  123. package/dist/topLevelInject.d.ts.map +1 -1
  124. package/dist/types/api/checkAllFirmwareRelease.d.ts +4 -2
  125. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  126. package/dist/types/api/deviceUnlock.d.ts +1 -5
  127. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  128. package/dist/types/api/deviceUpdateBootloader.d.ts +6 -0
  129. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  130. package/dist/types/api/export.d.ts +4 -2
  131. package/dist/types/api/export.d.ts.map +1 -1
  132. package/dist/types/api/firmwareUpdate.d.ts +70 -2
  133. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  134. package/dist/types/api/firmwareUpdateCapabilities.d.ts +9 -0
  135. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +1 -0
  136. package/dist/types/api/firmwareUpdatePlan.d.ts +28 -0
  137. package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -0
  138. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +42 -0
  139. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +1 -0
  140. package/dist/types/api/index.d.ts +10 -7
  141. package/dist/types/api/index.d.ts.map +1 -1
  142. package/dist/types/api/protocolV2.d.ts +0 -3
  143. package/dist/types/api/protocolV2.d.ts.map +1 -1
  144. package/dist/types/device.d.ts.map +1 -1
  145. package/dist/types/params.d.ts +0 -1
  146. package/dist/types/params.d.ts.map +1 -1
  147. package/dist/types/settings.d.ts +13 -22
  148. package/dist/types/settings.d.ts.map +1 -1
  149. package/dist/utils/deviceFeaturesCompat.d.ts +1 -0
  150. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -1
  151. package/dist/utils/deviceFeaturesUtils.d.ts +0 -4
  152. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  153. package/dist/utils/homescreen.d.ts +0 -4
  154. package/dist/utils/homescreen.d.ts.map +1 -1
  155. package/dist/utils/index.d.ts +1 -1
  156. package/dist/utils/index.d.ts.map +1 -1
  157. package/dist/utils/patch.d.ts +1 -1
  158. package/dist/utils/patch.d.ts.map +1 -1
  159. package/dist/utils/pro2Wallpaper.d.ts +0 -10
  160. package/dist/utils/pro2Wallpaper.d.ts.map +1 -1
  161. package/package.json +4 -4
  162. package/src/api/BaseMethod.ts +10 -8
  163. package/src/api/CheckAllFirmwareRelease.ts +57 -54
  164. package/src/api/FirmwareUpdate.ts +15 -7
  165. package/src/api/FirmwareUpdateV2.ts +316 -126
  166. package/src/api/FirmwareUpdateV3.ts +265 -63
  167. package/src/api/FirmwareUpdateV4.ts +975 -584
  168. package/src/api/GetPassphraseState.ts +1 -7
  169. package/src/api/OpenWalletSession.ts +17 -70
  170. package/src/api/SearchDevices.ts +1 -3
  171. package/src/api/allnetwork/AllNetworkGetAddress.ts +21 -21
  172. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +11 -34
  173. package/src/api/device/DeviceUnlock.ts +3 -8
  174. package/src/api/device/DeviceUpdateBootloader.ts +122 -6
  175. package/src/api/firmware/FirmwareArtifactSource.ts +278 -0
  176. package/src/api/firmware/FirmwareHostBinding.ts +100 -0
  177. package/src/api/firmware/FirmwarePreparationError.ts +12 -0
  178. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +83 -16
  179. package/src/api/firmware/FirmwareUpdateCapabilities.ts +9 -0
  180. package/src/api/firmware/FirmwareUpdatePlan.ts +772 -0
  181. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +415 -0
  182. package/src/api/firmware/progressThrottle.ts +44 -0
  183. package/src/api/firmware/updateBootloader.ts +19 -4
  184. package/src/api/firmware/uploadFirmware.ts +144 -39
  185. package/src/api/helpers/protocolV2FileWrite.ts +7 -27
  186. package/src/api/index.ts +0 -2
  187. package/src/api/kaspa/KaspaSignTransaction.ts +12 -1
  188. package/src/api/protocol-v2/ProtocolInfoRequest.ts +1 -3
  189. package/src/api/protocol-v2/helpers.ts +0 -1
  190. package/src/core/deviceEventRegistration.ts +0 -4
  191. package/src/core/index.ts +83 -167
  192. package/src/data/messages/messages-protocol-v2.json +0 -25
  193. package/src/data-manager/DataManager.ts +39 -71
  194. package/src/data-manager/connectSettings.ts +11 -0
  195. package/src/device/Device.ts +43 -259
  196. package/src/device/DeviceCommands.ts +1 -7
  197. package/src/device/DevicePool.ts +2 -7
  198. package/src/events/device.ts +0 -4
  199. package/src/events/logBlockEvent.ts +0 -1
  200. package/src/events/ui-promise.ts +2 -4
  201. package/src/events/ui-request.ts +2 -36
  202. package/src/events/ui-response.ts +2 -12
  203. package/src/index.ts +5 -0
  204. package/src/inject.ts +24 -60
  205. package/src/lowLevelInject.ts +8 -7
  206. package/src/protocols/protocol-v2/features.ts +7 -10
  207. package/src/protocols/protocol-v2/firmware.ts +0 -2
  208. package/src/protocols/protocol-v2/lockedError.ts +10 -0
  209. package/src/protocols/protocol-v2/uiInteraction.ts +6 -46
  210. package/src/protocols/protocol-v2/unlockPolicy.ts +105 -1
  211. package/src/protocols/protocol-v2/unlockRetry.ts +109 -0
  212. package/src/protocols/protocol-v2/walletSession.ts +36 -214
  213. package/src/topLevelInject.ts +8 -7
  214. package/src/types/api/checkAllFirmwareRelease.ts +4 -2
  215. package/src/types/api/deviceUnlock.ts +1 -12
  216. package/src/types/api/deviceUpdateBootloader.ts +6 -0
  217. package/src/types/api/export.ts +18 -1
  218. package/src/types/api/firmwareUpdate.ts +76 -3
  219. package/src/types/api/firmwareUpdateCapabilities.ts +9 -0
  220. package/src/types/api/firmwareUpdatePlan.ts +38 -0
  221. package/src/types/api/firmwareUpdatePreparedPlan.ts +53 -0
  222. package/src/types/api/index.ts +14 -13
  223. package/src/types/api/protocolV2.ts +0 -13
  224. package/src/types/device.ts +0 -3
  225. package/src/types/params.ts +1 -7
  226. package/src/types/settings.ts +13 -42
  227. package/src/utils/deviceFeaturesCompat.ts +6 -0
  228. package/src/utils/deviceFeaturesUtils.ts +0 -8
  229. package/src/utils/homescreen.ts +6 -32
  230. package/src/utils/index.ts +1 -6
  231. package/src/utils/pro2Wallpaper.ts +8 -35
  232. package/__tests__/deviceUploadNft.test.ts +0 -293
  233. package/__tests__/pro2Nft.test.ts +0 -108
  234. package/__tests__/protocol-binding.test.ts +0 -89
  235. package/__tests__/protocol-v2-resources.test.ts +0 -286
  236. package/__tests__/protocol-v2-ui-lifecycle.test.ts +0 -91
  237. package/__tests__/uiProgressThrottle.test.ts +0 -74
  238. package/__tests__/uiPromiseRegistry.test.ts +0 -86
  239. package/dist/api/DetectDeviceConnectProtocol.d.ts +0 -7
  240. package/dist/api/DetectDeviceConnectProtocol.d.ts.map +0 -1
  241. package/dist/api/protocol-v2/DeviceUploadNft.d.ts +0 -31
  242. package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +0 -1
  243. package/dist/core/uiPromiseRegistry.d.ts +0 -4
  244. package/dist/core/uiPromiseRegistry.d.ts.map +0 -1
  245. package/dist/protocols/protocol-v2/resources.d.ts +0 -30
  246. package/dist/protocols/protocol-v2/resources.d.ts.map +0 -1
  247. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +0 -22
  248. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +0 -1
  249. package/dist/types/api/detectDeviceConnectProtocol.d.ts +0 -4
  250. package/dist/types/api/detectDeviceConnectProtocol.d.ts.map +0 -1
  251. package/dist/utils/pro2Nft.d.ts +0 -31
  252. package/dist/utils/pro2Nft.d.ts.map +0 -1
  253. package/dist/utils/uiProgressThrottle.d.ts +0 -3
  254. package/dist/utils/uiProgressThrottle.d.ts.map +0 -1
  255. package/src/api/DetectDeviceConnectProtocol.ts +0 -18
  256. package/src/api/protocol-v2/DeviceUploadNft.ts +0 -189
  257. package/src/core/uiPromiseRegistry.ts +0 -41
  258. package/src/protocols/protocol-v2/resources.ts +0 -359
  259. package/src/protocols/protocol-v2/unlockPolicyRunner.ts +0 -118
  260. package/src/types/api/detectDeviceConnectProtocol.ts +0 -6
  261. package/src/utils/pro2Nft.ts +0 -142
  262. package/src/utils/uiProgressThrottle.ts +0 -63
@@ -1,211 +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 { 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';
6
6
 
7
7
  jest.mock('../src/data/config', () => ({
8
8
  DEFAULT_DOMAIN: 'https://example.com/',
9
9
  getSDKVersion: () => '0.0.0-test',
10
10
  }));
11
11
 
12
- describe('Protocol V2 unlock semantics', () => {
13
- test('wallet business methods inherit the wallet-session unlock requirement', () => {
14
- const method = new ConfluxSignMessageCIP23({
15
- id: 1,
16
- payload: { method: 'confluxSignMessageCIP23' },
17
- });
18
-
19
- expect(method.useDevicePassphraseState).toBe(true);
20
- expect(method.unlockPolicy).toBe('none');
21
- expect(method.getSupportedProtocols()).toContain('V2');
22
- });
23
-
24
- test('lock-free Protocol V2 controls explicitly opt out of wallet-session handling', () => {
25
- const method = new DeviceLock({
26
- id: 1,
27
- payload: { method: 'deviceLock' },
28
- });
29
-
30
- method.init();
31
-
32
- expect(method.useDevicePassphraseState).toBe(false);
33
- expect(method.unlockPolicy).toBe('none');
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
+ }
34
31
  });
35
32
 
36
- test('pre-unlocks an unregistered wallet business method', async () => {
37
- const features = { unlocked: false };
38
- const method = {
39
- name: 'newWalletBusinessMethod',
40
- unlockPolicy: 'none',
41
- useDevicePassphraseState: true,
42
- run: jest.fn().mockResolvedValue({ message: 'ok' }),
43
- };
44
- const device = {
45
- features,
46
- commands: {
47
- typedCall: jest.fn().mockResolvedValue({ message: { unlocked: false } }),
48
- },
49
- isProtocolV2: () => true,
50
- isBootloader: () => false,
51
- isRomloader: () => false,
52
- updateProtocolV2Status: jest.fn(() => features),
53
- unlockDevice: jest.fn().mockImplementation(() => {
54
- features.unlocked = true;
55
- return Promise.resolve(features);
56
- }),
57
- };
58
-
59
- await expect(runMethodWithUnlockPolicy(method as any, device as any)).resolves.toEqual({
60
- message: 'ok',
61
- });
62
- expect(device.unlockDevice).toHaveBeenCalledTimes(1);
63
- expect(method.run).toHaveBeenCalledTimes(1);
64
- });
65
-
66
- test('pre-unlocks a locked standard wallet before wallet-session preparation', async () => {
67
- const calls: string[] = [];
68
- const features = {
69
- unlocked: false,
70
- passphraseProtection: true,
71
- };
72
- const method = {
73
- name: 'btcGetPublicKey',
74
- unlockPolicy: 'none',
75
- useDevicePassphraseState: true,
76
- payload: { useEmptyPassphrase: true },
77
- run: jest.fn().mockImplementation(() => {
78
- calls.push('run');
79
- return Promise.resolve({ message: 'ok' });
80
- }),
81
- };
82
- const device = {
83
- features,
84
- commands: {
85
- typedCall: jest.fn().mockImplementation(() => {
86
- calls.push('status');
87
- return Promise.resolve({
88
- message: {
89
- unlocked: false,
90
- passphraseProtection: true,
91
- },
92
- });
93
- }),
94
- },
95
- isProtocolV2: () => true,
96
- isBootloader: () => false,
97
- isRomloader: () => false,
98
- updateProtocolV2Status: jest.fn(() => features),
99
- unlockDevice: jest.fn().mockImplementation(() => {
100
- calls.push('pre-unlock');
101
- features.unlocked = true;
102
- return Promise.resolve(features);
103
- }),
104
- };
105
-
106
- await expect(
107
- runMethodWithUnlockPolicy(method as any, device as any, {
108
- prepare: () => {
109
- calls.push('prepare');
110
- expect(features.unlocked).toBe(true);
111
- return Promise.resolve();
112
- },
113
- })
114
- ).resolves.toEqual({ message: 'ok' });
115
-
116
- expect(calls).toEqual(['status', 'pre-unlock', 'prepare', 'run']);
117
- expect(device.unlockDevice).toHaveBeenCalledTimes(1);
118
- expect(device.unlockDevice).toHaveBeenCalledWith(DeviceSessionPinType.Main, expect.any(Object));
119
- });
120
-
121
- test('reuses a Main PIN selected by pre-unlock when locked status hides passphrase state', async () => {
122
- const calls: string[] = [];
123
- const features: {
124
- unlocked: boolean;
125
- passphraseProtection?: boolean;
126
- unlockedAttachPin?: boolean;
127
- } = {
128
- unlocked: false,
129
- };
130
- const method: any = {
131
- name: 'btcGetPublicKey',
132
- unlockPolicy: 'none',
133
- useDevicePassphraseState: true,
134
- payload: { useEmptyPassphrase: true },
135
- run: jest.fn().mockImplementation(() => {
136
- calls.push('run');
137
- return Promise.resolve({ message: 'ok' });
138
- }),
139
- };
140
- const device = {
141
- features,
142
- commands: {
143
- typedCall: jest.fn().mockImplementation(() => {
144
- calls.push('status');
145
- return Promise.resolve({
146
- message: {
147
- unlocked: false,
148
- },
149
- });
150
- }),
151
- },
152
- isProtocolV2: () => true,
153
- isBootloader: () => false,
154
- isRomloader: () => false,
155
- updateProtocolV2Status: jest.fn(() => features),
156
- unlockDevice: jest.fn().mockImplementation(() => {
157
- calls.push('main-pin');
158
- features.unlocked = true;
159
- features.passphraseProtection = true;
160
- features.unlockedAttachPin = false;
161
- return Promise.resolve(features);
162
- }),
163
- };
164
-
165
- await expect(
166
- runMethodWithUnlockPolicy(method, device as any, {
167
- prepare: async () => {
168
- if (!(features.unlocked && features.unlockedAttachPin === false)) {
169
- await device.unlockDevice();
170
- }
171
- },
172
- })
173
- ).resolves.toEqual({ message: 'ok' });
174
-
175
- expect(calls).toEqual(['status', 'main-pin', 'run']);
176
- expect(device.unlockDevice).toHaveBeenCalledTimes(1);
177
- });
178
-
179
- test('runs fresh-status validation before starting unlock', async () => {
180
- const identityError = new Error('Unexpected device');
181
- const method = {
182
- name: 'walletBusinessMethod',
183
- unlockPolicy: 'none',
184
- useDevicePassphraseState: true,
185
- run: jest.fn(),
186
- };
187
- const features = { unlocked: false };
188
- const device = {
189
- features,
190
- commands: {
191
- typedCall: jest.fn().mockResolvedValue({ message: { unlocked: false } }),
192
- },
193
- isProtocolV2: () => true,
194
- isBootloader: () => false,
195
- isRomloader: () => false,
196
- updateProtocolV2Status: jest.fn(() => features),
197
- unlockDevice: jest.fn(),
198
- };
199
-
200
- await expect(
201
- runMethodWithUnlockPolicy(method as any, device as any, {
202
- afterStatusBeforeUnlock: () => {
203
- throw identityError;
204
- },
205
- })
206
- ).rejects.toBe(identityError);
207
-
208
- expect(device.unlockDevice).not.toHaveBeenCalled();
209
- expect(method.run).not.toHaveBeenCalled();
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');
210
44
  });
211
45
  });