@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.
- package/dist/abi/defi-wrapper/GenericStrategy.d.ts +308 -0
- package/dist/abi/defi-wrapper/GenericStrategy.js +409 -0
- package/dist/abi/defi-wrapper/GenericStrategy.js.map +1 -0
- package/dist/abi/defi-wrapper/index.d.ts +1 -0
- package/dist/abi/defi-wrapper/index.js +1 -0
- package/dist/abi/defi-wrapper/index.js.map +1 -1
- package/dist/abi/defi-wrapper/sources.d.ts +103 -0
- package/dist/abi/defi-wrapper/sources.js +104 -0
- package/dist/abi/defi-wrapper/sources.js.map +1 -0
- package/dist/configs/deployed.d.ts +5 -0
- package/dist/configs/deployed.js +20 -2
- package/dist/configs/deployed.js.map +1 -1
- package/dist/configs/envs.js +2 -0
- package/dist/configs/envs.js.map +1 -1
- package/dist/contracts/defi-wrapper/generic-strategy.d.ts +5 -0
- package/dist/contracts/defi-wrapper/generic-strategy.js +12 -0
- package/dist/contracts/defi-wrapper/generic-strategy.js.map +1 -0
- package/dist/contracts/defi-wrapper/index.d.ts +1 -0
- package/dist/contracts/defi-wrapper/index.js +1 -0
- package/dist/contracts/defi-wrapper/index.js.map +1 -1
- package/dist/features/defi-wrapper/defi-wrapper-factory.d.ts +3 -0
- package/dist/features/defi-wrapper/defi-wrapper-factory.js +4 -1
- package/dist/features/defi-wrapper/defi-wrapper-factory.js.map +1 -1
- package/dist/features/defi-wrapper/index.d.ts +1 -0
- package/dist/features/defi-wrapper/index.js +1 -0
- package/dist/features/defi-wrapper/index.js.map +1 -1
- package/dist/features/defi-wrapper/pool-info.d.ts +18 -1
- package/dist/features/defi-wrapper/pool-info.js +47 -3
- package/dist/features/defi-wrapper/pool-info.js.map +1 -1
- package/dist/features/defi-wrapper/timelock-roles.d.ts +5 -0
- package/dist/features/defi-wrapper/timelock-roles.js +43 -0
- package/dist/features/defi-wrapper/timelock-roles.js.map +1 -0
- package/dist/features/defi-wrapper/timelock.d.ts +1 -6
- package/dist/features/defi-wrapper/timelock.js +2 -45
- package/dist/features/defi-wrapper/timelock.js.map +1 -1
- package/dist/features/defi-wrapper/verify-contracts.d.ts +20 -0
- package/dist/features/defi-wrapper/verify-contracts.js +145 -0
- package/dist/features/defi-wrapper/verify-contracts.js.map +1 -0
- package/dist/features/utils/try-fetch.js +2 -0
- package/dist/features/utils/try-fetch.js.map +1 -1
- package/dist/programs/account/write.js +2 -1
- package/dist/programs/account/write.js.map +1 -1
- package/dist/programs/defi-wrapper/contracts/factory/write.js +77 -6
- package/dist/programs/defi-wrapper/contracts/factory/write.js.map +1 -1
- package/dist/programs/defi-wrapper/contracts/index.d.ts +1 -0
- package/dist/programs/defi-wrapper/contracts/index.js +1 -0
- package/dist/programs/defi-wrapper/contracts/index.js.map +1 -1
- package/dist/programs/defi-wrapper/contracts/strategy/config.d.ts +3 -0
- package/dist/programs/defi-wrapper/contracts/strategy/config.js +40 -0
- package/dist/programs/defi-wrapper/contracts/strategy/config.js.map +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/index.d.ts +3 -0
- package/dist/programs/defi-wrapper/contracts/strategy/index.js +4 -0
- package/dist/programs/defi-wrapper/contracts/strategy/index.js.map +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/main.d.ts +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/main.js +6 -0
- package/dist/programs/defi-wrapper/contracts/strategy/main.js.map +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/read.d.ts +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/read.js +30 -0
- package/dist/programs/defi-wrapper/contracts/strategy/read.js.map +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/write.d.ts +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/write.js +34 -0
- package/dist/programs/defi-wrapper/contracts/strategy/write.js.map +1 -0
- package/dist/programs/defi-wrapper/contracts/stv-steth-pool/write.js +25 -21
- package/dist/programs/defi-wrapper/contracts/stv-steth-pool/write.js.map +1 -1
- package/dist/programs/defi-wrapper/contracts/withdrawal-queue/write.js +3 -4
- package/dist/programs/defi-wrapper/contracts/withdrawal-queue/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/distributor/write.js +1 -0
- package/dist/programs/defi-wrapper/use-cases/distributor/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/read.js +3 -3
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/read.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/write.js +3 -3
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/dashboard/write.js +3 -3
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/dashboard/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/index.d.ts +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/index.js +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/index.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/pool/write.js +4 -4
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/pool/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/proxy/write.js +3 -3
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/proxy/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/index.d.ts +2 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/index.js +3 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/index.js.map +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/main.d.ts +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/main.js +6 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/main.js.map +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/write.d.ts +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/write.js +57 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/write.js.map +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/withdrawal-queue/write.js +4 -4
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/withdrawal-queue/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/read.js +32 -11
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/read.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/write.js +14 -12
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/write.js.map +1 -1
- package/dist/programs/use-cases/consolidation/write.js +2 -0
- package/dist/programs/use-cases/consolidation/write.js.map +1 -1
- package/dist/providers/wallet.d.ts +88 -72
- package/dist/providers/wallet.js +74 -2
- package/dist/providers/wallet.js.map +1 -1
- package/dist/tests/integration/gas-estimation.test.d.ts +1 -0
- package/dist/tests/integration/gas-estimation.test.js +76 -0
- package/dist/tests/integration/gas-estimation.test.js.map +1 -0
- package/dist/tests/integration/helpers/test-client.d.ts +52 -52
- package/dist/tests/utils/arguments-security.test.d.ts +1 -0
- package/dist/tests/utils/arguments-security.test.js +34 -0
- package/dist/tests/utils/arguments-security.test.js.map +1 -0
- package/dist/tests/utils/arguments.test.js +2 -20
- package/dist/tests/utils/arguments.test.js.map +1 -1
- package/dist/tests/utils/cache-security.test.d.ts +1 -0
- package/dist/tests/utils/cache-security.test.js +62 -0
- package/dist/tests/utils/cache-security.test.js.map +1 -0
- package/dist/tests/utils/contract-write-stateoverride.test.d.ts +1 -0
- package/dist/tests/utils/contract-write-stateoverride.test.js +135 -0
- package/dist/tests/utils/contract-write-stateoverride.test.js.map +1 -0
- package/dist/tests/utils/data-validators.test.js +21 -5
- package/dist/tests/utils/data-validators.test.js.map +1 -1
- package/dist/tests/utils/deployed-security.test.d.ts +1 -0
- package/dist/tests/utils/deployed-security.test.js +51 -0
- package/dist/tests/utils/deployed-security.test.js.map +1 -0
- package/dist/tests/utils/get-confirmations.test.d.ts +1 -0
- package/dist/tests/utils/get-confirmations.test.js +40 -0
- package/dist/tests/utils/get-confirmations.test.js.map +1 -0
- package/dist/tests/utils/ipfs-security.test.d.ts +1 -0
- package/dist/tests/utils/ipfs-security.test.js +105 -0
- package/dist/tests/utils/ipfs-security.test.js.map +1 -0
- package/dist/tests/utils/public-client-gas-estimation.test.d.ts +1 -0
- package/dist/tests/utils/public-client-gas-estimation.test.js +231 -0
- package/dist/tests/utils/public-client-gas-estimation.test.js.map +1 -0
- package/dist/tests/utils/rate-limit-security.test.d.ts +1 -0
- package/dist/tests/utils/rate-limit-security.test.js +82 -0
- package/dist/tests/utils/rate-limit-security.test.js.map +1 -0
- package/dist/tests/utils/salt.test.d.ts +1 -0
- package/dist/tests/utils/salt.test.js +20 -0
- package/dist/tests/utils/salt.test.js.map +1 -0
- package/dist/utils/arguments.d.ts +2 -7
- package/dist/utils/arguments.js +21 -17
- package/dist/utils/arguments.js.map +1 -1
- package/dist/utils/cache.js +15 -13
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/data-validators.d.ts +3 -2
- package/dist/utils/data-validators.js +8 -11
- package/dist/utils/data-validators.js.map +1 -1
- package/dist/utils/fetch-cl.js +2 -1
- package/dist/utils/fetch-cl.js.map +1 -1
- package/dist/utils/index.d.ts +6 -5
- package/dist/utils/index.js +6 -5
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/ipfs.js +18 -1
- package/dist/utils/ipfs.js.map +1 -1
- package/dist/utils/logging/console.d.ts +1 -0
- package/dist/utils/logging/console.js +23 -2
- package/dist/utils/logging/console.js.map +1 -1
- package/dist/utils/prompts/account.d.ts +1 -0
- package/dist/utils/prompts/account.js +13 -0
- package/dist/utils/prompts/account.js.map +1 -0
- package/dist/utils/prompts/index.d.ts +3 -0
- package/dist/utils/prompts/index.js +3 -0
- package/dist/utils/prompts/index.js.map +1 -1
- package/dist/utils/prompts/strategy.d.ts +15398 -0
- package/dist/utils/prompts/strategy.js +10 -0
- package/dist/utils/prompts/strategy.js.map +1 -0
- package/dist/utils/prompts/timelock-roles.d.ts +1 -0
- package/dist/utils/prompts/timelock-roles.js +13 -0
- package/dist/utils/prompts/timelock-roles.js.map +1 -0
- package/dist/utils/rate-limit.d.ts +6 -9
- package/dist/utils/rate-limit.js +27 -5
- package/dist/utils/rate-limit.js.map +1 -1
- package/dist/utils/salt.d.ts +3 -0
- package/dist/utils/salt.js +8 -0
- package/dist/utils/salt.js.map +1 -0
- package/dist/utils/transactions/tx-private-key.d.ts +2 -1
- package/dist/utils/transactions/tx-private-key.js +5 -8
- package/dist/utils/transactions/tx-private-key.js.map +1 -1
- package/dist/utils/transactions/tx-wc.js +3 -7
- package/dist/utils/transactions/tx-wc.js.map +1 -1
- package/dist/utils/transactions/utils.d.ts +1 -0
- package/dist/utils/transactions/utils.js +12 -0
- package/dist/utils/transactions/utils.js.map +1 -1
- package/dist/version/index.js +1 -1
- 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 {
|
|
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:
|
|
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[];
|
package/dist/utils/arguments.js
CHANGED
|
@@ -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
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAgB,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAIlE,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE,CAC1C,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAa,EAAE,EAAE;IACnD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAa,EAAE,EAAE;IACtD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAa,EAAc,EAAE;IAC3D,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,OAAO;SACX,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,EAAE;IAChD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE;IAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../utils/arguments.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/cache.js
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
165
|
+
data = safeJsonParse(await fs.readFile(getIndexedEventsCacheFile(cacheKey), 'utf8'));
|
|
164
166
|
}
|
|
165
167
|
catch {
|
|
166
168
|
/* ignore */
|