@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,372 @@
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('Network Management', () => {
8
+ let keyringManager: KeyringManager;
9
+ let mockVaultStateGetter: jest.Mock;
10
+ let currentVaultState: 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
+
18
+ describe('EVM Network Switching', () => {
19
+ beforeEach(async () => {
20
+ // Set up EVM vault state with Ethereum mainnet
21
+ currentVaultState = createMockVaultState({
22
+ activeAccountId: 0,
23
+ activeAccountType: KeyringAccountType.HDAccount,
24
+ networkType: INetworkType.Ethereum,
25
+ chainId: 1,
26
+ });
27
+ mockVaultStateGetter = jest.fn(() => currentVaultState);
28
+
29
+ keyringManager = await KeyringManager.createInitialized(
30
+ PEACE_SEED_PHRASE,
31
+ FAKE_PASSWORD,
32
+ mockVaultStateGetter
33
+ );
34
+ });
35
+
36
+ it('should switch between EVM networks', async () => {
37
+ // Start with Ethereum mainnet
38
+ expect(keyringManager.getNetwork().chainId).toBe(1);
39
+
40
+ // Switch to Polygon
41
+ const polygon = currentVaultState.networks.ethereum[137];
42
+ const result = await keyringManager.setSignerNetwork(polygon);
43
+
44
+ // Update mock vault state to simulate Redux state update
45
+ currentVaultState.activeNetwork = polygon;
46
+
47
+ expect(result.success).toBe(true);
48
+ expect(keyringManager.getNetwork().chainId).toBe(137);
49
+ expect(keyringManager.getNetwork().label).toBe('Polygon');
50
+ });
51
+
52
+ it('should preserve accounts when switching EVM networks', async () => {
53
+ // Add accounts on Ethereum
54
+ const account1 = await keyringManager.addNewAccount('Test Account');
55
+ const originalAddress = account1.address;
56
+
57
+ // Update vault state to include the new account
58
+ currentVaultState.accounts[KeyringAccountType.HDAccount][1] = {
59
+ id: 1,
60
+ label: 'Test Account',
61
+ address: account1.address,
62
+ xpub: account1.xpub,
63
+ xprv: '',
64
+ isImported: false,
65
+ isTrezorWallet: false,
66
+ isLedgerWallet: false,
67
+ balances: { syscoin: 0, ethereum: 0 },
68
+ assets: { syscoin: [], ethereum: [] },
69
+ };
70
+
71
+ // Switch to Polygon
72
+ const polygon = currentVaultState.networks.ethereum[137];
73
+ await keyringManager.setSignerNetwork(polygon);
74
+
75
+ // Account should still exist with same address
76
+ const account = keyringManager.getAccountById(
77
+ 1,
78
+ KeyringAccountType.HDAccount
79
+ );
80
+ expect(account.address).toBe(originalAddress);
81
+ expect(account.label).toBe('Test Account');
82
+ });
83
+
84
+ it('should update provider when switching networks', async () => {
85
+ const ethereum = keyringManager.getNetwork();
86
+ expect(ethereum.url).toContain('rpc.ankr.com/eth');
87
+
88
+ // Switch to Mumbai testnet
89
+ const mumbai = currentVaultState.networks.ethereum[80001];
90
+ await keyringManager.setSignerNetwork(mumbai);
91
+
92
+ // Update mock vault state to simulate Redux state update
93
+ currentVaultState.activeNetwork = mumbai;
94
+
95
+ const network = keyringManager.getNetwork();
96
+ expect(network.url).toContain('rpc-mumbai.maticvigil.com');
97
+ expect(network.chainId).toBe(80001);
98
+ });
99
+
100
+ it('should handle rapid network switching', async () => {
101
+ const networks = [
102
+ currentVaultState.networks.ethereum[1], // Ethereum
103
+ currentVaultState.networks.ethereum[137], // Polygon
104
+ currentVaultState.networks.ethereum[80001], // Mumbai
105
+ ];
106
+
107
+ // Rapid switching
108
+ for (const network of networks) {
109
+ const result = await keyringManager.setSignerNetwork(network);
110
+
111
+ // Update mock vault state to simulate Redux state update
112
+ currentVaultState.activeNetwork = network;
113
+
114
+ expect(result.success).toBe(true);
115
+ expect(keyringManager.getNetwork().chainId).toBe(network.chainId);
116
+ }
117
+ });
118
+ });
119
+
120
+ describe('Multi-Keyring Architecture Constraints', () => {
121
+ it('should prevent UTXO to UTXO network switching', async () => {
122
+ // Create Syscoin keyring
123
+ currentVaultState = createMockVaultState({
124
+ activeAccountId: 0,
125
+ activeAccountType: KeyringAccountType.HDAccount,
126
+ networkType: INetworkType.Syscoin,
127
+ chainId: 57,
128
+ });
129
+ mockVaultStateGetter = jest.fn(() => currentVaultState);
130
+
131
+ keyringManager = await KeyringManager.createInitialized(
132
+ PEACE_SEED_PHRASE,
133
+ FAKE_PASSWORD,
134
+ mockVaultStateGetter
135
+ );
136
+
137
+ // Try to switch to Bitcoin (different UTXO network)
138
+ const bitcoin: INetwork = {
139
+ chainId: 0,
140
+ currency: 'BTC',
141
+ label: 'Bitcoin',
142
+ url: 'https://blockstream.info',
143
+ kind: INetworkType.Syscoin, // UTXO type
144
+ slip44: 0, // Different slip44
145
+ explorer: '',
146
+ };
147
+
148
+ await expect(keyringManager.setSignerNetwork(bitcoin)).rejects.toThrow(
149
+ 'Cannot switch between different UTXO networks'
150
+ );
151
+ });
152
+
153
+ it('should prevent EVM to UTXO chain type switching', async () => {
154
+ // Create EVM keyring
155
+ currentVaultState = createMockVaultState({
156
+ activeAccountId: 0,
157
+ activeAccountType: KeyringAccountType.HDAccount,
158
+ networkType: INetworkType.Ethereum,
159
+ chainId: 1,
160
+ });
161
+ mockVaultStateGetter = jest.fn(() => currentVaultState);
162
+
163
+ keyringManager = await KeyringManager.createInitialized(
164
+ PEACE_SEED_PHRASE,
165
+ FAKE_PASSWORD,
166
+ mockVaultStateGetter
167
+ );
168
+
169
+ // Try to switch to Syscoin
170
+ const syscoin = currentVaultState.networks.syscoin[57];
171
+
172
+ await expect(keyringManager.setSignerNetwork(syscoin)).rejects.toThrow(
173
+ 'Cannot use Syscoin chain type with Ethereum network'
174
+ );
175
+ });
176
+
177
+ it('should maintain separate keyring instances per UTXO network', async () => {
178
+ // Create Syscoin mainnet keyring with mainnet network setup
179
+ const syscoinMainnetVaultState = createMockVaultState({
180
+ activeAccountId: 0,
181
+ activeAccountType: KeyringAccountType.HDAccount,
182
+ networkType: INetworkType.Syscoin,
183
+ chainId: 57,
184
+ });
185
+ // Set up mainnet-specific network in vault state
186
+ syscoinMainnetVaultState.activeNetwork = {
187
+ ...syscoinMainnetVaultState.networks.syscoin[57],
188
+ chainId: 57,
189
+ label: 'Syscoin Mainnet',
190
+ };
191
+ const syscoinMainnetVaultGetter = jest.fn(() => syscoinMainnetVaultState);
192
+
193
+ const syscoinKeyring = await KeyringManager.createInitialized(
194
+ PEACE_SEED_PHRASE,
195
+ FAKE_PASSWORD,
196
+ syscoinMainnetVaultGetter
197
+ );
198
+
199
+ // Create Syscoin testnet keyring with testnet network setup
200
+ const syscoinTestnetVaultState = createMockVaultState({
201
+ activeAccountId: 0,
202
+ activeAccountType: KeyringAccountType.HDAccount,
203
+ networkType: INetworkType.Syscoin,
204
+ chainId: 5700,
205
+ });
206
+ // Set up testnet-specific network in vault state
207
+ syscoinTestnetVaultState.activeNetwork = {
208
+ ...syscoinTestnetVaultState.networks.syscoin[5700],
209
+ chainId: 5700,
210
+ label: 'Syscoin Testnet',
211
+ };
212
+ const syscoinTestnetVaultGetter = jest.fn(() => syscoinTestnetVaultState);
213
+
214
+ const syscoinTestnetKeyring = await KeyringManager.createInitialized(
215
+ PEACE_SEED_PHRASE,
216
+ FAKE_PASSWORD,
217
+ syscoinTestnetVaultGetter
218
+ );
219
+
220
+ // They should be independent instances
221
+ expect(syscoinKeyring.getNetwork().chainId).toBe(57);
222
+ expect(syscoinTestnetKeyring.getNetwork().chainId).toBe(5700);
223
+
224
+ // Accounts should be valid Syscoin addresses
225
+ const mainnetAccount = syscoinKeyring.getActiveAccount().activeAccount;
226
+ const testnetAccount =
227
+ syscoinTestnetKeyring.getActiveAccount().activeAccount;
228
+
229
+ // Mainnet should use sys1 prefix, testnet should use tsys1 prefix
230
+ expect(mainnetAccount.address.startsWith('sys1')).toBe(true);
231
+ expect(testnetAccount.address.startsWith('tsys1')).toBe(true);
232
+
233
+ // xpub formats should be different for different networks
234
+ // Mainnet uses zpub format, testnet uses vpub format
235
+ // This is correct behavior - same seed but different network encodings
236
+ expect(mainnetAccount.xpub.startsWith('zpub')).toBe(true); // Mainnet format
237
+ expect(testnetAccount.xpub.startsWith('vpub')).toBe(true); // Testnet format
238
+ expect(mainnetAccount.xpub).not.toBe(testnetAccount.xpub); // Different formats
239
+ });
240
+ });
241
+
242
+ describe('Network State Synchronization', () => {
243
+ beforeEach(async () => {
244
+ // Set up EVM vault state
245
+ currentVaultState = createMockVaultState({
246
+ activeAccountId: 0,
247
+ activeAccountType: KeyringAccountType.HDAccount,
248
+ networkType: INetworkType.Ethereum,
249
+ chainId: 1,
250
+ });
251
+ mockVaultStateGetter = jest.fn(() => currentVaultState);
252
+
253
+ keyringManager = await KeyringManager.createInitialized(
254
+ PEACE_SEED_PHRASE,
255
+ FAKE_PASSWORD,
256
+ mockVaultStateGetter
257
+ );
258
+ });
259
+
260
+ it('should persist network changes in vault state', async () => {
261
+ const polygon = currentVaultState.networks.ethereum[137];
262
+ await keyringManager.setSignerNetwork(polygon);
263
+
264
+ // Update mock vault state to simulate Redux state update
265
+ currentVaultState.activeNetwork = polygon;
266
+
267
+ // Verify the network has changed
268
+ const currentNetwork = keyringManager.getNetwork();
269
+ expect(currentNetwork.chainId).toBe(137);
270
+ expect(currentNetwork.label).toBe('Polygon');
271
+ });
272
+
273
+ it('should clear RPC caches on network switch', async () => {
274
+ // clearRpcCaches is already being called during network switching
275
+ // We can verify this by checking that network switching works successfully
276
+ const polygon = currentVaultState.networks.ethereum[137];
277
+ const result = await keyringManager.setSignerNetwork(polygon);
278
+
279
+ // Update mock vault state to simulate Redux state update
280
+ currentVaultState.activeNetwork = polygon;
281
+
282
+ expect(result.success).toBe(true);
283
+ expect(keyringManager.getNetwork().chainId).toBe(137);
284
+ });
285
+
286
+ it('should handle network switching with existing accounts', async () => {
287
+ // Create accounts on Ethereum
288
+ const account2 = await keyringManager.addNewAccount('Account 2');
289
+ const imported = await keyringManager.importAccount(
290
+ '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318'
291
+ );
292
+
293
+ // Update vault state to include these accounts
294
+ currentVaultState.accounts[KeyringAccountType.HDAccount][1] = {
295
+ id: 1,
296
+ label: 'Account 2',
297
+ address: account2.address,
298
+ xpub: account2.xpub,
299
+ xprv: '',
300
+ isImported: false,
301
+ isTrezorWallet: false,
302
+ isLedgerWallet: false,
303
+ balances: { syscoin: 0, ethereum: 0 },
304
+ assets: { syscoin: [], ethereum: [] },
305
+ };
306
+ currentVaultState.accounts[KeyringAccountType.Imported][0] = {
307
+ id: 0,
308
+ label: 'Imported 1',
309
+ address: imported.address,
310
+ xpub: imported.xpub,
311
+ xprv: imported.xprv,
312
+ isImported: true,
313
+ isTrezorWallet: false,
314
+ isLedgerWallet: false,
315
+ balances: { syscoin: 0, ethereum: 0 },
316
+ assets: { syscoin: [], ethereum: [] },
317
+ };
318
+
319
+ // Switch network
320
+ const polygon = currentVaultState.networks.ethereum[137];
321
+ await keyringManager.setSignerNetwork(polygon);
322
+
323
+ // All accounts should still exist
324
+ const hdAccount = keyringManager.getAccountById(
325
+ 1,
326
+ KeyringAccountType.HDAccount
327
+ );
328
+ expect(hdAccount.label).toBe('Account 2');
329
+
330
+ const importedAccount = keyringManager.getAccountById(
331
+ 0,
332
+ KeyringAccountType.Imported
333
+ );
334
+ expect(importedAccount.address).toBe(imported.address);
335
+ });
336
+ });
337
+
338
+ describe('Network Error Handling', () => {
339
+ beforeEach(async () => {
340
+ // Set up EVM vault state
341
+ currentVaultState = createMockVaultState({
342
+ activeAccountId: 0,
343
+ activeAccountType: KeyringAccountType.HDAccount,
344
+ networkType: INetworkType.Ethereum,
345
+ chainId: 1,
346
+ });
347
+ mockVaultStateGetter = jest.fn(() => currentVaultState);
348
+
349
+ keyringManager = await KeyringManager.createInitialized(
350
+ PEACE_SEED_PHRASE,
351
+ FAKE_PASSWORD,
352
+ mockVaultStateGetter
353
+ );
354
+ });
355
+
356
+ it('should handle invalid chain type', async () => {
357
+ const invalidNetwork: INetwork = {
358
+ chainId: 999,
359
+ currency: 'INVALID',
360
+ label: 'Invalid Network',
361
+ url: 'http://invalid',
362
+ kind: 'INVALID' as any,
363
+ explorer: '',
364
+ slip44: 60,
365
+ };
366
+
367
+ await expect(
368
+ keyringManager.setSignerNetwork(invalidNetwork)
369
+ ).rejects.toThrow('Unsupported chain');
370
+ });
371
+ });
372
+ });