@lidofinance/lsv-cli 1.7.0 → 1.8.0

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 (182) hide show
  1. package/dist/abi/defi-wrapper/GenericStrategy.d.ts +308 -0
  2. package/dist/abi/defi-wrapper/GenericStrategy.js +409 -0
  3. package/dist/abi/defi-wrapper/GenericStrategy.js.map +1 -0
  4. package/dist/abi/defi-wrapper/index.d.ts +1 -0
  5. package/dist/abi/defi-wrapper/index.js +1 -0
  6. package/dist/abi/defi-wrapper/index.js.map +1 -1
  7. package/dist/abi/defi-wrapper/sources.d.ts +103 -0
  8. package/dist/abi/defi-wrapper/sources.js +104 -0
  9. package/dist/abi/defi-wrapper/sources.js.map +1 -0
  10. package/dist/configs/deployed.d.ts +5 -0
  11. package/dist/configs/deployed.js +20 -2
  12. package/dist/configs/deployed.js.map +1 -1
  13. package/dist/configs/envs.js +2 -0
  14. package/dist/configs/envs.js.map +1 -1
  15. package/dist/contracts/defi-wrapper/generic-strategy.d.ts +5 -0
  16. package/dist/contracts/defi-wrapper/generic-strategy.js +12 -0
  17. package/dist/contracts/defi-wrapper/generic-strategy.js.map +1 -0
  18. package/dist/contracts/defi-wrapper/index.d.ts +1 -0
  19. package/dist/contracts/defi-wrapper/index.js +1 -0
  20. package/dist/contracts/defi-wrapper/index.js.map +1 -1
  21. package/dist/features/defi-wrapper/defi-wrapper-factory.d.ts +3 -0
  22. package/dist/features/defi-wrapper/defi-wrapper-factory.js +4 -1
  23. package/dist/features/defi-wrapper/defi-wrapper-factory.js.map +1 -1
  24. package/dist/features/defi-wrapper/index.d.ts +1 -0
  25. package/dist/features/defi-wrapper/index.js +1 -0
  26. package/dist/features/defi-wrapper/index.js.map +1 -1
  27. package/dist/features/defi-wrapper/pool-info.d.ts +18 -1
  28. package/dist/features/defi-wrapper/pool-info.js +47 -3
  29. package/dist/features/defi-wrapper/pool-info.js.map +1 -1
  30. package/dist/features/defi-wrapper/timelock-roles.d.ts +5 -0
  31. package/dist/features/defi-wrapper/timelock-roles.js +43 -0
  32. package/dist/features/defi-wrapper/timelock-roles.js.map +1 -0
  33. package/dist/features/defi-wrapper/timelock.d.ts +1 -6
  34. package/dist/features/defi-wrapper/timelock.js +2 -45
  35. package/dist/features/defi-wrapper/timelock.js.map +1 -1
  36. package/dist/features/defi-wrapper/verify-contracts.d.ts +20 -0
  37. package/dist/features/defi-wrapper/verify-contracts.js +145 -0
  38. package/dist/features/defi-wrapper/verify-contracts.js.map +1 -0
  39. package/dist/features/utils/try-fetch.js +2 -0
  40. package/dist/features/utils/try-fetch.js.map +1 -1
  41. package/dist/programs/account/write.js +2 -1
  42. package/dist/programs/account/write.js.map +1 -1
  43. package/dist/programs/defi-wrapper/contracts/factory/write.js +77 -6
  44. package/dist/programs/defi-wrapper/contracts/factory/write.js.map +1 -1
  45. package/dist/programs/defi-wrapper/contracts/index.d.ts +1 -0
  46. package/dist/programs/defi-wrapper/contracts/index.js +1 -0
  47. package/dist/programs/defi-wrapper/contracts/index.js.map +1 -1
  48. package/dist/programs/defi-wrapper/contracts/strategy/config.d.ts +3 -0
  49. package/dist/programs/defi-wrapper/contracts/strategy/config.js +40 -0
  50. package/dist/programs/defi-wrapper/contracts/strategy/config.js.map +1 -0
  51. package/dist/programs/defi-wrapper/contracts/strategy/index.d.ts +3 -0
  52. package/dist/programs/defi-wrapper/contracts/strategy/index.js +4 -0
  53. package/dist/programs/defi-wrapper/contracts/strategy/index.js.map +1 -0
  54. package/dist/programs/defi-wrapper/contracts/strategy/main.d.ts +1 -0
  55. package/dist/programs/defi-wrapper/contracts/strategy/main.js +6 -0
  56. package/dist/programs/defi-wrapper/contracts/strategy/main.js.map +1 -0
  57. package/dist/programs/defi-wrapper/contracts/strategy/read.d.ts +1 -0
  58. package/dist/programs/defi-wrapper/contracts/strategy/read.js +30 -0
  59. package/dist/programs/defi-wrapper/contracts/strategy/read.js.map +1 -0
  60. package/dist/programs/defi-wrapper/contracts/strategy/write.d.ts +1 -0
  61. package/dist/programs/defi-wrapper/contracts/strategy/write.js +34 -0
  62. package/dist/programs/defi-wrapper/contracts/strategy/write.js.map +1 -0
  63. package/dist/programs/defi-wrapper/contracts/stv-steth-pool/write.js +25 -21
  64. package/dist/programs/defi-wrapper/contracts/stv-steth-pool/write.js.map +1 -1
  65. package/dist/programs/defi-wrapper/contracts/withdrawal-queue/write.js +3 -4
  66. package/dist/programs/defi-wrapper/contracts/withdrawal-queue/write.js.map +1 -1
  67. package/dist/programs/defi-wrapper/use-cases/distributor/write.js +1 -0
  68. package/dist/programs/defi-wrapper/use-cases/distributor/write.js.map +1 -1
  69. package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/read.js +3 -3
  70. package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/read.js.map +1 -1
  71. package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/write.js +3 -3
  72. package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/write.js.map +1 -1
  73. package/dist/programs/defi-wrapper/use-cases/timelock-governance/dashboard/write.js +3 -3
  74. package/dist/programs/defi-wrapper/use-cases/timelock-governance/dashboard/write.js.map +1 -1
  75. package/dist/programs/defi-wrapper/use-cases/timelock-governance/index.d.ts +1 -0
  76. package/dist/programs/defi-wrapper/use-cases/timelock-governance/index.js +1 -0
  77. package/dist/programs/defi-wrapper/use-cases/timelock-governance/index.js.map +1 -1
  78. package/dist/programs/defi-wrapper/use-cases/timelock-governance/pool/write.js +4 -4
  79. package/dist/programs/defi-wrapper/use-cases/timelock-governance/pool/write.js.map +1 -1
  80. package/dist/programs/defi-wrapper/use-cases/timelock-governance/proxy/write.js +3 -3
  81. package/dist/programs/defi-wrapper/use-cases/timelock-governance/proxy/write.js.map +1 -1
  82. package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/index.d.ts +2 -0
  83. package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/index.js +3 -0
  84. package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/index.js.map +1 -0
  85. package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/main.d.ts +1 -0
  86. package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/main.js +6 -0
  87. package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/main.js.map +1 -0
  88. package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/write.d.ts +1 -0
  89. package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/write.js +57 -0
  90. package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/write.js.map +1 -0
  91. package/dist/programs/defi-wrapper/use-cases/timelock-governance/withdrawal-queue/write.js +4 -4
  92. package/dist/programs/defi-wrapper/use-cases/timelock-governance/withdrawal-queue/write.js.map +1 -1
  93. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/read.js +32 -11
  94. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/read.js.map +1 -1
  95. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/write.js +14 -12
  96. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/write.js.map +1 -1
  97. package/dist/programs/use-cases/consolidation/write.js +2 -0
  98. package/dist/programs/use-cases/consolidation/write.js.map +1 -1
  99. package/dist/providers/wallet.d.ts +88 -72
  100. package/dist/providers/wallet.js +74 -2
  101. package/dist/providers/wallet.js.map +1 -1
  102. package/dist/tests/integration/gas-estimation.test.d.ts +1 -0
  103. package/dist/tests/integration/gas-estimation.test.js +76 -0
  104. package/dist/tests/integration/gas-estimation.test.js.map +1 -0
  105. package/dist/tests/integration/helpers/test-client.d.ts +52 -52
  106. package/dist/tests/utils/arguments-security.test.d.ts +1 -0
  107. package/dist/tests/utils/arguments-security.test.js +34 -0
  108. package/dist/tests/utils/arguments-security.test.js.map +1 -0
  109. package/dist/tests/utils/arguments.test.js +2 -20
  110. package/dist/tests/utils/arguments.test.js.map +1 -1
  111. package/dist/tests/utils/cache-security.test.d.ts +1 -0
  112. package/dist/tests/utils/cache-security.test.js +62 -0
  113. package/dist/tests/utils/cache-security.test.js.map +1 -0
  114. package/dist/tests/utils/contract-write-stateoverride.test.d.ts +1 -0
  115. package/dist/tests/utils/contract-write-stateoverride.test.js +135 -0
  116. package/dist/tests/utils/contract-write-stateoverride.test.js.map +1 -0
  117. package/dist/tests/utils/data-validators.test.js +21 -5
  118. package/dist/tests/utils/data-validators.test.js.map +1 -1
  119. package/dist/tests/utils/deployed-security.test.d.ts +1 -0
  120. package/dist/tests/utils/deployed-security.test.js +51 -0
  121. package/dist/tests/utils/deployed-security.test.js.map +1 -0
  122. package/dist/tests/utils/get-confirmations.test.d.ts +1 -0
  123. package/dist/tests/utils/get-confirmations.test.js +40 -0
  124. package/dist/tests/utils/get-confirmations.test.js.map +1 -0
  125. package/dist/tests/utils/ipfs-security.test.d.ts +1 -0
  126. package/dist/tests/utils/ipfs-security.test.js +105 -0
  127. package/dist/tests/utils/ipfs-security.test.js.map +1 -0
  128. package/dist/tests/utils/public-client-gas-estimation.test.d.ts +1 -0
  129. package/dist/tests/utils/public-client-gas-estimation.test.js +231 -0
  130. package/dist/tests/utils/public-client-gas-estimation.test.js.map +1 -0
  131. package/dist/tests/utils/rate-limit-security.test.d.ts +1 -0
  132. package/dist/tests/utils/rate-limit-security.test.js +82 -0
  133. package/dist/tests/utils/rate-limit-security.test.js.map +1 -0
  134. package/dist/tests/utils/salt.test.d.ts +1 -0
  135. package/dist/tests/utils/salt.test.js +20 -0
  136. package/dist/tests/utils/salt.test.js.map +1 -0
  137. package/dist/utils/arguments.d.ts +2 -7
  138. package/dist/utils/arguments.js +21 -17
  139. package/dist/utils/arguments.js.map +1 -1
  140. package/dist/utils/cache.js +15 -13
  141. package/dist/utils/cache.js.map +1 -1
  142. package/dist/utils/data-validators.d.ts +3 -2
  143. package/dist/utils/data-validators.js +8 -11
  144. package/dist/utils/data-validators.js.map +1 -1
  145. package/dist/utils/fetch-cl.js +2 -1
  146. package/dist/utils/fetch-cl.js.map +1 -1
  147. package/dist/utils/index.d.ts +6 -5
  148. package/dist/utils/index.js +6 -5
  149. package/dist/utils/index.js.map +1 -1
  150. package/dist/utils/ipfs.js +18 -1
  151. package/dist/utils/ipfs.js.map +1 -1
  152. package/dist/utils/logging/console.d.ts +1 -0
  153. package/dist/utils/logging/console.js +23 -2
  154. package/dist/utils/logging/console.js.map +1 -1
  155. package/dist/utils/prompts/account.d.ts +1 -0
  156. package/dist/utils/prompts/account.js +13 -0
  157. package/dist/utils/prompts/account.js.map +1 -0
  158. package/dist/utils/prompts/index.d.ts +3 -0
  159. package/dist/utils/prompts/index.js +3 -0
  160. package/dist/utils/prompts/index.js.map +1 -1
  161. package/dist/utils/prompts/strategy.d.ts +15398 -0
  162. package/dist/utils/prompts/strategy.js +10 -0
  163. package/dist/utils/prompts/strategy.js.map +1 -0
  164. package/dist/utils/prompts/timelock-roles.d.ts +1 -0
  165. package/dist/utils/prompts/timelock-roles.js +13 -0
  166. package/dist/utils/prompts/timelock-roles.js.map +1 -0
  167. package/dist/utils/rate-limit.d.ts +6 -9
  168. package/dist/utils/rate-limit.js +27 -5
  169. package/dist/utils/rate-limit.js.map +1 -1
  170. package/dist/utils/salt.d.ts +3 -0
  171. package/dist/utils/salt.js +8 -0
  172. package/dist/utils/salt.js.map +1 -0
  173. package/dist/utils/transactions/tx-private-key.d.ts +2 -1
  174. package/dist/utils/transactions/tx-private-key.js +5 -8
  175. package/dist/utils/transactions/tx-private-key.js.map +1 -1
  176. package/dist/utils/transactions/tx-wc.js +3 -7
  177. package/dist/utils/transactions/tx-wc.js.map +1 -1
  178. package/dist/utils/transactions/utils.d.ts +1 -0
  179. package/dist/utils/transactions/utils.js +12 -0
  180. package/dist/utils/transactions/utils.js.map +1 -1
  181. package/dist/version/index.js +1 -1
  182. package/package.json +3 -2
@@ -0,0 +1,231 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ const MAX_UINT256_HEX = '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff';
3
+ const MOCK_CHAIN = { id: 560048, name: 'hoodi' };
4
+ const MOCK_EL_URL = 'http://localhost:8545';
5
+ const MOCK_FROM = '0x1234567890abcdef1234567890abcdef12345678';
6
+ // Represents the raw RPC handler underneath the balanceAwareTransport wrapper
7
+ const mockRpcRequest = vi.fn();
8
+ vi.mock('viem', async (importOriginal) => {
9
+ const actual = (await importOriginal());
10
+ return {
11
+ ...actual,
12
+ // Return a minimal transport factory whose `request` we control
13
+ http: () => {
14
+ const factory = Object.assign(() => ({ request: mockRpcRequest }), {
15
+ config: { key: 'http' },
16
+ value: undefined,
17
+ });
18
+ return factory;
19
+ },
20
+ // Expose the transport's wrapped `request` directly on the client
21
+ createPublicClient: ({ transport }) => {
22
+ const instance = transport({ chain: MOCK_CHAIN });
23
+ return { chain: MOCK_CHAIN, request: instance.request };
24
+ },
25
+ };
26
+ });
27
+ vi.mock('command', () => ({
28
+ program: { opts: () => ({}) },
29
+ }));
30
+ vi.mock('../../configs/index.js', () => ({
31
+ getConfig: () => ({
32
+ PRIVATE_KEY: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
33
+ }),
34
+ getChainId: async () => 560048,
35
+ getElUrl: () => MOCK_EL_URL,
36
+ getChain: async () => MOCK_CHAIN,
37
+ envs: {},
38
+ }));
39
+ vi.mock('../../utils/index.js', () => ({
40
+ createWalletConnectClient: vi.fn(),
41
+ }));
42
+ vi.mock('ox', () => ({
43
+ Keystore: {},
44
+ }));
45
+ /**
46
+ * Tests for balanceAwareTransport — the transport-level wrapper that injects
47
+ * stateOverride into every eth_estimateGas RPC call to bypass the node's
48
+ * balance pre-check.
49
+ *
50
+ * We mock viem's http() transport so that `base.request` is our mockRpcRequest,
51
+ * then call the wrapped `request` directly to verify interception logic.
52
+ *
53
+ * vi.resetModules() in beforeEach ensures each test gets a fresh module with
54
+ * a clean nodeSupportsStateOverride cache.
55
+ */
56
+ describe('balanceAwareTransport (transport-level gas estimation fix)', () => {
57
+ beforeEach(() => {
58
+ vi.clearAllMocks();
59
+ vi.resetModules();
60
+ });
61
+ it('injects stateOverride with max balance into eth_estimateGas', async () => {
62
+ mockRpcRequest.mockResolvedValue('0x5208');
63
+ const { getPublicClient } = await import('../../providers/wallet.js');
64
+ const client = await getPublicClient();
65
+ await client.request({
66
+ method: 'eth_estimateGas',
67
+ params: [{ from: MOCK_FROM, to: '0xdead', data: '0x1234' }],
68
+ });
69
+ expect(mockRpcRequest).toHaveBeenCalledTimes(1);
70
+ const [[rpcCall]] = mockRpcRequest.mock.calls;
71
+ expect(rpcCall.method).toBe('eth_estimateGas');
72
+ expect(rpcCall.params).toHaveLength(3);
73
+ expect(rpcCall.params[0]).toEqual({
74
+ from: MOCK_FROM,
75
+ to: '0xdead',
76
+ data: '0x1234',
77
+ });
78
+ expect(rpcCall.params[1]).toBe('latest');
79
+ expect(rpcCall.params[2]).toEqual({
80
+ [MOCK_FROM]: { balance: MAX_UINT256_HEX },
81
+ });
82
+ });
83
+ it('preserves existing stateOverride entries and custom blockTag', async () => {
84
+ mockRpcRequest.mockResolvedValue('0x5208');
85
+ const { getPublicClient } = await import('../../providers/wallet.js');
86
+ const client = await getPublicClient();
87
+ const existing = {
88
+ '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa': { balance: '0x3e7' },
89
+ };
90
+ await client.request({
91
+ method: 'eth_estimateGas',
92
+ params: [{ from: MOCK_FROM, to: '0xdead' }, 'pending', existing],
93
+ });
94
+ const [[rpcCall]] = mockRpcRequest.mock.calls;
95
+ expect(rpcCall.params[1]).toBe('pending');
96
+ expect(rpcCall.params[2]).toEqual({
97
+ ...existing,
98
+ [MOCK_FROM]: { balance: MAX_UINT256_HEX },
99
+ });
100
+ });
101
+ it('falls back when RPC rejects stateOverride', async () => {
102
+ mockRpcRequest
103
+ .mockRejectedValueOnce(new Error('invalid argument 2: stateOverride'))
104
+ .mockResolvedValueOnce('0x5208');
105
+ const { getPublicClient } = await import('../../providers/wallet.js');
106
+ const client = await getPublicClient();
107
+ const result = await client.request({
108
+ method: 'eth_estimateGas',
109
+ params: [{ from: MOCK_FROM, to: '0xdead' }],
110
+ });
111
+ expect(result).toBe('0x5208');
112
+ expect(mockRpcRequest).toHaveBeenCalledTimes(2);
113
+ // Second call: original args without stateOverride
114
+ const [, [fallbackCall]] = mockRpcRequest.mock.calls;
115
+ expect(fallbackCall.params).toHaveLength(1);
116
+ });
117
+ it('falls back on "too many arguments"', async () => {
118
+ mockRpcRequest
119
+ .mockRejectedValueOnce(new Error('too many arguments, want at most 2'))
120
+ .mockResolvedValueOnce('0x5208');
121
+ const { getPublicClient } = await import('../../providers/wallet.js');
122
+ const client = await getPublicClient();
123
+ const result = await client.request({
124
+ method: 'eth_estimateGas',
125
+ params: [{ from: MOCK_FROM, to: '0xdead' }],
126
+ });
127
+ expect(result).toBe('0x5208');
128
+ expect(mockRpcRequest).toHaveBeenCalledTimes(2);
129
+ });
130
+ it('falls back on "invalid argument 2"', async () => {
131
+ mockRpcRequest
132
+ .mockRejectedValueOnce(new Error('invalid argument 2'))
133
+ .mockResolvedValueOnce('0x5208');
134
+ const { getPublicClient } = await import('../../providers/wallet.js');
135
+ const client = await getPublicClient();
136
+ const result = await client.request({
137
+ method: 'eth_estimateGas',
138
+ params: [{ from: MOCK_FROM, to: '0xdead' }],
139
+ });
140
+ expect(result).toBe('0x5208');
141
+ expect(mockRpcRequest).toHaveBeenCalledTimes(2);
142
+ });
143
+ it('re-throws real contract errors (not swallowed)', async () => {
144
+ mockRpcRequest.mockRejectedValue(new Error('execution reverted: ERC20: transfer amount exceeds balance'));
145
+ const { getPublicClient } = await import('../../providers/wallet.js');
146
+ const client = await getPublicClient();
147
+ await expect(client.request({
148
+ method: 'eth_estimateGas',
149
+ params: [{ from: MOCK_FROM, to: '0xdead' }],
150
+ })).rejects.toThrow('execution reverted');
151
+ // Should NOT retry — only 1 call
152
+ expect(mockRpcRequest).toHaveBeenCalledTimes(1);
153
+ });
154
+ it('skips override when no from address in params', async () => {
155
+ mockRpcRequest.mockResolvedValue('0x5208');
156
+ const { getPublicClient } = await import('../../providers/wallet.js');
157
+ const client = await getPublicClient();
158
+ await client.request({
159
+ method: 'eth_estimateGas',
160
+ params: [{ to: '0xdead', data: '0x1234' }],
161
+ });
162
+ expect(mockRpcRequest).toHaveBeenCalledTimes(1);
163
+ // Passed through unchanged — no stateOverride injected
164
+ const [[rpcCall]] = mockRpcRequest.mock.calls;
165
+ expect(rpcCall).toEqual({
166
+ method: 'eth_estimateGas',
167
+ params: [{ to: '0xdead', data: '0x1234' }],
168
+ });
169
+ });
170
+ it('passes non-estimateGas calls through unchanged', async () => {
171
+ mockRpcRequest.mockResolvedValue('0x1');
172
+ const { getPublicClient } = await import('../../providers/wallet.js');
173
+ const client = await getPublicClient();
174
+ await client.request({
175
+ method: 'eth_blockNumber',
176
+ params: [],
177
+ });
178
+ expect(mockRpcRequest).toHaveBeenCalledTimes(1);
179
+ const [[rpcCall]] = mockRpcRequest.mock.calls;
180
+ expect(rpcCall).toEqual({
181
+ method: 'eth_blockNumber',
182
+ params: [],
183
+ });
184
+ });
185
+ it('caches stateOverride support after first successful call', async () => {
186
+ mockRpcRequest.mockResolvedValue('0x5208');
187
+ const { getPublicClient } = await import('../../providers/wallet.js');
188
+ const client = await getPublicClient();
189
+ // First call — probes stateOverride support
190
+ await client.request({
191
+ method: 'eth_estimateGas',
192
+ params: [{ from: MOCK_FROM, to: '0xdead' }],
193
+ });
194
+ // Second call — should still inject stateOverride (cached: supported)
195
+ await client.request({
196
+ method: 'eth_estimateGas',
197
+ params: [{ from: MOCK_FROM, to: '0xbeef' }],
198
+ });
199
+ expect(mockRpcRequest).toHaveBeenCalledTimes(2);
200
+ // Both calls include stateOverride (3 params each)
201
+ const [[firstCall], [secondCall]] = mockRpcRequest.mock.calls;
202
+ expect(firstCall.params).toHaveLength(3);
203
+ expect(secondCall.params).toHaveLength(3);
204
+ });
205
+ it('skips stateOverride on subsequent calls after fallback (cached: unsupported)', async () => {
206
+ // First call: stateOverride fails → fallback
207
+ mockRpcRequest
208
+ .mockRejectedValueOnce(new Error('too many arguments, want at most 2'))
209
+ .mockResolvedValueOnce('0x5208');
210
+ const { getPublicClient } = await import('../../providers/wallet.js');
211
+ const client = await getPublicClient();
212
+ await client.request({
213
+ method: 'eth_estimateGas',
214
+ params: [{ from: MOCK_FROM, to: '0xdead' }],
215
+ });
216
+ expect(mockRpcRequest).toHaveBeenCalledTimes(2); // try + fallback
217
+ // Second call: should go directly to original (no stateOverride attempt)
218
+ mockRpcRequest.mockResolvedValueOnce('0x7530');
219
+ await client.request({
220
+ method: 'eth_estimateGas',
221
+ params: [{ from: MOCK_FROM, to: '0xbeef' }],
222
+ });
223
+ expect(mockRpcRequest).toHaveBeenCalledTimes(3); // 2 from first + 1 direct
224
+ // Third RPC call: original args, no stateOverride
225
+ // .at(-1) is safe here — we just asserted toHaveBeenCalledTimes(3)
226
+ const directCall = mockRpcRequest.mock.calls.at(-1)[0];
227
+ expect(directCall.params).toHaveLength(1);
228
+ expect(directCall.params[0]).toEqual({ from: MOCK_FROM, to: '0xbeef' });
229
+ });
230
+ });
231
+ //# sourceMappingURL=public-client-gas-estimation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-client-gas-estimation.test.js","sourceRoot":"","sources":["../../../tests/utils/public-client-gas-estimation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,82 @@
1
+ import { describe, test, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { executeBatchedWithRateLimit } from '../../utils/rate-limit.js';
3
+ describe('rate-limit batch size clamping (L4)', () => {
4
+ const originalEnv = process.env;
5
+ beforeEach(() => {
6
+ vi.useFakeTimers();
7
+ process.env = { ...originalEnv };
8
+ delete process.env.RATE_LIMIT_BATCH_SIZE;
9
+ delete process.env.RATE_LIMIT_DELAY_MS;
10
+ });
11
+ afterEach(() => {
12
+ vi.useRealTimers();
13
+ process.env = originalEnv;
14
+ });
15
+ test('clamps env batch size to minimum 1 when set to 0', async () => {
16
+ process.env.RATE_LIMIT_BATCH_SIZE = '0';
17
+ const items = [1, 2, 3];
18
+ const executor = vi.fn(async (item) => item);
19
+ const promise = executeBatchedWithRateLimit(items, executor);
20
+ await vi.advanceTimersByTimeAsync(0);
21
+ expect(executor).toHaveBeenCalledTimes(1);
22
+ await vi.advanceTimersByTimeAsync(500);
23
+ expect(executor).toHaveBeenCalledTimes(2);
24
+ await vi.advanceTimersByTimeAsync(500);
25
+ expect(executor).toHaveBeenCalledTimes(3);
26
+ const results = await promise;
27
+ expect(results).toEqual([1, 2, 3]);
28
+ });
29
+ test('clamps env batch size to minimum 1 when negative', async () => {
30
+ process.env.RATE_LIMIT_BATCH_SIZE = '-5';
31
+ const items = [1, 2];
32
+ const executor = vi.fn(async (item) => item);
33
+ const promise = executeBatchedWithRateLimit(items, executor);
34
+ await vi.advanceTimersByTimeAsync(0);
35
+ expect(executor).toHaveBeenCalledTimes(1);
36
+ await vi.advanceTimersByTimeAsync(500);
37
+ expect(executor).toHaveBeenCalledTimes(2);
38
+ const results = await promise;
39
+ expect(results).toEqual([1, 2]);
40
+ });
41
+ test('clamps env delay to minimum 0 when negative', async () => {
42
+ process.env.RATE_LIMIT_DELAY_MS = '-100';
43
+ const items = [1, 2, 3, 4];
44
+ const executor = vi.fn(async (item) => item);
45
+ const promise = executeBatchedWithRateLimit(items, executor, 2);
46
+ await vi.advanceTimersByTimeAsync(0);
47
+ expect(executor).toHaveBeenCalledTimes(4);
48
+ const results = await promise;
49
+ expect(results).toEqual([1, 2, 3, 4]);
50
+ });
51
+ test('falls back to default when env batch size is NaN', async () => {
52
+ process.env.RATE_LIMIT_BATCH_SIZE = 'abc';
53
+ const items = Array.from({ length: 250 }, (_, i) => i + 1);
54
+ const executor = vi.fn(async (item) => item);
55
+ const promise = executeBatchedWithRateLimit(items, executor);
56
+ // Should use default batch size (120), not NaN
57
+ await vi.advanceTimersByTimeAsync(0);
58
+ expect(executor).toHaveBeenCalledTimes(120);
59
+ await vi.advanceTimersByTimeAsync(500);
60
+ expect(executor).toHaveBeenCalledTimes(240);
61
+ await vi.advanceTimersByTimeAsync(500);
62
+ expect(executor).toHaveBeenCalledTimes(250);
63
+ const results = await promise;
64
+ expect(results).toEqual(items);
65
+ });
66
+ test('falls back to default when env delay is NaN', async () => {
67
+ process.env.RATE_LIMIT_DELAY_MS = 'xyz';
68
+ const items = [1, 2, 3, 4];
69
+ const executor = vi.fn(async (item) => item);
70
+ const promise = executeBatchedWithRateLimit(items, executor, 2);
71
+ await vi.advanceTimersByTimeAsync(0);
72
+ expect(executor).toHaveBeenCalledTimes(2);
73
+ // Should use default delay (500ms), not NaN
74
+ await vi.advanceTimersByTimeAsync(400);
75
+ expect(executor).toHaveBeenCalledTimes(2);
76
+ await vi.advanceTimersByTimeAsync(100);
77
+ expect(executor).toHaveBeenCalledTimes(4);
78
+ const results = await promise;
79
+ expect(results).toEqual([1, 2, 3, 4]);
80
+ });
81
+ });
82
+ //# sourceMappingURL=rate-limit-security.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-security.test.js","sourceRoot":"","sources":["../../../tests/utils/rate-limit-security.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { zeroHash } from 'viem';
3
+ import { DEFAULT_SALT, processSalt } from '../../utils/salt.js';
4
+ describe('salt', () => {
5
+ describe('DEFAULT_SALT', () => {
6
+ test('equals viem zeroHash', () => {
7
+ expect(DEFAULT_SALT).toBe(zeroHash);
8
+ });
9
+ });
10
+ describe('processSalt', () => {
11
+ test('returns provided salt when given', () => {
12
+ const salt = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef';
13
+ expect(processSalt(salt)).toBe(salt);
14
+ });
15
+ test('returns DEFAULT_SALT when called with no arguments', () => {
16
+ expect(processSalt()).toBe(DEFAULT_SALT);
17
+ });
18
+ });
19
+ });
20
+ //# sourceMappingURL=salt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"salt.test.js","sourceRoot":"","sources":["../../../tests/utils/salt.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEhE,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAChC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC5C,MAAM,IAAI,GACR,oEAAoE,CAAC;YACvE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC9D,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { Permit, RoleAssignment, Tier, Deposit, ValidatorTopUp } from '../types/index.js';
1
+ import { RoleAssignment, Deposit, ValidatorTopUp } from '../types/index.js';
2
2
  import { Address, Hex } from 'viem';
3
3
  import { PubkeyMap } from '../utils/consolidation/types.js';
4
4
  export declare const stringToBigIntArray: (value: string) => bigint[];
@@ -6,10 +6,9 @@ export declare const stringToBigIntArrayWei: (value: string) => bigint[];
6
6
  export declare const stringTo2dArray: (value: string) => string[][];
7
7
  export declare const stringToHexArray: (value: string) => `0x${string}`[];
8
8
  export declare const stringToHex: (value: string) => `0x${string}`;
9
- export declare const jsonToPermit: (value: string) => Permit;
10
9
  export declare const jsonFileToPubkeys: (value: string) => PubkeyMap;
11
10
  export declare const jsonToRoleAssignment: (value: string) => RoleAssignment[];
12
- export declare const stringToBigInt: BigIntConstructor;
11
+ export declare const stringToBigInt: (value: string) => bigint;
13
12
  export declare const stringToNumberArray: (value: string) => number[];
14
13
  export declare const stringArrayToTokenPairs: (value: string, prev?: {
15
14
  result: {
@@ -25,13 +24,9 @@ export declare const stringArrayToTokenPairs: (value: string, prev?: {
25
24
  isAmount: boolean;
26
25
  };
27
26
  export declare const etherToWei: (value: string) => bigint;
28
- export declare const etherToGwei: (value: string) => bigint;
29
27
  export declare const etherToWeiArray: (value: string) => bigint[];
30
- export declare const etherToGweiArray: (value: string) => bigint[];
31
28
  export declare const stringToNumber: (value: string) => number;
32
29
  export declare const stringToBoolean: (value: string) => boolean;
33
- export declare const parseTiers: (value: string) => Tier[];
34
- export declare const parseTier: (value: string) => Tier;
35
30
  export declare const parseDeposit: (str: string) => Deposit;
36
31
  export declare const parseDepositArray: (str: string) => Deposit[];
37
32
  export declare const parseValidatorTopUpArray: (str: string) => ValidatorTopUp[];
@@ -21,9 +21,6 @@ export const stringToHexArray = (value) => {
21
21
  export const stringToHex = (value) => {
22
22
  return toHex(value);
23
23
  };
24
- export const jsonToPermit = (value) => {
25
- return JSON.parse(value);
26
- };
27
24
  export const jsonFileToPubkeys = (value) => {
28
25
  const content = readFileSync(value, 'utf8');
29
26
  if (content.length === 0) {
@@ -49,9 +46,28 @@ export const jsonFileToPubkeys = (value) => {
49
46
  return parsed;
50
47
  };
51
48
  export const jsonToRoleAssignment = (value) => {
52
- return JSON.parse(value);
49
+ const parsed = JSON.parse(value);
50
+ if (!Array.isArray(parsed)) {
51
+ throw new TypeError('Invalid RoleAssignment JSON: must be an array');
52
+ }
53
+ for (const item of parsed) {
54
+ if (typeof item !== 'object' ||
55
+ item === null ||
56
+ !('account' in item) ||
57
+ !('role' in item)) {
58
+ throw new TypeError('Invalid RoleAssignment entry: each must contain account and role fields');
59
+ }
60
+ }
61
+ return parsed;
62
+ };
63
+ export const stringToBigInt = (value) => {
64
+ try {
65
+ return BigInt(value);
66
+ }
67
+ catch {
68
+ program.error(`Invalid BigInt value: ${value}`, { exitCode: 1 });
69
+ }
53
70
  };
54
- export const stringToBigInt = BigInt;
55
71
  export const stringToNumberArray = (value) => {
56
72
  return value.split(',').map(Number);
57
73
  };
@@ -83,15 +99,9 @@ export const stringArrayToTokenPairs = (value, prev = undefined) => {
83
99
  export const etherToWei = (value) => {
84
100
  return parseEther(value, 'wei');
85
101
  };
86
- export const etherToGwei = (value) => {
87
- return parseEther(value, 'gwei');
88
- };
89
102
  export const etherToWeiArray = (value) => {
90
103
  return value.split(',').map(etherToWei);
91
104
  };
92
- export const etherToGweiArray = (value) => {
93
- return value.split(',').map(etherToGwei);
94
- };
95
105
  export const stringToNumber = (value) => {
96
106
  if (Number.isNaN(Number(value)) || Number(value) < 0) {
97
107
  program.error('value must be a positive number', { exitCode: 1 });
@@ -106,12 +116,6 @@ export const stringToBoolean = (value) => {
106
116
  return false;
107
117
  program.error('value must be true or false', { exitCode: 1 });
108
118
  };
109
- export const parseTiers = (value) => {
110
- return JSON.parse(value);
111
- };
112
- export const parseTier = (value) => {
113
- return JSON.parse(value);
114
- };
115
119
  export const parseDeposit = (str) => {
116
120
  const trimmed = str.trim();
117
121
  if (!trimmed) {
@@ -1 +1 @@
1
- {"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../utils/arguments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../utils/arguments.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ import path from 'node:path';
3
3
  import { calculateShareRate } from './share-rate.js';
4
4
  import { calculateRebaseReward } from './rebase-rewards.js';
5
5
  import { logInfo } from './logging/index.js';
6
+ const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
7
+ const safeJsonParse = (text) => JSON.parse(text, (key, value) => DANGEROUS_KEYS.has(key) ? undefined : value);
6
8
  const getShareRateCacheFile = () => path.resolve('cache', `share-rate-cache-global.json`);
7
9
  const getRebaseRewardCacheFile = (vaultAddress) => path.resolve('cache', `rebase-rewards-cache-${vaultAddress}.json`);
8
10
  const getNodeOperatorFeeRateCacheFile = (vaultAddress) => path.resolve('cache', `node-operator-fee-rate-cache-${vaultAddress}.json`);
@@ -12,7 +14,7 @@ const getNodeOperatorAccruedFeeCacheFile = (vaultAddress) => path.resolve('cache
12
14
  export const cache = {
13
15
  async getShareRate(blockNumber) {
14
16
  try {
15
- const data = JSON.parse(await fs.readFile(getShareRateCacheFile(), 'utf8'));
17
+ const data = safeJsonParse(await fs.readFile(getShareRateCacheFile(), 'utf8'));
16
18
  if (data[blockNumber] !== undefined)
17
19
  return BigInt(data[blockNumber]);
18
20
  }
@@ -24,7 +26,7 @@ export const cache = {
24
26
  async setShareRate(blockNumber, value) {
25
27
  let data = {};
26
28
  try {
27
- data = JSON.parse(await fs.readFile(getShareRateCacheFile(), 'utf8'));
29
+ data = safeJsonParse(await fs.readFile(getShareRateCacheFile(), 'utf8'));
28
30
  }
29
31
  catch {
30
32
  /* ignore */
@@ -37,7 +39,7 @@ export const cache = {
37
39
  },
38
40
  async getRebaseReward(vaultAddress, cacheKey) {
39
41
  try {
40
- const data = JSON.parse(await fs.readFile(getRebaseRewardCacheFile(vaultAddress), 'utf8'));
42
+ const data = safeJsonParse(await fs.readFile(getRebaseRewardCacheFile(vaultAddress), 'utf8'));
41
43
  if (data[cacheKey] !== undefined)
42
44
  return BigInt(data[cacheKey]);
43
45
  }
@@ -49,7 +51,7 @@ export const cache = {
49
51
  async setRebaseReward(vaultAddress, cacheKey, value) {
50
52
  let data = {};
51
53
  try {
52
- data = JSON.parse(await fs.readFile(getRebaseRewardCacheFile(vaultAddress), 'utf8'));
54
+ data = safeJsonParse(await fs.readFile(getRebaseRewardCacheFile(vaultAddress), 'utf8'));
53
55
  }
54
56
  catch {
55
57
  /* ignore */
@@ -62,7 +64,7 @@ export const cache = {
62
64
  },
63
65
  async getNodeOperatorFeeRate(vaultAddress, blockNumber) {
64
66
  try {
65
- const data = JSON.parse(await fs.readFile(getNodeOperatorFeeRateCacheFile(vaultAddress), 'utf8'));
67
+ const data = safeJsonParse(await fs.readFile(getNodeOperatorFeeRateCacheFile(vaultAddress), 'utf8'));
66
68
  if (data[blockNumber] !== undefined)
67
69
  return BigInt(data[blockNumber]);
68
70
  }
@@ -74,7 +76,7 @@ export const cache = {
74
76
  async setNodeOperatorFeeRate(vaultAddress, blockNumber, value) {
75
77
  let data = {};
76
78
  try {
77
- data = JSON.parse(await fs.readFile(getNodeOperatorFeeRateCacheFile(vaultAddress), 'utf8'));
79
+ data = safeJsonParse(await fs.readFile(getNodeOperatorFeeRateCacheFile(vaultAddress), 'utf8'));
78
80
  }
79
81
  catch {
80
82
  /* ignore */
@@ -87,7 +89,7 @@ export const cache = {
87
89
  },
88
90
  async getSettledGrowth(vaultAddress, blockNumber) {
89
91
  try {
90
- const data = JSON.parse(await fs.readFile(getSettledGrowthCacheFile(vaultAddress), 'utf8'));
92
+ const data = safeJsonParse(await fs.readFile(getSettledGrowthCacheFile(vaultAddress), 'utf8'));
91
93
  if (data[blockNumber] !== undefined)
92
94
  return BigInt(data[blockNumber]);
93
95
  }
@@ -99,7 +101,7 @@ export const cache = {
99
101
  async setSettledGrowth(vaultAddress, blockNumber, value) {
100
102
  let data = {};
101
103
  try {
102
- data = JSON.parse(await fs.readFile(getSettledGrowthCacheFile(vaultAddress), 'utf8'));
104
+ data = safeJsonParse(await fs.readFile(getSettledGrowthCacheFile(vaultAddress), 'utf8'));
103
105
  }
104
106
  catch {
105
107
  /* ignore */
@@ -112,7 +114,7 @@ export const cache = {
112
114
  },
113
115
  async getNodeOperatorAccruedFee(vaultAddress, blockNumber) {
114
116
  try {
115
- const data = JSON.parse(await fs.readFile(getNodeOperatorAccruedFeeCacheFile(vaultAddress), 'utf8'));
117
+ const data = safeJsonParse(await fs.readFile(getNodeOperatorAccruedFeeCacheFile(vaultAddress), 'utf8'));
116
118
  if (data[blockNumber] !== undefined)
117
119
  return BigInt(data[blockNumber]);
118
120
  }
@@ -124,7 +126,7 @@ export const cache = {
124
126
  async setNodeOperatorAccruedFee(vaultAddress, blockNumber, value) {
125
127
  let data = {};
126
128
  try {
127
- data = JSON.parse(await fs.readFile(getNodeOperatorAccruedFeeCacheFile(vaultAddress), 'utf8'));
129
+ data = safeJsonParse(await fs.readFile(getNodeOperatorAccruedFeeCacheFile(vaultAddress), 'utf8'));
128
130
  }
129
131
  catch {
130
132
  /* ignore */
@@ -137,7 +139,7 @@ export const cache = {
137
139
  },
138
140
  async getIndexedEventsByBlock(cacheKey, blockNumber) {
139
141
  try {
140
- const data = JSON.parse(await fs.readFile(getIndexedEventsCacheFile(cacheKey), 'utf8'));
142
+ const data = safeJsonParse(await fs.readFile(getIndexedEventsCacheFile(cacheKey), 'utf8'));
141
143
  const key = blockNumber.toString();
142
144
  if (data[key] !== undefined)
143
145
  return data[key];
@@ -149,7 +151,7 @@ export const cache = {
149
151
  },
150
152
  async getAllIndexedEvents(cacheKey) {
151
153
  try {
152
- const data = JSON.parse(await fs.readFile(getIndexedEventsCacheFile(cacheKey), 'utf8'));
154
+ const data = safeJsonParse(await fs.readFile(getIndexedEventsCacheFile(cacheKey), 'utf8'));
153
155
  return data;
154
156
  }
155
157
  catch {
@@ -160,7 +162,7 @@ export const cache = {
160
162
  async setIndexedEventsForBlocks(cacheKey, eventsMap) {
161
163
  let data = {};
162
164
  try {
163
- data = JSON.parse(await fs.readFile(getIndexedEventsCacheFile(cacheKey), 'utf8'));
165
+ data = safeJsonParse(await fs.readFile(getIndexedEventsCacheFile(cacheKey), 'utf8'));
164
166
  }
165
167
  catch {
166
168
  /* ignore */