@sidhujag/sysweb3-keyring 1.0.547 → 1.0.549

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/{dist/cjs → cjs}/providers.js +1 -64
  2. package/cjs/providers.js.map +1 -0
  3. package/{dist/cjs → cjs}/transactions/ethereum.js +1 -16
  4. package/cjs/transactions/ethereum.js.map +1 -0
  5. package/package.json +2 -30
  6. package/{dist/types → types}/providers.d.ts +0 -8
  7. package/{dist/types → types}/transactions/ethereum.d.ts +2 -2
  8. package/{dist/types → types}/types.d.ts +2 -2
  9. package/coverage/clover.xml +0 -2875
  10. package/coverage/coverage-final.json +0 -29468
  11. package/coverage/lcov-report/base.css +0 -354
  12. package/coverage/lcov-report/block-navigation.js +0 -85
  13. package/coverage/lcov-report/favicon.png +0 -0
  14. package/coverage/lcov-report/index.html +0 -320
  15. package/coverage/lcov-report/prettify.css +0 -101
  16. package/coverage/lcov-report/prettify.js +0 -1008
  17. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  18. package/coverage/lcov-report/sorter.js +0 -191
  19. package/coverage/lcov-report/src/index.html +0 -276
  20. package/coverage/lcov-report/src/index.ts.html +0 -114
  21. package/coverage/lcov-report/src/initial-state.ts.html +0 -558
  22. package/coverage/lcov-report/src/keyring-manager.ts.html +0 -6279
  23. package/coverage/lcov-report/src/ledger/bitcoin_client/index.html +0 -178
  24. package/coverage/lcov-report/src/ledger/bitcoin_client/index.ts.html +0 -144
  25. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/appClient.ts.html +0 -1560
  26. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/bip32.ts.html +0 -276
  27. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/buffertools.ts.html +0 -495
  28. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/clientCommands.ts.html +0 -1138
  29. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/index.html +0 -363
  30. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts.html +0 -289
  31. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkle.ts.html +0 -486
  32. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkleMap.ts.html +0 -240
  33. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/policy.ts.html +0 -342
  34. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/psbtv2.ts.html +0 -2388
  35. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/varint.ts.html +0 -453
  36. package/coverage/lcov-report/src/ledger/consts.ts.html +0 -177
  37. package/coverage/lcov-report/src/ledger/index.html +0 -216
  38. package/coverage/lcov-report/src/ledger/index.ts.html +0 -1371
  39. package/coverage/lcov-report/src/ledger/utils.ts.html +0 -102
  40. package/coverage/lcov-report/src/signers.ts.html +0 -591
  41. package/coverage/lcov-report/src/storage.ts.html +0 -198
  42. package/coverage/lcov-report/src/transactions/ethereum.ts.html +0 -5826
  43. package/coverage/lcov-report/src/transactions/index.html +0 -216
  44. package/coverage/lcov-report/src/transactions/index.ts.html +0 -93
  45. package/coverage/lcov-report/src/transactions/syscoin.ts.html +0 -1521
  46. package/coverage/lcov-report/src/trezor/index.html +0 -176
  47. package/coverage/lcov-report/src/trezor/index.ts.html +0 -2655
  48. package/coverage/lcov-report/src/types.ts.html +0 -1443
  49. package/coverage/lcov-report/src/utils/derivation-paths.ts.html +0 -486
  50. package/coverage/lcov-report/src/utils/index.html +0 -196
  51. package/coverage/lcov-report/src/utils/psbt.ts.html +0 -159
  52. package/coverage/lcov-report/test/helpers/constants.ts.html +0 -627
  53. package/coverage/lcov-report/test/helpers/index.html +0 -176
  54. package/coverage/lcov.info +0 -4832
  55. package/dist/cjs/providers.js.map +0 -1
  56. package/dist/cjs/transactions/ethereum.js.map +0 -1
  57. package/dist/package.json +0 -50
  58. package/examples/basic-usage.js +0 -140
  59. package/jest.config.js +0 -32
  60. package/readme.md +0 -201
  61. package/src/declare.d.ts +0 -7
  62. package/src/errorUtils.ts +0 -83
  63. package/src/hardware-wallet-manager.ts +0 -655
  64. package/src/index.ts +0 -12
  65. package/src/initial-state.ts +0 -108
  66. package/src/keyring-manager.ts +0 -2698
  67. package/src/ledger/bitcoin_client/index.ts +0 -19
  68. package/src/ledger/bitcoin_client/lib/appClient.ts +0 -405
  69. package/src/ledger/bitcoin_client/lib/bip32.ts +0 -61
  70. package/src/ledger/bitcoin_client/lib/buffertools.ts +0 -134
  71. package/src/ledger/bitcoin_client/lib/clientCommands.ts +0 -356
  72. package/src/ledger/bitcoin_client/lib/constants.ts +0 -12
  73. package/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts +0 -65
  74. package/src/ledger/bitcoin_client/lib/merkle.ts +0 -136
  75. package/src/ledger/bitcoin_client/lib/merkleMap.ts +0 -49
  76. package/src/ledger/bitcoin_client/lib/policy.ts +0 -91
  77. package/src/ledger/bitcoin_client/lib/psbtv2.ts +0 -768
  78. package/src/ledger/bitcoin_client/lib/varint.ts +0 -120
  79. package/src/ledger/consts.ts +0 -3
  80. package/src/ledger/index.ts +0 -685
  81. package/src/ledger/types.ts +0 -74
  82. package/src/network-utils.ts +0 -99
  83. package/src/providers.ts +0 -345
  84. package/src/signers.ts +0 -158
  85. package/src/storage.ts +0 -63
  86. package/src/transactions/__tests__/integration.test.ts +0 -303
  87. package/src/transactions/__tests__/syscoin.test.ts +0 -409
  88. package/src/transactions/ethereum.ts +0 -2503
  89. package/src/transactions/index.ts +0 -2
  90. package/src/transactions/syscoin.ts +0 -542
  91. package/src/trezor/index.ts +0 -1050
  92. package/src/types.ts +0 -366
  93. package/src/utils/derivation-paths.ts +0 -133
  94. package/src/utils/psbt.ts +0 -24
  95. package/src/utils.ts +0 -191
  96. package/test/README.md +0 -158
  97. package/test/__mocks__/ledger-mock.js +0 -20
  98. package/test/__mocks__/trezor-mock.js +0 -75
  99. package/test/cleanup-summary.md +0 -167
  100. package/test/helpers/README.md +0 -78
  101. package/test/helpers/constants.ts +0 -79
  102. package/test/helpers/setup.ts +0 -714
  103. package/test/integration/import-validation.spec.ts +0 -588
  104. package/test/unit/hardware/ledger.spec.ts +0 -869
  105. package/test/unit/hardware/trezor.spec.ts +0 -828
  106. package/test/unit/keyring-manager/account-management.spec.ts +0 -970
  107. package/test/unit/keyring-manager/import-watchonly.spec.ts +0 -181
  108. package/test/unit/keyring-manager/import-wif.spec.ts +0 -126
  109. package/test/unit/keyring-manager/initialization.spec.ts +0 -782
  110. package/test/unit/keyring-manager/key-derivation.spec.ts +0 -996
  111. package/test/unit/keyring-manager/security.spec.ts +0 -505
  112. package/test/unit/keyring-manager/state-management.spec.ts +0 -375
  113. package/test/unit/network/network-management.spec.ts +0 -372
  114. package/test/unit/transactions/ethereum-transactions.spec.ts +0 -382
  115. package/test/unit/transactions/syscoin-transactions.spec.ts +0 -615
  116. package/tsconfig.json +0 -14
  117. /package/{dist/README.md → README.md} +0 -0
  118. /package/{dist/cjs → cjs}/errorUtils.js +0 -0
  119. /package/{dist/cjs → cjs}/errorUtils.js.map +0 -0
  120. /package/{dist/cjs → cjs}/hardware-wallet-manager.js +0 -0
  121. /package/{dist/cjs → cjs}/hardware-wallet-manager.js.map +0 -0
  122. /package/{dist/cjs → cjs}/index.js +0 -0
  123. /package/{dist/cjs → cjs}/index.js.map +0 -0
  124. /package/{dist/cjs → cjs}/initial-state.js +0 -0
  125. /package/{dist/cjs → cjs}/initial-state.js.map +0 -0
  126. /package/{dist/cjs → cjs}/keyring-manager.js +0 -0
  127. /package/{dist/cjs → cjs}/keyring-manager.js.map +0 -0
  128. /package/{dist/cjs → cjs}/ledger/bitcoin_client/index.js +0 -0
  129. /package/{dist/cjs → cjs}/ledger/bitcoin_client/index.js.map +0 -0
  130. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/appClient.js +0 -0
  131. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/appClient.js.map +0 -0
  132. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/bip32.js +0 -0
  133. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/bip32.js.map +0 -0
  134. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/buffertools.js +0 -0
  135. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/buffertools.js.map +0 -0
  136. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/clientCommands.js +0 -0
  137. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/clientCommands.js.map +0 -0
  138. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/constants.js +0 -0
  139. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/constants.js.map +0 -0
  140. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js +0 -0
  141. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js.map +0 -0
  142. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkle.js +0 -0
  143. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkle.js.map +0 -0
  144. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkleMap.js +0 -0
  145. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/merkleMap.js.map +0 -0
  146. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/policy.js +0 -0
  147. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/policy.js.map +0 -0
  148. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/psbtv2.js +0 -0
  149. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/psbtv2.js.map +0 -0
  150. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/varint.js +0 -0
  151. /package/{dist/cjs → cjs}/ledger/bitcoin_client/lib/varint.js.map +0 -0
  152. /package/{dist/cjs → cjs}/ledger/consts.js +0 -0
  153. /package/{dist/cjs → cjs}/ledger/consts.js.map +0 -0
  154. /package/{dist/cjs → cjs}/ledger/index.js +0 -0
  155. /package/{dist/cjs → cjs}/ledger/index.js.map +0 -0
  156. /package/{dist/cjs → cjs}/ledger/types.js +0 -0
  157. /package/{dist/cjs → cjs}/ledger/types.js.map +0 -0
  158. /package/{dist/cjs → cjs}/network-utils.js +0 -0
  159. /package/{dist/cjs → cjs}/network-utils.js.map +0 -0
  160. /package/{dist/cjs → cjs}/signers.js +0 -0
  161. /package/{dist/cjs → cjs}/signers.js.map +0 -0
  162. /package/{dist/cjs → cjs}/storage.js +0 -0
  163. /package/{dist/cjs → cjs}/storage.js.map +0 -0
  164. /package/{dist/cjs → cjs}/transactions/__tests__/integration.test.js +0 -0
  165. /package/{dist/cjs → cjs}/transactions/__tests__/integration.test.js.map +0 -0
  166. /package/{dist/cjs → cjs}/transactions/__tests__/syscoin.test.js +0 -0
  167. /package/{dist/cjs → cjs}/transactions/__tests__/syscoin.test.js.map +0 -0
  168. /package/{dist/cjs → cjs}/transactions/index.js +0 -0
  169. /package/{dist/cjs → cjs}/transactions/index.js.map +0 -0
  170. /package/{dist/cjs → cjs}/transactions/syscoin.js +0 -0
  171. /package/{dist/cjs → cjs}/transactions/syscoin.js.map +0 -0
  172. /package/{dist/cjs → cjs}/trezor/index.js +0 -0
  173. /package/{dist/cjs → cjs}/trezor/index.js.map +0 -0
  174. /package/{dist/cjs → cjs}/types.js +0 -0
  175. /package/{dist/cjs → cjs}/types.js.map +0 -0
  176. /package/{dist/cjs → cjs}/utils/derivation-paths.js +0 -0
  177. /package/{dist/cjs → cjs}/utils/derivation-paths.js.map +0 -0
  178. /package/{dist/cjs → cjs}/utils/psbt.js +0 -0
  179. /package/{dist/cjs → cjs}/utils/psbt.js.map +0 -0
  180. /package/{dist/cjs → cjs}/utils.js +0 -0
  181. /package/{dist/cjs → cjs}/utils.js.map +0 -0
  182. /package/{dist/types → types}/errorUtils.d.ts +0 -0
  183. /package/{dist/types → types}/hardware-wallet-manager.d.ts +0 -0
  184. /package/{dist/types → types}/index.d.ts +0 -0
  185. /package/{dist/types → types}/initial-state.d.ts +0 -0
  186. /package/{dist/types → types}/keyring-manager.d.ts +0 -0
  187. /package/{dist/types → types}/ledger/bitcoin_client/index.d.ts +0 -0
  188. /package/{dist/types → types}/ledger/bitcoin_client/lib/appClient.d.ts +0 -0
  189. /package/{dist/types → types}/ledger/bitcoin_client/lib/bip32.d.ts +0 -0
  190. /package/{dist/types → types}/ledger/bitcoin_client/lib/buffertools.d.ts +0 -0
  191. /package/{dist/types → types}/ledger/bitcoin_client/lib/clientCommands.d.ts +0 -0
  192. /package/{dist/types → types}/ledger/bitcoin_client/lib/constants.d.ts +0 -0
  193. /package/{dist/types → types}/ledger/bitcoin_client/lib/merkelizedPsbt.d.ts +0 -0
  194. /package/{dist/types → types}/ledger/bitcoin_client/lib/merkle.d.ts +0 -0
  195. /package/{dist/types → types}/ledger/bitcoin_client/lib/merkleMap.d.ts +0 -0
  196. /package/{dist/types → types}/ledger/bitcoin_client/lib/policy.d.ts +0 -0
  197. /package/{dist/types → types}/ledger/bitcoin_client/lib/psbtv2.d.ts +0 -0
  198. /package/{dist/types → types}/ledger/bitcoin_client/lib/varint.d.ts +0 -0
  199. /package/{dist/types → types}/ledger/consts.d.ts +0 -0
  200. /package/{dist/types → types}/ledger/index.d.ts +0 -0
  201. /package/{dist/types → types}/ledger/types.d.ts +0 -0
  202. /package/{dist/types → types}/network-utils.d.ts +0 -0
  203. /package/{dist/types → types}/signers.d.ts +0 -0
  204. /package/{dist/types → types}/storage.d.ts +0 -0
  205. /package/{dist/types → types}/transactions/__tests__/integration.test.d.ts +0 -0
  206. /package/{dist/types → types}/transactions/__tests__/syscoin.test.d.ts +0 -0
  207. /package/{dist/types → types}/transactions/index.d.ts +0 -0
  208. /package/{dist/types → types}/transactions/syscoin.d.ts +0 -0
  209. /package/{dist/types → types}/trezor/index.d.ts +0 -0
  210. /package/{dist/types → types}/utils/derivation-paths.d.ts +0 -0
  211. /package/{dist/types → types}/utils/psbt.d.ts +0 -0
  212. /package/{dist/types → types}/utils.d.ts +0 -0
@@ -1,714 +0,0 @@
1
- // Test setup file
2
- import { INetworkType } from '@sidhujag/sysweb3-network';
3
- import { randomBytes, createHmac } from 'crypto';
4
- import { TextEncoder, TextDecoder } from 'util';
5
-
6
- import { KeyringAccountType } from '../../src';
7
-
8
- // Extend global type to include setupTestVault and mockVaultState utilities
9
- declare global {
10
- function setupTestVault(password?: string): Promise<void>;
11
- function createMockVaultState(options?: {
12
- activeAccountId?: number;
13
- activeAccountType?: KeyringAccountType;
14
- networkType?: INetworkType;
15
- chainId?: number;
16
- }): any;
17
- const mockVaultState: any;
18
- }
19
-
20
- // Polyfill for TextEncoder/TextDecoder in Node.js environment
21
- global.TextEncoder = TextEncoder;
22
- global.TextDecoder = TextDecoder as any;
23
-
24
- // Polyfill crypto.getRandomValues for Node.js
25
- global.crypto = {
26
- getRandomValues: (arr: Uint8Array) => {
27
- const bytes = randomBytes(arr.length);
28
- arr.set(bytes);
29
- return arr;
30
- },
31
- } as any;
32
-
33
- // Mock browser globals that Trezor expects
34
- global.self = global as any;
35
- (global as any).window = global;
36
- (global as any).document = {
37
- createElement: () => ({}),
38
- body: {
39
- appendChild: () => {
40
- // Empty implementation for mock DOM element appendChild
41
- },
42
- },
43
- };
44
-
45
- // Mock ledgerService from @ledgerhq/hw-app-eth
46
- jest.mock('@ledgerhq/hw-app-eth', () => ({
47
- __esModule: true,
48
- default: jest.fn().mockImplementation(() => ({
49
- getAddress: jest.fn(),
50
- signTransaction: jest.fn(),
51
- signPersonalMessage: jest.fn(),
52
- signEIP712HashedMessage: jest.fn(),
53
- })),
54
- ledgerService: {
55
- resolveTransaction: jest.fn().mockResolvedValue({}),
56
- },
57
- }));
58
-
59
- // Mock environment variables if needed
60
- process.env.SEED_PEACE_GLOBE =
61
- process.env.SEED_PEACE_GLOBE ||
62
- 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about';
63
- process.env.PRIVATE_KEY_ACCOUNT =
64
- process.env.PRIVATE_KEY_ACCOUNT ||
65
- '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef';
66
- process.env.PRIVATE_KEY_ACCOUNT_ADDRESS =
67
- process.env.PRIVATE_KEY_ACCOUNT_ADDRESS ||
68
- '0x1234567890123456789012345678901234567890';
69
- process.env.SEED_ACCOUNT_ADDRESS_AT_EVM =
70
- process.env.SEED_ACCOUNT_ADDRESS_AT_EVM ||
71
- '0x1234567890123456789012345678901234567890';
72
- process.env.SEED_ACCOUNT_ADDRESS_AT_UTX0 =
73
- process.env.SEED_ACCOUNT_ADDRESS_AT_UTX0 ||
74
- 'tsys1q4v8sagt0znwaxdscrzhvu8t33n7vj8j45czpv4';
75
- process.env.SEED_SWALLOW_HEALTH =
76
- process.env.SEED_SWALLOW_HEALTH ||
77
- 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon';
78
-
79
- // Mock the providers module
80
- jest.mock('../../src/providers', () => ({
81
- CustomJsonRpcProvider: jest.fn().mockImplementation((_signal, _url) => {
82
- const { BigNumber } = jest.requireActual('@ethersproject/bignumber');
83
-
84
- // Determine chainId based on URL
85
- let chainId = 57; // Default Syscoin mainnet
86
- let name = 'syscoin';
87
-
88
- if (_url) {
89
- if (_url.includes('rpc.ankr.com/eth') || _url.includes('mainnet')) {
90
- chainId = 1;
91
- name = 'mainnet';
92
- } else if (
93
- _url.includes('tanenbaum') ||
94
- _url.includes('test') ||
95
- _url.includes('5700')
96
- ) {
97
- chainId = 5700;
98
- name = 'syscoin-testnet';
99
- } else if (_url.includes('mumbai') || _url.includes('80001')) {
100
- chainId = 80001;
101
- name = 'mumbai';
102
- } else if (_url.includes('polygon') && !_url.includes('mumbai')) {
103
- chainId = 137;
104
- name = 'polygon';
105
- }
106
- }
107
-
108
- // Create signer first
109
- const signer = {
110
- getAddress: jest
111
- .fn()
112
- .mockResolvedValue('0x1234567890123456789012345678901234567890'),
113
- sendTransaction: jest.fn().mockResolvedValue({
114
- hash: '0x1234567890123456789012345678901234567890123456789012345678901234',
115
- wait: jest.fn().mockResolvedValue({ status: 1 }),
116
- }),
117
- connect: jest.fn().mockReturnThis(),
118
- provider: null as any, // Will be set below
119
- };
120
-
121
- const provider = {
122
- getNetwork: jest.fn().mockResolvedValue({ chainId, name }),
123
- getBalance: jest
124
- .fn()
125
- .mockResolvedValue(BigNumber.from('1000000000000000000')),
126
- getCode: jest.fn().mockResolvedValue('0x'),
127
- estimateGas: jest.fn().mockResolvedValue(BigNumber.from('21000')),
128
- getGasPrice: jest.fn().mockResolvedValue(BigNumber.from('20000000000')),
129
- getTransactionCount: jest.fn().mockResolvedValue(0),
130
- sendTransaction: jest.fn().mockResolvedValue({
131
- hash: '0x1234567890123456789012345678901234567890123456789012345678901234',
132
- wait: jest.fn().mockResolvedValue({ status: 1 }),
133
- }),
134
- call: jest
135
- .fn()
136
- .mockResolvedValue(
137
- '0x0000000000000000000000000000000000000000000000000000000000000001'
138
- ),
139
- getBlock: jest.fn().mockResolvedValue({
140
- number: 12345,
141
- timestamp: Math.floor(Date.now() / 1000),
142
- baseFeePerGas: BigNumber.from('20000000000'),
143
- gasLimit: BigNumber.from('30000000'),
144
- gasUsed: BigNumber.from('21000'),
145
- transactions: [],
146
- hash: '0x1234567890123456789012345678901234567890123456789012345678901234',
147
- }),
148
- send: jest.fn().mockImplementation((method: string) => {
149
- if (method === 'eth_maxPriorityFeePerGas') {
150
- return Promise.resolve('0x5f5e100'); // 1 gwei
151
- }
152
- return Promise.resolve('0x0');
153
- }),
154
- getTransaction: jest.fn().mockResolvedValue({
155
- hash: '0x1234567890123456789012345678901234567890123456789012345678901234',
156
- from: '0x1234567890123456789012345678901234567890',
157
- to: '0x0987654321098765432109876543210987654321',
158
- nonce: 0,
159
- gasLimit: BigNumber.from('21000'),
160
- gasPrice: BigNumber.from('20000000000'),
161
- maxFeePerGas: BigNumber.from('40000000000'),
162
- maxPriorityFeePerGas: BigNumber.from('2000000000'),
163
- value: BigNumber.from('0'),
164
- chainId: 1,
165
- wait: jest.fn().mockResolvedValue({ status: 1 }),
166
- }),
167
- getSigner: jest.fn().mockReturnValue(signer),
168
- // Add missing methods that ethers.js expects
169
- resolveName: jest.fn().mockImplementation((nameOrAddress) => {
170
- // If it's already an address, return it; otherwise return null (no ENS resolution)
171
- if (
172
- nameOrAddress &&
173
- nameOrAddress.startsWith('0x') &&
174
- nameOrAddress.length === 42
175
- ) {
176
- return Promise.resolve(nameOrAddress);
177
- }
178
- return Promise.resolve(null);
179
- }),
180
- lookupAddress: jest.fn().mockResolvedValue(null),
181
- waitForTransaction: jest.fn().mockImplementation((hash) => {
182
- return Promise.resolve({
183
- hash,
184
- status: 1,
185
- confirmations: 1,
186
- blockNumber: 12345,
187
- blockHash:
188
- '0x1234567890123456789012345678901234567890123456789012345678901234',
189
- gasUsed: BigNumber.from('21000'),
190
- });
191
- }),
192
- getResolver: jest.fn().mockResolvedValue(null),
193
- getAvatar: jest.fn().mockResolvedValue(null),
194
- network: { chainId },
195
- _isProvider: true,
196
- };
197
-
198
- // Set circular reference
199
- signer.provider = provider;
200
-
201
- return provider;
202
- }),
203
- CustomL2JsonRpcProvider: jest.fn().mockImplementation((_signal, _url) => {
204
- // Return the same mock as CustomJsonRpcProvider for simplicity
205
- const CustomJsonRpcProviderMock = jest.requireMock(
206
- '../../src/providers'
207
- ).CustomJsonRpcProvider;
208
- return new CustomJsonRpcProviderMock(_signal, _url);
209
- }),
210
- }));
211
-
212
- // Mock storage for sysweb3-core
213
- const mockStorage = new Map();
214
-
215
- // Mock sysweb3-core storage
216
- jest.mock('@sidhujag/sysweb3-core', () => ({
217
- sysweb3Di: {
218
- getStateStorageDb: () => ({
219
- get: jest.fn(async (key: string) => {
220
- return mockStorage.get(key) || null;
221
- }),
222
- set: jest.fn((key: string, value: any) => {
223
- mockStorage.set(key, value);
224
- return Promise.resolve();
225
- }),
226
- deleteItem: jest.fn((key: string) => {
227
- mockStorage.delete(key);
228
- return Promise.resolve();
229
- }),
230
- clear: jest.fn(() => {
231
- mockStorage.clear();
232
- return Promise.resolve();
233
- }),
234
- setClient: jest.fn(),
235
- }),
236
- },
237
- }));
238
-
239
- // Mock sysweb3-utils to support token operations
240
- jest.mock('@sidhujag/sysweb3-utils', () => {
241
- const actualUtils = jest.requireActual('@sidhujag/sysweb3-utils');
242
- return {
243
- ...actualUtils,
244
- getAsset: jest.fn().mockResolvedValue({
245
- assetGuid: '123456789',
246
- symbol: 'TEST',
247
- decimals: 8,
248
- maxSupply: 1000000,
249
- totalSupply: 500000,
250
- }),
251
- };
252
- });
253
-
254
- // Mock syscoinjs utilities - only network calls, use real HDSigner for deterministic crypto
255
- jest.mock('syscoinjs-lib', () => {
256
- const actualSyscoinjs = jest.requireActual('syscoinjs-lib');
257
-
258
- // Create a mock HDSigner class that extends the real one
259
- class MockHDSigner extends actualSyscoinjs.utils.HDSigner {
260
- // Override sign method to avoid real PSBT signing
261
- async sign(psbt) {
262
- // If psbt is a string (from mock), just return it
263
- if (typeof psbt === 'string') {
264
- return psbt;
265
- }
266
-
267
- // If it's a mock PSBT object, return a properly signed mock
268
- if (psbt && psbt.data && psbt.data.inputs) {
269
- // Mock the signing process
270
- return {
271
- ...psbt,
272
- signed: true,
273
- extractTransaction: jest.fn().mockReturnValue({
274
- getId: jest.fn().mockReturnValue('mock_txid'),
275
- toHex: jest.fn().mockReturnValue('mock_hex'),
276
- }),
277
- finalizeAllInputs: jest.fn(),
278
- validateSignaturesOfAllInputs: jest.fn().mockReturnValue(true),
279
- };
280
- }
281
-
282
- // Otherwise return the psbt as-is
283
- return psbt;
284
- }
285
- }
286
-
287
- return {
288
- ...actualSyscoinjs,
289
- utils: {
290
- ...actualSyscoinjs.utils,
291
- // Replace HDSigner with our mock version
292
- HDSigner: MockHDSigner,
293
- // Only mock network-dependent functions
294
- fetchBackendAccount: jest.fn().mockResolvedValue({
295
- balance: 100000000, // 1 SYS in satoshis
296
- tokens: [],
297
- address: 'tsys1q4v8sagt0znwaxdscrzhvu8t33n7vj8j45czpv4',
298
- }),
299
- fetchEstimateFee: jest.fn().mockResolvedValue(10), // Return reasonable fee rate (10 satoshis per 1024 bytes)
300
- fetchBackendRawTx: jest.fn().mockResolvedValue('mockedRawTx'),
301
- fetchBackendUTXOS: jest.fn().mockResolvedValue([]),
302
- sanitizeBlockbookUTXOs: jest.fn().mockReturnValue([]),
303
- getMemoFromOpReturn: jest.fn(),
304
- createTransaction: jest.fn().mockResolvedValue({
305
- psbt: 'mocked_psbt',
306
- assets: [],
307
- }),
308
- syscoinNetworks: {
309
- mainnet: {},
310
- testnet: {},
311
- },
312
- },
313
- createPSBTFromRes: jest.fn().mockReturnValue({
314
- psbt: 'mocked_psbt',
315
- assets: [],
316
- }),
317
- signTransaction: jest.fn().mockResolvedValue('signed_tx'),
318
- sendTransaction: jest.fn().mockResolvedValue({ txid: 'mocked_txid' }),
319
- SyscoinJSLib: jest.fn().mockImplementation((hd, url) => ({
320
- blockbookURL: url || 'https://blockbook-dev.elint.services/',
321
- Signer: hd,
322
- createTransaction: jest.fn().mockResolvedValue({
323
- psbt: 'mocked_psbt_object',
324
- fee: 0.0001, // 0.0001 SYS fee
325
- }),
326
- decodeRawTransaction: jest.fn().mockReturnValue({
327
- txid: 'mocked_txid',
328
- version: 1,
329
- locktime: 0,
330
- vin: [],
331
- vout: [],
332
- }),
333
- assetAllocationSend: jest.fn().mockResolvedValue({
334
- psbt: 'mocked_spt_psbt',
335
- fee: 0.0001,
336
- }),
337
- send: jest.fn().mockResolvedValue({
338
- extractTransaction: jest.fn().mockReturnValue({
339
- getId: jest.fn().mockReturnValue('mock_transaction_id'),
340
- }),
341
- }),
342
- })),
343
- };
344
- });
345
-
346
- // Mock fetch to avoid network requests
347
- global.fetch = jest.fn((url) => {
348
- if (url.includes('/api/v2') && !url.includes('xpub')) {
349
- // Determine coin name based on URL
350
- let coinName = 'Syscoin'; // Default to mainnet
351
- let chainType = 'main';
352
-
353
- // Check if it's a testnet URL
354
- if (
355
- url.includes('dev') ||
356
- url.includes('test') ||
357
- url.includes('tanenbaum')
358
- ) {
359
- coinName = 'Syscoin Testnet';
360
- chainType = 'test';
361
- }
362
-
363
- return Promise.resolve({
364
- ok: true,
365
- json: () =>
366
- Promise.resolve({
367
- blockbook: { coin: coinName },
368
- backend: { chain: chainType },
369
- }),
370
- } as any);
371
- }
372
- if (url.includes('xpub') || url.includes('fetchBackendAccount')) {
373
- return Promise.resolve({
374
- ok: true,
375
- json: () =>
376
- Promise.resolve({
377
- balance: 100000000,
378
- tokens: [],
379
- address: 'tsys1q4v8sagt0znwaxdscrzhvu8t33n7vj8j45czpv4',
380
- }),
381
- } as any);
382
- }
383
- if (url.includes('fetchEstimateFee')) {
384
- return Promise.resolve({
385
- ok: true,
386
- json: () => Promise.resolve({ result: 10000 }),
387
- } as any);
388
- }
389
- // Default Ethereum RPC response
390
- return Promise.resolve({
391
- ok: true,
392
- json: () =>
393
- Promise.resolve({
394
- jsonrpc: '2.0',
395
- id: 1,
396
- result: '0x1',
397
- }),
398
- } as any);
399
- }) as any;
400
-
401
- // Clear storage before each test to ensure clean state
402
- beforeEach(() => {
403
- mockStorage.clear();
404
- });
405
-
406
- // Also clear after each test to prevent cross-test pollution
407
- afterEach(() => {
408
- mockStorage.clear();
409
- });
410
-
411
- // Helper function to set up a basic vault for tests
412
- global.setupTestVault = async (password = 'Asdqwe123!') => {
413
- const { sysweb3Di } = jest.requireMock('@sidhujag/sysweb3-core');
414
- const storage = sysweb3Di.getStateStorageDb();
415
-
416
- // Check if vault-keys already exist - if so, don't recreate them (idempotent)
417
- const existingVaultKeys = await storage.get('vault-keys');
418
- if (existingVaultKeys && existingVaultKeys.salt && existingVaultKeys.hash) {
419
- // Vault already set up, verify password matches
420
- const expectedHash = createHmac('sha512', existingVaultKeys.salt)
421
- .update(password)
422
- .digest('hex');
423
- if (expectedHash === existingVaultKeys.hash) {
424
- // Same password, vault is already correctly set up
425
- return;
426
- }
427
- // Different password - need to recreate
428
- }
429
-
430
- // Create a vault with plain mnemonic (it will be encrypted by storage)
431
- const CryptoJS = jest.requireActual('crypto-js');
432
- const mnemonic =
433
- 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about';
434
-
435
- // Vault should contain plain mnemonic - the storage layer handles encryption
436
- const vault = { mnemonic: mnemonic };
437
- const encryptedVault = CryptoJS.AES.encrypt(
438
- JSON.stringify(vault),
439
- password
440
- ).toString();
441
-
442
- await storage.set('vault', encryptedVault);
443
-
444
- // Use CONSISTENT salts for testing (not random) to prevent password validation mismatches
445
- const salt = 'test-salt-12345678901234567890123456789012'; // Fixed 32-char salt
446
- const hash = createHmac('sha512', salt).update(password).digest('hex');
447
-
448
- await storage.set('vault-keys', {
449
- hash,
450
- salt,
451
- });
452
- };
453
-
454
- // Create mock vault state utility function
455
- global.createMockVaultState = (options = {}) => {
456
- const {
457
- activeAccountId = 0,
458
- activeAccountType = KeyringAccountType.HDAccount,
459
- networkType = INetworkType.Syscoin,
460
- chainId,
461
- } = options;
462
-
463
- // Derive real addresses from the test seed phrase for consistency
464
- const testSeedPhrase =
465
- 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about';
466
- const testPassword = 'Asdqwe123!'; // Must match FAKE_PASSWORD from constants
467
-
468
- let address, xpub, xprv;
469
- if (networkType === INetworkType.Ethereum) {
470
- // Derive real EVM address from test seed
471
- const { HDNode } = jest.requireActual('@ethersproject/hdnode');
472
- const { getAddressDerivationPath } = jest.requireActual(
473
- '../../src/utils/derivation-paths'
474
- );
475
-
476
- const hdNode = HDNode.fromMnemonic(testSeedPhrase);
477
- const ethDerivationPath = getAddressDerivationPath(
478
- 'eth',
479
- 60,
480
- 0,
481
- false,
482
- activeAccountId
483
- );
484
- const derivedAccount = hdNode.derivePath(ethDerivationPath);
485
-
486
- address = derivedAccount.address;
487
- xpub = derivedAccount.publicKey;
488
-
489
- // Encrypt the private key like the real vault does
490
- const CryptoJS = jest.requireActual('crypto-js');
491
- const crypto = jest.requireActual('crypto');
492
- const salt = 'test-salt-12345678901234567890123456789012';
493
- const sessionPassword = crypto
494
- .createHmac('sha512', salt)
495
- .update(testPassword)
496
- .digest('hex');
497
- xprv = CryptoJS.AES.encrypt(
498
- derivedAccount.privateKey,
499
- sessionPassword
500
- ).toString();
501
- } else {
502
- // For UTXO, use syscoinjs to derive real xpub and address from test seed
503
- const { getSyscoinSigners } = jest.requireActual('../../src/signers');
504
- const { getNetworkConfig } = jest.requireActual(
505
- '@sidhujag/sysweb3-network'
506
- );
507
- const CryptoJS = jest.requireActual('crypto-js');
508
- const crypto = jest.requireActual('crypto');
509
-
510
- try {
511
- // Determine slip44 and coin name based on chainId
512
- const slip44 = chainId === 57 ? 57 : 1; // mainnet = 57, testnet = 1
513
- const currency = chainId === 57 ? 'SYS' : 'TSYS';
514
- const coinName = chainId === 57 ? 'Syscoin' : 'Syscoin Testnet'; // Use full coin names from coins.ts
515
-
516
- // Get network config for proper syscoin parameters
517
- const networkConfig = getNetworkConfig(slip44, coinName);
518
-
519
- // Create mock RPC config for syscoinjs
520
- const mockRpc = {
521
- formattedNetwork: {
522
- url:
523
- chainId === 57
524
- ? 'https://blockbook.elint.services/'
525
- : 'https://blockbook-dev.elint.services/',
526
- slip44,
527
- currency,
528
- chainId,
529
- },
530
- networkConfig,
531
- };
532
-
533
- // Use syscoinjs to create HD signer with proper network parameters
534
- const { hd } = getSyscoinSigners({
535
- mnemonic: testSeedPhrase,
536
- rpc: mockRpc,
537
- });
538
-
539
- // Create account at the specified index (synchronous)
540
- hd.createAccount(84);
541
- hd.setAccountIndex(activeAccountId);
542
-
543
- // Get the real xpub and address from syscoinjs
544
- xpub = hd.getAccountXpub();
545
- address = hd.createAddress(0, false, 84); // receiving address at index 0
546
- } catch (error) {
547
- // Fallback to known working addresses if syscoinjs derivation fails
548
- console.warn(
549
- 'Syscoinjs derivation failed, using fallback addresses:',
550
- error.message
551
- );
552
- if (chainId === 57) {
553
- // Use a known mainnet address format
554
- address = 'sys1q4kk5wqjwdzxh6zt7hpfj3zwrhv5v5v5ht8fqv8';
555
- xpub =
556
- 'zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wgmUn9Q5Vgg2KHJD5YQJpFHxhtQQh3yJiRMLrYjfF5VGN1yPYxkQWxgd6YWBvYcB';
557
- } else {
558
- // Use a known testnet address format
559
- address = 'tsys1qhkd3x4r8p5w2e5n9v3h8j2m4b6c9z7f5g3h2k7';
560
- xpub =
561
- 'tpubDDJC8T2bGJkQs6Qu7xRELGF9KNKpfF8nTy6tGNT7BudJw32VhJ7HkF7yGG7LfQ6SFGgM4V4MYWGCE7h4K7JbE7QGJFSD9P5a6f1vNMrDbqZ';
562
- }
563
- }
564
-
565
- // Encrypt a mock private key
566
- const salt = 'test-salt-12345678901234567890123456789012';
567
- const sessionPassword = crypto
568
- .createHmac('sha512', salt)
569
- .update(testPassword)
570
- .digest('hex');
571
- const mockPrivateKey =
572
- 'L1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef';
573
- xprv = CryptoJS.AES.encrypt(mockPrivateKey, sessionPassword).toString();
574
- }
575
-
576
- // Create mock networks structure
577
- const networks = {
578
- syscoin: {
579
- 57: {
580
- chainId: 57,
581
- currency: 'SYS',
582
- label: 'Syscoin Mainnet',
583
- url: 'https://blockbook.elint.services/',
584
- kind: INetworkType.Syscoin,
585
- explorer: 'https://explorer.syscoin.org/',
586
- slip44: 57,
587
- },
588
- 5700: {
589
- chainId: 5700,
590
- currency: 'TSYS',
591
- label: 'Syscoin Testnet',
592
- url: 'https://blockbook-dev.elint.services/',
593
- kind: INetworkType.Syscoin,
594
- explorer: 'https://explorer-testnet.syscoin.org/',
595
- slip44: 1,
596
- },
597
- },
598
- ethereum: {
599
- 1: {
600
- chainId: 1,
601
- currency: 'ETH',
602
- label: 'Ethereum Mainnet',
603
- url: 'https://rpc.ankr.com/eth',
604
- kind: INetworkType.Ethereum,
605
- explorer: 'https://etherscan.io/',
606
- slip44: 60,
607
- },
608
- 57: {
609
- chainId: 57,
610
- currency: 'SYS',
611
- label: 'Syscoin NEVM',
612
- url: 'https://rpc.syscoin.org',
613
- kind: INetworkType.Ethereum,
614
- explorer: 'https://explorer.syscoin.org/',
615
- slip44: 60,
616
- },
617
- 5700: {
618
- chainId: 5700,
619
- currency: 'TSYS',
620
- label: 'Syscoin NEVM Testnet',
621
- url: 'https://rpc.tanenbaum.io',
622
- kind: INetworkType.Ethereum,
623
- explorer: 'https://explorer.tanenbaum.io/',
624
- slip44: 60,
625
- },
626
- 137: {
627
- chainId: 137,
628
- currency: 'MATIC',
629
- label: 'Polygon',
630
- url: 'https://polygon-rpc.com',
631
- kind: INetworkType.Ethereum,
632
- explorer: 'https://polygonscan.com/',
633
- slip44: 60,
634
- },
635
- 80001: {
636
- chainId: 80001,
637
- currency: 'MATIC',
638
- label: 'Mumbai',
639
- url: 'https://rpc-mumbai.maticvigil.com',
640
- kind: INetworkType.Ethereum,
641
- explorer: 'https://mumbai.polygonscan.com/',
642
- slip44: 60,
643
- },
644
- },
645
- };
646
-
647
- // Determine the network based on type and chainId
648
- let activeNetwork;
649
- if (networkType === INetworkType.Syscoin) {
650
- const syscoinChainId = chainId || 57; // Default to mainnet
651
- activeNetwork = networks.syscoin[syscoinChainId];
652
- } else if (networkType === INetworkType.Ethereum) {
653
- const ethChainId = chainId || 1; // Default to Ethereum mainnet
654
- activeNetwork = networks.ethereum[ethChainId];
655
- } else {
656
- throw new Error(`Unsupported network type: ${networkType}`);
657
- }
658
-
659
- if (!activeNetwork) {
660
- throw new Error(
661
- `Network not found for type ${networkType} and chainId ${chainId}`
662
- );
663
- }
664
-
665
- // Create mock accounts structure with generic labels - tests should verify what keyring manager actually produces
666
- const accounts = {
667
- [KeyringAccountType.HDAccount]: {
668
- 0: {
669
- id: 0,
670
- address,
671
- xpub,
672
- xprv, // Now includes encrypted private key like real vault
673
- label: `Account 1`, // Generic label - tests should expect what keyring manager actually creates
674
- balances: { syscoin: 0, ethereum: 0 },
675
- isImported: false,
676
- isTrezorWallet: false,
677
- isLedgerWallet: false,
678
- assets: { syscoin: [], ethereum: [] },
679
- },
680
- },
681
- [KeyringAccountType.Imported]: {},
682
- [KeyringAccountType.Trezor]: {},
683
- [KeyringAccountType.Ledger]: {},
684
- };
685
-
686
- return {
687
- activeAccount: { id: activeAccountId, type: activeAccountType },
688
- accounts,
689
- activeNetwork,
690
- networks,
691
- isUnlocked: false,
692
- lastLogin: null,
693
- };
694
- };
695
-
696
- // Default mock vault state (for backward compatibility) - Ethereum mainnet by default
697
- (global as any).mockVaultState = global.createMockVaultState({
698
- networkType: INetworkType.Ethereum,
699
- chainId: 1,
700
- });
701
-
702
- // Export setupMocks function for use in test files
703
- export const setupMocks = () => {
704
- // Reset any global state
705
- jest.clearAllMocks();
706
-
707
- // Don't clear storage here - let the beforeEach/afterEach hooks handle it
708
- // This prevents clearing vault-keys between keyring creation and password validation
709
-
710
- // Reset vault data if it exists
711
- if ((global as any).storedVaultData) {
712
- (global as any).storedVaultData = null;
713
- }
714
- };