@sidhujag/sysweb3-keyring 1.0.545 → 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.
- package/coverage/clover.xml +2875 -0
- package/coverage/coverage-final.json +29468 -0
- package/coverage/lcov-report/base.css +354 -0
- package/coverage/lcov-report/block-navigation.js +85 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +320 -0
- package/coverage/lcov-report/prettify.css +101 -0
- package/coverage/lcov-report/prettify.js +1008 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +191 -0
- package/coverage/lcov-report/src/index.html +276 -0
- package/coverage/lcov-report/src/index.ts.html +114 -0
- package/coverage/lcov-report/src/initial-state.ts.html +558 -0
- package/coverage/lcov-report/src/keyring-manager.ts.html +6279 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/index.html +178 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/index.ts.html +144 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/appClient.ts.html +1560 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/bip32.ts.html +276 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/buffertools.ts.html +495 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/clientCommands.ts.html +1138 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/index.html +363 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts.html +289 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkle.ts.html +486 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkleMap.ts.html +240 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/policy.ts.html +342 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/psbtv2.ts.html +2388 -0
- package/coverage/lcov-report/src/ledger/bitcoin_client/lib/varint.ts.html +453 -0
- package/coverage/lcov-report/src/ledger/consts.ts.html +177 -0
- package/coverage/lcov-report/src/ledger/index.html +216 -0
- package/coverage/lcov-report/src/ledger/index.ts.html +1371 -0
- package/coverage/lcov-report/src/ledger/utils.ts.html +102 -0
- package/coverage/lcov-report/src/signers.ts.html +591 -0
- package/coverage/lcov-report/src/storage.ts.html +198 -0
- package/coverage/lcov-report/src/transactions/ethereum.ts.html +5826 -0
- package/coverage/lcov-report/src/transactions/index.html +216 -0
- package/coverage/lcov-report/src/transactions/index.ts.html +93 -0
- package/coverage/lcov-report/src/transactions/syscoin.ts.html +1521 -0
- package/coverage/lcov-report/src/trezor/index.html +176 -0
- package/coverage/lcov-report/src/trezor/index.ts.html +2655 -0
- package/coverage/lcov-report/src/types.ts.html +1443 -0
- package/coverage/lcov-report/src/utils/derivation-paths.ts.html +486 -0
- package/coverage/lcov-report/src/utils/index.html +196 -0
- package/coverage/lcov-report/src/utils/psbt.ts.html +159 -0
- package/coverage/lcov-report/test/helpers/constants.ts.html +627 -0
- package/coverage/lcov-report/test/helpers/index.html +176 -0
- package/coverage/lcov.info +4832 -0
- package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/appClient.js +1 -124
- package/dist/cjs/ledger/bitcoin_client/lib/appClient.js.map +1 -0
- package/{cjs → dist/cjs}/transactions/ethereum.js +6 -2
- package/dist/cjs/transactions/ethereum.js.map +1 -0
- package/dist/package.json +50 -0
- package/{types → dist/types}/ledger/bitcoin_client/lib/appClient.d.ts +0 -6
- package/examples/basic-usage.js +140 -0
- package/jest.config.js +32 -0
- package/package.json +31 -13
- package/readme.md +201 -0
- package/src/declare.d.ts +7 -0
- package/src/errorUtils.ts +83 -0
- package/src/hardware-wallet-manager.ts +655 -0
- package/src/index.ts +12 -0
- package/src/initial-state.ts +108 -0
- package/src/keyring-manager.ts +2698 -0
- package/src/ledger/bitcoin_client/index.ts +19 -0
- package/src/ledger/bitcoin_client/lib/appClient.ts +405 -0
- package/src/ledger/bitcoin_client/lib/bip32.ts +61 -0
- package/src/ledger/bitcoin_client/lib/buffertools.ts +134 -0
- package/src/ledger/bitcoin_client/lib/clientCommands.ts +356 -0
- package/src/ledger/bitcoin_client/lib/constants.ts +12 -0
- package/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts +65 -0
- package/src/ledger/bitcoin_client/lib/merkle.ts +136 -0
- package/src/ledger/bitcoin_client/lib/merkleMap.ts +49 -0
- package/src/ledger/bitcoin_client/lib/policy.ts +91 -0
- package/src/ledger/bitcoin_client/lib/psbtv2.ts +768 -0
- package/src/ledger/bitcoin_client/lib/varint.ts +120 -0
- package/src/ledger/consts.ts +3 -0
- package/src/ledger/index.ts +685 -0
- package/src/ledger/types.ts +74 -0
- package/src/network-utils.ts +99 -0
- package/src/providers.ts +345 -0
- package/src/signers.ts +158 -0
- package/src/storage.ts +63 -0
- package/src/transactions/__tests__/integration.test.ts +303 -0
- package/src/transactions/__tests__/syscoin.test.ts +409 -0
- package/src/transactions/ethereum.ts +2503 -0
- package/src/transactions/index.ts +2 -0
- package/src/transactions/syscoin.ts +542 -0
- package/src/trezor/index.ts +1050 -0
- package/src/types.ts +366 -0
- package/src/utils/derivation-paths.ts +133 -0
- package/src/utils/psbt.ts +24 -0
- package/src/utils.ts +191 -0
- package/test/README.md +158 -0
- package/test/__mocks__/ledger-mock.js +20 -0
- package/test/__mocks__/trezor-mock.js +75 -0
- package/test/cleanup-summary.md +167 -0
- package/test/helpers/README.md +78 -0
- package/test/helpers/constants.ts +79 -0
- package/test/helpers/setup.ts +714 -0
- package/test/integration/import-validation.spec.ts +588 -0
- package/test/unit/hardware/ledger.spec.ts +869 -0
- package/test/unit/hardware/trezor.spec.ts +828 -0
- package/test/unit/keyring-manager/account-management.spec.ts +970 -0
- package/test/unit/keyring-manager/import-watchonly.spec.ts +181 -0
- package/test/unit/keyring-manager/import-wif.spec.ts +126 -0
- package/test/unit/keyring-manager/initialization.spec.ts +782 -0
- package/test/unit/keyring-manager/key-derivation.spec.ts +996 -0
- package/test/unit/keyring-manager/security.spec.ts +505 -0
- package/test/unit/keyring-manager/state-management.spec.ts +375 -0
- package/test/unit/network/network-management.spec.ts +372 -0
- package/test/unit/transactions/ethereum-transactions.spec.ts +382 -0
- package/test/unit/transactions/syscoin-transactions.spec.ts +615 -0
- package/tsconfig.json +14 -0
- package/cjs/ledger/bitcoin_client/lib/appClient.js.map +0 -1
- package/cjs/transactions/ethereum.js.map +0 -1
- /package/{README.md → dist/README.md} +0 -0
- /package/{cjs → dist/cjs}/errorUtils.js +0 -0
- /package/{cjs → dist/cjs}/errorUtils.js.map +0 -0
- /package/{cjs → dist/cjs}/hardware-wallet-manager.js +0 -0
- /package/{cjs → dist/cjs}/hardware-wallet-manager.js.map +0 -0
- /package/{cjs → dist/cjs}/index.js +0 -0
- /package/{cjs → dist/cjs}/index.js.map +0 -0
- /package/{cjs → dist/cjs}/initial-state.js +0 -0
- /package/{cjs → dist/cjs}/initial-state.js.map +0 -0
- /package/{cjs → dist/cjs}/keyring-manager.js +0 -0
- /package/{cjs → dist/cjs}/keyring-manager.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/index.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/index.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/bip32.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/bip32.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/buffertools.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/buffertools.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/clientCommands.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/clientCommands.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/constants.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/constants.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkle.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkle.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkleMap.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkleMap.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/policy.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/policy.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/psbtv2.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/psbtv2.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/varint.js +0 -0
- /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/varint.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/consts.js +0 -0
- /package/{cjs → dist/cjs}/ledger/consts.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/index.js +0 -0
- /package/{cjs → dist/cjs}/ledger/index.js.map +0 -0
- /package/{cjs → dist/cjs}/ledger/types.js +0 -0
- /package/{cjs → dist/cjs}/ledger/types.js.map +0 -0
- /package/{cjs → dist/cjs}/network-utils.js +0 -0
- /package/{cjs → dist/cjs}/network-utils.js.map +0 -0
- /package/{cjs → dist/cjs}/providers.js +0 -0
- /package/{cjs → dist/cjs}/providers.js.map +0 -0
- /package/{cjs → dist/cjs}/signers.js +0 -0
- /package/{cjs → dist/cjs}/signers.js.map +0 -0
- /package/{cjs → dist/cjs}/storage.js +0 -0
- /package/{cjs → dist/cjs}/storage.js.map +0 -0
- /package/{cjs → dist/cjs}/transactions/__tests__/integration.test.js +0 -0
- /package/{cjs → dist/cjs}/transactions/__tests__/integration.test.js.map +0 -0
- /package/{cjs → dist/cjs}/transactions/__tests__/syscoin.test.js +0 -0
- /package/{cjs → dist/cjs}/transactions/__tests__/syscoin.test.js.map +0 -0
- /package/{cjs → dist/cjs}/transactions/index.js +0 -0
- /package/{cjs → dist/cjs}/transactions/index.js.map +0 -0
- /package/{cjs → dist/cjs}/transactions/syscoin.js +0 -0
- /package/{cjs → dist/cjs}/transactions/syscoin.js.map +0 -0
- /package/{cjs → dist/cjs}/trezor/index.js +0 -0
- /package/{cjs → dist/cjs}/trezor/index.js.map +0 -0
- /package/{cjs → dist/cjs}/types.js +0 -0
- /package/{cjs → dist/cjs}/types.js.map +0 -0
- /package/{cjs → dist/cjs}/utils/derivation-paths.js +0 -0
- /package/{cjs → dist/cjs}/utils/derivation-paths.js.map +0 -0
- /package/{cjs → dist/cjs}/utils/psbt.js +0 -0
- /package/{cjs → dist/cjs}/utils/psbt.js.map +0 -0
- /package/{cjs → dist/cjs}/utils.js +0 -0
- /package/{cjs → dist/cjs}/utils.js.map +0 -0
- /package/{types → dist/types}/errorUtils.d.ts +0 -0
- /package/{types → dist/types}/hardware-wallet-manager.d.ts +0 -0
- /package/{types → dist/types}/index.d.ts +0 -0
- /package/{types → dist/types}/initial-state.d.ts +0 -0
- /package/{types → dist/types}/keyring-manager.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/index.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/bip32.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/buffertools.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/clientCommands.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/constants.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/merkelizedPsbt.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/merkle.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/merkleMap.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/policy.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/psbtv2.d.ts +0 -0
- /package/{types → dist/types}/ledger/bitcoin_client/lib/varint.d.ts +0 -0
- /package/{types → dist/types}/ledger/consts.d.ts +0 -0
- /package/{types → dist/types}/ledger/index.d.ts +0 -0
- /package/{types → dist/types}/ledger/types.d.ts +0 -0
- /package/{types → dist/types}/network-utils.d.ts +0 -0
- /package/{types → dist/types}/providers.d.ts +0 -0
- /package/{types → dist/types}/signers.d.ts +0 -0
- /package/{types → dist/types}/storage.d.ts +0 -0
- /package/{types → dist/types}/transactions/__tests__/integration.test.d.ts +0 -0
- /package/{types → dist/types}/transactions/__tests__/syscoin.test.d.ts +0 -0
- /package/{types → dist/types}/transactions/ethereum.d.ts +0 -0
- /package/{types → dist/types}/transactions/index.d.ts +0 -0
- /package/{types → dist/types}/transactions/syscoin.d.ts +0 -0
- /package/{types → dist/types}/trezor/index.d.ts +0 -0
- /package/{types → dist/types}/types.d.ts +0 -0
- /package/{types → dist/types}/utils/derivation-paths.d.ts +0 -0
- /package/{types → dist/types}/utils/psbt.d.ts +0 -0
- /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
|
+
});
|