@sidhujag/sysweb3-keyring 1.0.544 → 1.0.547

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 (212) hide show
  1. package/coverage/clover.xml +2875 -0
  2. package/coverage/coverage-final.json +29468 -0
  3. package/coverage/lcov-report/base.css +354 -0
  4. package/coverage/lcov-report/block-navigation.js +85 -0
  5. package/coverage/lcov-report/favicon.png +0 -0
  6. package/coverage/lcov-report/index.html +320 -0
  7. package/coverage/lcov-report/prettify.css +101 -0
  8. package/coverage/lcov-report/prettify.js +1008 -0
  9. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  10. package/coverage/lcov-report/sorter.js +191 -0
  11. package/coverage/lcov-report/src/index.html +276 -0
  12. package/coverage/lcov-report/src/index.ts.html +114 -0
  13. package/coverage/lcov-report/src/initial-state.ts.html +558 -0
  14. package/coverage/lcov-report/src/keyring-manager.ts.html +6279 -0
  15. package/coverage/lcov-report/src/ledger/bitcoin_client/index.html +178 -0
  16. package/coverage/lcov-report/src/ledger/bitcoin_client/index.ts.html +144 -0
  17. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/appClient.ts.html +1560 -0
  18. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/bip32.ts.html +276 -0
  19. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/buffertools.ts.html +495 -0
  20. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/clientCommands.ts.html +1138 -0
  21. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/index.html +363 -0
  22. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts.html +289 -0
  23. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkle.ts.html +486 -0
  24. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkleMap.ts.html +240 -0
  25. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/policy.ts.html +342 -0
  26. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/psbtv2.ts.html +2388 -0
  27. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/varint.ts.html +453 -0
  28. package/coverage/lcov-report/src/ledger/consts.ts.html +177 -0
  29. package/coverage/lcov-report/src/ledger/index.html +216 -0
  30. package/coverage/lcov-report/src/ledger/index.ts.html +1371 -0
  31. package/coverage/lcov-report/src/ledger/utils.ts.html +102 -0
  32. package/coverage/lcov-report/src/signers.ts.html +591 -0
  33. package/coverage/lcov-report/src/storage.ts.html +198 -0
  34. package/coverage/lcov-report/src/transactions/ethereum.ts.html +5826 -0
  35. package/coverage/lcov-report/src/transactions/index.html +216 -0
  36. package/coverage/lcov-report/src/transactions/index.ts.html +93 -0
  37. package/coverage/lcov-report/src/transactions/syscoin.ts.html +1521 -0
  38. package/coverage/lcov-report/src/trezor/index.html +176 -0
  39. package/coverage/lcov-report/src/trezor/index.ts.html +2655 -0
  40. package/coverage/lcov-report/src/types.ts.html +1443 -0
  41. package/coverage/lcov-report/src/utils/derivation-paths.ts.html +486 -0
  42. package/coverage/lcov-report/src/utils/index.html +196 -0
  43. package/coverage/lcov-report/src/utils/psbt.ts.html +159 -0
  44. package/coverage/lcov-report/test/helpers/constants.ts.html +627 -0
  45. package/coverage/lcov-report/test/helpers/index.html +176 -0
  46. package/coverage/lcov.info +4832 -0
  47. package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/appClient.js +1 -124
  48. package/dist/cjs/ledger/bitcoin_client/lib/appClient.js.map +1 -0
  49. package/{cjs → dist/cjs}/transactions/ethereum.js +24 -11
  50. package/dist/cjs/transactions/ethereum.js.map +1 -0
  51. package/dist/package.json +50 -0
  52. package/{types → dist/types}/ledger/bitcoin_client/lib/appClient.d.ts +0 -6
  53. package/examples/basic-usage.js +140 -0
  54. package/jest.config.js +32 -0
  55. package/package.json +31 -13
  56. package/readme.md +201 -0
  57. package/src/declare.d.ts +7 -0
  58. package/src/errorUtils.ts +83 -0
  59. package/src/hardware-wallet-manager.ts +655 -0
  60. package/src/index.ts +12 -0
  61. package/src/initial-state.ts +108 -0
  62. package/src/keyring-manager.ts +2698 -0
  63. package/src/ledger/bitcoin_client/index.ts +19 -0
  64. package/src/ledger/bitcoin_client/lib/appClient.ts +405 -0
  65. package/src/ledger/bitcoin_client/lib/bip32.ts +61 -0
  66. package/src/ledger/bitcoin_client/lib/buffertools.ts +134 -0
  67. package/src/ledger/bitcoin_client/lib/clientCommands.ts +356 -0
  68. package/src/ledger/bitcoin_client/lib/constants.ts +12 -0
  69. package/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts +65 -0
  70. package/src/ledger/bitcoin_client/lib/merkle.ts +136 -0
  71. package/src/ledger/bitcoin_client/lib/merkleMap.ts +49 -0
  72. package/src/ledger/bitcoin_client/lib/policy.ts +91 -0
  73. package/src/ledger/bitcoin_client/lib/psbtv2.ts +768 -0
  74. package/src/ledger/bitcoin_client/lib/varint.ts +120 -0
  75. package/src/ledger/consts.ts +3 -0
  76. package/src/ledger/index.ts +685 -0
  77. package/src/ledger/types.ts +74 -0
  78. package/src/network-utils.ts +99 -0
  79. package/src/providers.ts +345 -0
  80. package/src/signers.ts +158 -0
  81. package/src/storage.ts +63 -0
  82. package/src/transactions/__tests__/integration.test.ts +303 -0
  83. package/src/transactions/__tests__/syscoin.test.ts +409 -0
  84. package/src/transactions/ethereum.ts +2503 -0
  85. package/src/transactions/index.ts +2 -0
  86. package/src/transactions/syscoin.ts +542 -0
  87. package/src/trezor/index.ts +1050 -0
  88. package/src/types.ts +366 -0
  89. package/src/utils/derivation-paths.ts +133 -0
  90. package/src/utils/psbt.ts +24 -0
  91. package/src/utils.ts +191 -0
  92. package/test/README.md +158 -0
  93. package/test/__mocks__/ledger-mock.js +20 -0
  94. package/test/__mocks__/trezor-mock.js +75 -0
  95. package/test/cleanup-summary.md +167 -0
  96. package/test/helpers/README.md +78 -0
  97. package/test/helpers/constants.ts +79 -0
  98. package/test/helpers/setup.ts +714 -0
  99. package/test/integration/import-validation.spec.ts +588 -0
  100. package/test/unit/hardware/ledger.spec.ts +869 -0
  101. package/test/unit/hardware/trezor.spec.ts +828 -0
  102. package/test/unit/keyring-manager/account-management.spec.ts +970 -0
  103. package/test/unit/keyring-manager/import-watchonly.spec.ts +181 -0
  104. package/test/unit/keyring-manager/import-wif.spec.ts +126 -0
  105. package/test/unit/keyring-manager/initialization.spec.ts +782 -0
  106. package/test/unit/keyring-manager/key-derivation.spec.ts +996 -0
  107. package/test/unit/keyring-manager/security.spec.ts +505 -0
  108. package/test/unit/keyring-manager/state-management.spec.ts +375 -0
  109. package/test/unit/network/network-management.spec.ts +372 -0
  110. package/test/unit/transactions/ethereum-transactions.spec.ts +382 -0
  111. package/test/unit/transactions/syscoin-transactions.spec.ts +615 -0
  112. package/tsconfig.json +14 -0
  113. package/cjs/ledger/bitcoin_client/lib/appClient.js.map +0 -1
  114. package/cjs/transactions/ethereum.js.map +0 -1
  115. /package/{README.md → dist/README.md} +0 -0
  116. /package/{cjs → dist/cjs}/errorUtils.js +0 -0
  117. /package/{cjs → dist/cjs}/errorUtils.js.map +0 -0
  118. /package/{cjs → dist/cjs}/hardware-wallet-manager.js +0 -0
  119. /package/{cjs → dist/cjs}/hardware-wallet-manager.js.map +0 -0
  120. /package/{cjs → dist/cjs}/index.js +0 -0
  121. /package/{cjs → dist/cjs}/index.js.map +0 -0
  122. /package/{cjs → dist/cjs}/initial-state.js +0 -0
  123. /package/{cjs → dist/cjs}/initial-state.js.map +0 -0
  124. /package/{cjs → dist/cjs}/keyring-manager.js +0 -0
  125. /package/{cjs → dist/cjs}/keyring-manager.js.map +0 -0
  126. /package/{cjs → dist/cjs}/ledger/bitcoin_client/index.js +0 -0
  127. /package/{cjs → dist/cjs}/ledger/bitcoin_client/index.js.map +0 -0
  128. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/bip32.js +0 -0
  129. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/bip32.js.map +0 -0
  130. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/buffertools.js +0 -0
  131. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/buffertools.js.map +0 -0
  132. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/clientCommands.js +0 -0
  133. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/clientCommands.js.map +0 -0
  134. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/constants.js +0 -0
  135. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/constants.js.map +0 -0
  136. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js +0 -0
  137. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js.map +0 -0
  138. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkle.js +0 -0
  139. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkle.js.map +0 -0
  140. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkleMap.js +0 -0
  141. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkleMap.js.map +0 -0
  142. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/policy.js +0 -0
  143. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/policy.js.map +0 -0
  144. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/psbtv2.js +0 -0
  145. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/psbtv2.js.map +0 -0
  146. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/varint.js +0 -0
  147. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/varint.js.map +0 -0
  148. /package/{cjs → dist/cjs}/ledger/consts.js +0 -0
  149. /package/{cjs → dist/cjs}/ledger/consts.js.map +0 -0
  150. /package/{cjs → dist/cjs}/ledger/index.js +0 -0
  151. /package/{cjs → dist/cjs}/ledger/index.js.map +0 -0
  152. /package/{cjs → dist/cjs}/ledger/types.js +0 -0
  153. /package/{cjs → dist/cjs}/ledger/types.js.map +0 -0
  154. /package/{cjs → dist/cjs}/network-utils.js +0 -0
  155. /package/{cjs → dist/cjs}/network-utils.js.map +0 -0
  156. /package/{cjs → dist/cjs}/providers.js +0 -0
  157. /package/{cjs → dist/cjs}/providers.js.map +0 -0
  158. /package/{cjs → dist/cjs}/signers.js +0 -0
  159. /package/{cjs → dist/cjs}/signers.js.map +0 -0
  160. /package/{cjs → dist/cjs}/storage.js +0 -0
  161. /package/{cjs → dist/cjs}/storage.js.map +0 -0
  162. /package/{cjs → dist/cjs}/transactions/__tests__/integration.test.js +0 -0
  163. /package/{cjs → dist/cjs}/transactions/__tests__/integration.test.js.map +0 -0
  164. /package/{cjs → dist/cjs}/transactions/__tests__/syscoin.test.js +0 -0
  165. /package/{cjs → dist/cjs}/transactions/__tests__/syscoin.test.js.map +0 -0
  166. /package/{cjs → dist/cjs}/transactions/index.js +0 -0
  167. /package/{cjs → dist/cjs}/transactions/index.js.map +0 -0
  168. /package/{cjs → dist/cjs}/transactions/syscoin.js +0 -0
  169. /package/{cjs → dist/cjs}/transactions/syscoin.js.map +0 -0
  170. /package/{cjs → dist/cjs}/trezor/index.js +0 -0
  171. /package/{cjs → dist/cjs}/trezor/index.js.map +0 -0
  172. /package/{cjs → dist/cjs}/types.js +0 -0
  173. /package/{cjs → dist/cjs}/types.js.map +0 -0
  174. /package/{cjs → dist/cjs}/utils/derivation-paths.js +0 -0
  175. /package/{cjs → dist/cjs}/utils/derivation-paths.js.map +0 -0
  176. /package/{cjs → dist/cjs}/utils/psbt.js +0 -0
  177. /package/{cjs → dist/cjs}/utils/psbt.js.map +0 -0
  178. /package/{cjs → dist/cjs}/utils.js +0 -0
  179. /package/{cjs → dist/cjs}/utils.js.map +0 -0
  180. /package/{types → dist/types}/errorUtils.d.ts +0 -0
  181. /package/{types → dist/types}/hardware-wallet-manager.d.ts +0 -0
  182. /package/{types → dist/types}/index.d.ts +0 -0
  183. /package/{types → dist/types}/initial-state.d.ts +0 -0
  184. /package/{types → dist/types}/keyring-manager.d.ts +0 -0
  185. /package/{types → dist/types}/ledger/bitcoin_client/index.d.ts +0 -0
  186. /package/{types → dist/types}/ledger/bitcoin_client/lib/bip32.d.ts +0 -0
  187. /package/{types → dist/types}/ledger/bitcoin_client/lib/buffertools.d.ts +0 -0
  188. /package/{types → dist/types}/ledger/bitcoin_client/lib/clientCommands.d.ts +0 -0
  189. /package/{types → dist/types}/ledger/bitcoin_client/lib/constants.d.ts +0 -0
  190. /package/{types → dist/types}/ledger/bitcoin_client/lib/merkelizedPsbt.d.ts +0 -0
  191. /package/{types → dist/types}/ledger/bitcoin_client/lib/merkle.d.ts +0 -0
  192. /package/{types → dist/types}/ledger/bitcoin_client/lib/merkleMap.d.ts +0 -0
  193. /package/{types → dist/types}/ledger/bitcoin_client/lib/policy.d.ts +0 -0
  194. /package/{types → dist/types}/ledger/bitcoin_client/lib/psbtv2.d.ts +0 -0
  195. /package/{types → dist/types}/ledger/bitcoin_client/lib/varint.d.ts +0 -0
  196. /package/{types → dist/types}/ledger/consts.d.ts +0 -0
  197. /package/{types → dist/types}/ledger/index.d.ts +0 -0
  198. /package/{types → dist/types}/ledger/types.d.ts +0 -0
  199. /package/{types → dist/types}/network-utils.d.ts +0 -0
  200. /package/{types → dist/types}/providers.d.ts +0 -0
  201. /package/{types → dist/types}/signers.d.ts +0 -0
  202. /package/{types → dist/types}/storage.d.ts +0 -0
  203. /package/{types → dist/types}/transactions/__tests__/integration.test.d.ts +0 -0
  204. /package/{types → dist/types}/transactions/__tests__/syscoin.test.d.ts +0 -0
  205. /package/{types → dist/types}/transactions/ethereum.d.ts +0 -0
  206. /package/{types → dist/types}/transactions/index.d.ts +0 -0
  207. /package/{types → dist/types}/transactions/syscoin.d.ts +0 -0
  208. /package/{types → dist/types}/trezor/index.d.ts +0 -0
  209. /package/{types → dist/types}/types.d.ts +0 -0
  210. /package/{types → dist/types}/utils/derivation-paths.d.ts +0 -0
  211. /package/{types → dist/types}/utils/psbt.d.ts +0 -0
  212. /package/{types → dist/types}/utils.d.ts +0 -0
@@ -0,0 +1,375 @@
1
+ import { INetworkType, INetwork } from '@sidhujag/sysweb3-network';
2
+
3
+ import { KeyringManager, KeyringAccountType } from '../../../src';
4
+ import { FAKE_PASSWORD, PEACE_SEED_PHRASE } from '../../helpers/constants';
5
+ import { setupMocks } from '../../helpers/setup';
6
+
7
+ describe('KeyringManager - State Management', () => {
8
+ let keyringManager: KeyringManager;
9
+ let mockVaultStateGetter: jest.Mock;
10
+ let currentMockVaultState: any;
11
+
12
+ beforeEach(async () => {
13
+ setupMocks();
14
+ // Set up vault-keys that would normally be created by Pali's MainController
15
+ await setupTestVault(FAKE_PASSWORD);
16
+
17
+ // Use global mockVaultState from setup.ts as starting point
18
+ currentMockVaultState = { ...mockVaultState };
19
+
20
+ // Mock vault state getter function (from Pali Redux store)
21
+ mockVaultStateGetter = jest.fn(() => currentMockVaultState);
22
+ });
23
+
24
+ describe('Initial State', () => {
25
+ it('should initialize with default state when no options provided', () => {
26
+ keyringManager = new KeyringManager();
27
+
28
+ // Set up vault state getter for stateless keyring
29
+ keyringManager.setVaultStateGetter(mockVaultStateGetter);
30
+
31
+ // activeChain is now derived from vault state, not stored locally
32
+ expect(keyringManager.isUnlocked()).toBe(false);
33
+
34
+ // Vault state should be accessible via getter, not internal wallet property
35
+ expect(mockVaultStateGetter).not.toHaveBeenCalled(); // Not called yet
36
+ });
37
+
38
+ it('should access vault state through getter', () => {
39
+ keyringManager = new KeyringManager();
40
+ keyringManager.setVaultStateGetter(mockVaultStateGetter);
41
+
42
+ // Access network through getNetwork (which calls vault getter)
43
+ const network = keyringManager.getNetwork();
44
+ expect(mockVaultStateGetter).toHaveBeenCalled();
45
+ expect(network).toBeDefined();
46
+ expect(network.chainId).toBe(currentMockVaultState.activeNetwork.chainId);
47
+ });
48
+
49
+ it('should derive active chain from vault state', () => {
50
+ // Test with Syscoin network
51
+ currentMockVaultState = {
52
+ ...mockVaultState,
53
+ activeNetwork: mockVaultState.networks.syscoin[57], // UTXO network
54
+ };
55
+
56
+ keyringManager = new KeyringManager();
57
+ keyringManager.setVaultStateGetter(mockVaultStateGetter);
58
+
59
+ const network = keyringManager.getNetwork();
60
+ expect(network.kind).toBe(INetworkType.Syscoin);
61
+
62
+ // Test with Ethereum network
63
+ currentMockVaultState = {
64
+ ...mockVaultState,
65
+ activeNetwork: mockVaultState.networks.ethereum[1], // EVM network
66
+ };
67
+
68
+ const evmNetwork = keyringManager.getNetwork();
69
+ expect(evmNetwork.kind).toBe(INetworkType.Ethereum);
70
+ });
71
+
72
+ it('should initialize UTXO keyring with syscoin as active network', async () => {
73
+ currentMockVaultState = {
74
+ ...mockVaultState,
75
+ activeNetwork: mockVaultState.networks.syscoin[57],
76
+ };
77
+
78
+ keyringManager = await KeyringManager.createInitialized(
79
+ PEACE_SEED_PHRASE,
80
+ FAKE_PASSWORD,
81
+ mockVaultStateGetter
82
+ );
83
+
84
+ const network = keyringManager.getNetwork();
85
+ expect(network.kind).toBe(INetworkType.Syscoin);
86
+ const xpub = keyringManager.getAccountXpub();
87
+ expect(xpub).toBeDefined();
88
+ // For UTXO networks, xpub should be defined (exact format may vary based on derivation)
89
+ expect(xpub.length).toBeGreaterThan(50); // Reasonable length check
90
+ });
91
+
92
+ it('should initialize EVM keyring with ethereum as active network', async () => {
93
+ currentMockVaultState = {
94
+ ...mockVaultState,
95
+ activeNetwork: mockVaultState.networks.ethereum[1],
96
+ };
97
+
98
+ keyringManager = await KeyringManager.createInitialized(
99
+ PEACE_SEED_PHRASE,
100
+ FAKE_PASSWORD,
101
+ mockVaultStateGetter
102
+ );
103
+
104
+ const network = keyringManager.getNetwork();
105
+ expect(network.kind).toBe(INetworkType.Ethereum);
106
+ const xpub = keyringManager.getAccountXpub();
107
+ expect(xpub).toBeDefined();
108
+ expect(xpub.substring(0, 2)).toEqual('0x');
109
+ });
110
+
111
+ it('should require vault state getter to be set', () => {
112
+ keyringManager = new KeyringManager();
113
+
114
+ // Should throw error when trying to access vault without getter
115
+ expect(() => keyringManager.getNetwork()).toThrow(
116
+ 'Vault state getter not configured. Call setVaultStateGetter() first.'
117
+ );
118
+ });
119
+ });
120
+
121
+ describe('State Persistence', () => {
122
+ beforeEach(async () => {
123
+ currentMockVaultState = {
124
+ ...mockVaultState,
125
+ activeNetwork: mockVaultState.networks.ethereum[1],
126
+ };
127
+
128
+ keyringManager = await KeyringManager.createInitialized(
129
+ PEACE_SEED_PHRASE,
130
+ FAKE_PASSWORD,
131
+ mockVaultStateGetter
132
+ );
133
+ });
134
+
135
+ it('should create accounts and return data for Redux dispatch', async () => {
136
+ const privateKey =
137
+ '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318';
138
+ const importedAccount = await keyringManager.importAccount(
139
+ privateKey,
140
+ 'My Import'
141
+ );
142
+
143
+ // Should return account data for Pali to dispatch to Redux
144
+ expect(importedAccount).toBeDefined();
145
+ expect(importedAccount.label).toBe('My Import');
146
+ expect(importedAccount.address).toBeDefined();
147
+
148
+ // NOTE: In stateless architecture, keyring returns data but doesn't store it
149
+ // The actual storage would be handled by Pali dispatching to Redux
150
+ });
151
+
152
+ it('should maintain keyring functionality without internal state', async () => {
153
+ // Add account via keyring (returns data for Redux)
154
+ const newAccount = await keyringManager.addNewAccount('Account 2');
155
+ expect(newAccount).toBeDefined();
156
+ expect(newAccount.label).toBe('Account 2');
157
+
158
+ // Import account via keyring (returns data for Redux)
159
+ const privateKey =
160
+ '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318';
161
+ const importedAccount = await keyringManager.importAccount(privateKey);
162
+ expect(importedAccount).toBeDefined();
163
+
164
+ // Network switching should work
165
+ const polygon = mockVaultState.networks.ethereum[137];
166
+ const result = await keyringManager.setSignerNetwork(polygon);
167
+ expect(result.success).toBe(true);
168
+ });
169
+ });
170
+
171
+ describe('Multi-Keyring State Isolation', () => {
172
+ it('should maintain separate session data for different keyring instances', async () => {
173
+ // Create EVM keyring with EVM vault state
174
+ const evmVaultState = {
175
+ ...mockVaultState,
176
+ activeNetwork: mockVaultState.networks.ethereum[1],
177
+ };
178
+ const evmVaultGetter = jest.fn(() => evmVaultState);
179
+
180
+ const evmKeyring = await KeyringManager.createInitialized(
181
+ PEACE_SEED_PHRASE,
182
+ FAKE_PASSWORD,
183
+ evmVaultGetter
184
+ );
185
+
186
+ // Create UTXO keyring with UTXO vault state
187
+ const utxoVaultState = {
188
+ ...mockVaultState,
189
+ activeNetwork: mockVaultState.networks.syscoin[57],
190
+ };
191
+ const utxoVaultGetter = jest.fn(() => utxoVaultState);
192
+
193
+ const utxoKeyring = await KeyringManager.createInitialized(
194
+ PEACE_SEED_PHRASE,
195
+ FAKE_PASSWORD,
196
+ utxoVaultGetter
197
+ );
198
+
199
+ // Each keyring should access its own vault state
200
+ const evmNetwork = evmKeyring.getNetwork();
201
+ const utxoNetwork = utxoKeyring.getNetwork();
202
+
203
+ expect(evmNetwork.kind).toBe(INetworkType.Ethereum);
204
+ expect(utxoNetwork.kind).toBe(INetworkType.Syscoin);
205
+
206
+ // Should have called their respective getters
207
+ expect(evmVaultGetter).toHaveBeenCalled();
208
+ expect(utxoVaultGetter).toHaveBeenCalled();
209
+ });
210
+
211
+ it('should share session data between keyrings', async () => {
212
+ const keyring1 = await KeyringManager.createInitialized(
213
+ PEACE_SEED_PHRASE,
214
+ FAKE_PASSWORD,
215
+ mockVaultStateGetter
216
+ );
217
+
218
+ // Create new keyring for Syscoin
219
+ const utxoVaultState = {
220
+ ...mockVaultState,
221
+ activeNetwork: mockVaultState.networks.syscoin[57],
222
+ };
223
+ const utxoVaultGetter = jest.fn(() => utxoVaultState);
224
+
225
+ const keyring2 = new KeyringManager();
226
+ keyring2.setVaultStateGetter(utxoVaultGetter);
227
+
228
+ // Transfer session from keyring1 to keyring2
229
+ keyring1.transferSessionTo(keyring2);
230
+
231
+ // After transfer: keyring1 should be locked, keyring2 should be unlocked
232
+ expect(keyring1.isUnlocked()).toBe(false);
233
+ expect(keyring2.isUnlocked()).toBe(true);
234
+
235
+ // Should be able to perform operations with keyring2
236
+ const seed2 = await keyring2.getSeed(FAKE_PASSWORD);
237
+ expect(seed2).toBe(PEACE_SEED_PHRASE);
238
+ });
239
+ });
240
+
241
+ describe('State Recovery', () => {
242
+ it('should handle state recovery after errors', async () => {
243
+ keyringManager = await KeyringManager.createInitialized(
244
+ PEACE_SEED_PHRASE,
245
+ FAKE_PASSWORD,
246
+ mockVaultStateGetter
247
+ );
248
+
249
+ // Simulate error during account creation
250
+ const originalAddNewAccount = keyringManager.addNewAccount;
251
+ keyringManager.addNewAccount = jest
252
+ .fn()
253
+ .mockRejectedValue(new Error('Test error'));
254
+
255
+ try {
256
+ await keyringManager.addNewAccount('Failed Account');
257
+ } catch (error) {
258
+ // Expected error
259
+ }
260
+
261
+ // Restore original method
262
+ keyringManager.addNewAccount = originalAddNewAccount;
263
+
264
+ // Should be able to continue operations
265
+ const newAccount = await keyringManager.addNewAccount('Success Account');
266
+ expect(newAccount).toBeDefined();
267
+ expect(newAccount.label).toBe('Success Account');
268
+ });
269
+
270
+ it('should handle network switching rollback on failure', async () => {
271
+ keyringManager = await KeyringManager.createInitialized(
272
+ PEACE_SEED_PHRASE,
273
+ FAKE_PASSWORD,
274
+ mockVaultStateGetter
275
+ );
276
+
277
+ const originalNetwork = keyringManager.getNetwork();
278
+
279
+ // Try to switch to invalid network
280
+ const invalidNetwork: INetwork = {
281
+ chainId: 999,
282
+ currency: 'INVALID',
283
+ label: 'Invalid Network',
284
+ url: 'http://invalid',
285
+ kind: 'INVALID' as any,
286
+ explorer: '',
287
+ slip44: 60,
288
+ };
289
+
290
+ try {
291
+ await keyringManager.setSignerNetwork(invalidNetwork);
292
+ } catch (error) {
293
+ // Expected error
294
+ }
295
+
296
+ // Network should remain unchanged in vault state
297
+ const currentNetwork = keyringManager.getNetwork();
298
+ expect(currentNetwork.chainId).toBe(originalNetwork.chainId);
299
+ });
300
+ });
301
+
302
+ describe('State Validation', () => {
303
+ it('should validate account access through vault state', async () => {
304
+ keyringManager = await KeyringManager.createInitialized(
305
+ PEACE_SEED_PHRASE,
306
+ FAKE_PASSWORD,
307
+ mockVaultStateGetter
308
+ );
309
+
310
+ // Should be able to get account via vault state
311
+ const account = keyringManager.getAccountById(
312
+ 0,
313
+ KeyringAccountType.HDAccount
314
+ );
315
+ expect(account).toBeDefined();
316
+ expect(account.id).toBe(0);
317
+
318
+ // Should not allow accessing non-existent account
319
+ expect(() =>
320
+ keyringManager.getAccountById(999, KeyringAccountType.HDAccount)
321
+ ).toThrow('Account not found');
322
+ });
323
+
324
+ it('should validate active account through vault state', async () => {
325
+ keyringManager = await KeyringManager.createInitialized(
326
+ PEACE_SEED_PHRASE,
327
+ FAKE_PASSWORD,
328
+ mockVaultStateGetter
329
+ );
330
+
331
+ // Should get active account from vault state
332
+ const { activeAccount } = keyringManager.getActiveAccount();
333
+ expect(activeAccount).toBeDefined();
334
+ expect(activeAccount.id).toBe(currentMockVaultState.activeAccount.id);
335
+ });
336
+ });
337
+
338
+ describe('Vault State Integration', () => {
339
+ it('should read all state from vault getter, not internal storage', () => {
340
+ keyringManager = new KeyringManager();
341
+ keyringManager.setVaultStateGetter(mockVaultStateGetter);
342
+
343
+ // Every state access should call the vault getter
344
+ mockVaultStateGetter.mockClear();
345
+
346
+ keyringManager.getNetwork();
347
+ expect(mockVaultStateGetter).toHaveBeenCalledTimes(1);
348
+
349
+ keyringManager.getAccountById(0, KeyringAccountType.HDAccount);
350
+ expect(mockVaultStateGetter).toHaveBeenCalledTimes(2);
351
+
352
+ keyringManager.getActiveAccount();
353
+ expect(mockVaultStateGetter).toHaveBeenCalledTimes(3);
354
+ });
355
+
356
+ it('should work with dynamic vault state changes', () => {
357
+ keyringManager = new KeyringManager();
358
+ keyringManager.setVaultStateGetter(mockVaultStateGetter);
359
+
360
+ // Initially get Ethereum network
361
+ const ethNetwork = keyringManager.getNetwork();
362
+ expect(ethNetwork.kind).toBe(INetworkType.Ethereum);
363
+
364
+ // Change vault state to Syscoin
365
+ currentMockVaultState = {
366
+ ...mockVaultState,
367
+ activeNetwork: mockVaultState.networks.syscoin[57],
368
+ };
369
+
370
+ // Should now get Syscoin network
371
+ const sysNetwork = keyringManager.getNetwork();
372
+ expect(sysNetwork.kind).toBe(INetworkType.Syscoin);
373
+ });
374
+ });
375
+ });