Skip to content

Commit 106e1da

Browse files
committed
feat: added retrie and block by step fetch log
1 parent a2dbe38 commit 106e1da

File tree

5 files changed

+80
-46
lines changed

5 files changed

+80
-46
lines changed

src/common/config/env.validation.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ export class EnvironmentVariables {
9696
@Transform(({ value }) => value === 'true')
9797
@IsBoolean()
9898
IS_SERVICE_UNAVAILABLE = false;
99+
100+
@IsOptional()
101+
@IsNumber()
102+
EL_RETRY_COUNT = 2;
103+
104+
@IsOptional()
105+
@IsNumber()
106+
EL_BLOCK_STEP = 500;
99107
}
100108
export const ENV_KEYS = Object.keys(new EnvironmentVariables());
101109

src/common/execution-provider/execution-provider.service.ts

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
import { SimpleFallbackJsonRpcBatchProvider } from '@lido-nestjs/execution';
22
import { CHAINS } from '@lido-nestjs/constants';
3-
import { Injectable } from '@nestjs/common';
3+
import { Inject, Injectable } from '@nestjs/common';
44
import { ethers } from 'ethers';
55
import { ConfigService } from '@nestjs/config';
66
import { PrometheusService } from '../prometheus';
7+
import { Filter, Log } from '@ethersproject/abstract-provider';
8+
import { LoggerService } from '@lido-nestjs/logger';
9+
import { LOGGER_PROVIDER } from '../logger';
710

811
@Injectable()
912
export class ExecutionProviderService {
1013
constructor(
1114
protected readonly provider: SimpleFallbackJsonRpcBatchProvider,
1215
protected readonly prometheusService: PrometheusService,
1316
protected readonly configService: ConfigService,
17+
@Inject(LOGGER_PROVIDER) protected readonly logger: LoggerService,
1418
) {}
1519

1620
/**
@@ -44,4 +48,52 @@ export class ExecutionProviderService {
4448
throw error;
4549
}
4650
}
51+
52+
public async getLogsByBlockStepsWithRetry(
53+
filter: Filter,
54+
eventName: string,
55+
serviceName: string,
56+
retryCount = this.configService.get('EL_RETRY_COUNT'),
57+
blockStep = this.configService.get('EL_BLOCK_STEP'),
58+
): Promise<Log[]> {
59+
let logs: Log[] = [];
60+
const latestBlock = await this.provider.getBlockNumber();
61+
62+
const fromBlock = Number(filter.fromBlock) ?? 0;
63+
const toBlock = typeof filter.toBlock === 'string' ? latestBlock : Number(filter.toBlock);
64+
65+
for (let startBlock = fromBlock; startBlock <= toBlock; startBlock += blockStep) {
66+
const endBlock = Math.min(startBlock + blockStep - 1, toBlock);
67+
68+
const blockFilter = { ...filter, fromBlock: startBlock, toBlock: endBlock };
69+
70+
let attempt = 0;
71+
let blockLogs: Log[] = [];
72+
73+
while (blockLogs.length === 0 && attempt < retryCount) {
74+
try {
75+
blockLogs = await this.provider.getLogs(blockFilter);
76+
} catch (error) {
77+
this.logger.error(`${eventName}: Error fetching logs for blocks ${startBlock} - ${endBlock}: ${error}`, {
78+
service: serviceName,
79+
});
80+
}
81+
82+
if (blockLogs.length === 0) {
83+
this.logger.warn(
84+
`${eventName}: No logs found for blocks ${startBlock} - ${endBlock}. Retrying in 200 ms...`,
85+
{
86+
service: serviceName,
87+
},
88+
);
89+
await new Promise((resolve) => setTimeout(resolve, 200));
90+
}
91+
attempt += 1;
92+
}
93+
94+
logs = logs.concat(blockLogs);
95+
}
96+
97+
return logs;
98+
}
4799
}

src/common/sweep/sweep.service.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@ export class SweepService {
121121
pendingPartialWithdrawalsNumber,
122122
pendingPartialWithdrawalsMaxNumberInCycle,
123123
);
124-
125124
return validatorsWithdrawalsNumber + pendingPartialWithdrawalsNumberInCycle;
126125
}
127126

src/events/rewards/rewards.service.ts

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ import { LOGGER_PROVIDER, LoggerService } from '../../common/logger';
2121
import { ConfigService } from '../../common/config';
2222
import { ContractConfigStorageService, RewardsStorageService } from '../../storage';
2323
import { PrometheusService } from '../../common/prometheus';
24-
25-
import { getLogsByRetryCount } from './rewards.utils';
24+
import { ExecutionProviderService } from '../../common/execution-provider';
2625

2726
@Injectable()
2827
export class RewardsService {
@@ -37,6 +36,7 @@ export class RewardsService {
3736
protected readonly contractConfig: ContractConfigStorageService,
3837
protected readonly configService: ConfigService,
3938
protected readonly provider: SimpleFallbackJsonRpcBatchProvider,
39+
protected readonly executionProvider: ExecutionProviderService,
4040
) {}
4141

4242
/**
@@ -147,12 +147,17 @@ export class RewardsService {
147147

148148
protected async getElRewards(fromBlock: number): Promise<BigNumber> {
149149
const res = this.contractLido.filters.ELRewardsReceived();
150-
const logs = await this.provider.getLogs({
151-
topics: res.topics,
152-
toBlock: 'latest',
153-
fromBlock,
154-
address: res.address,
155-
});
150+
151+
const logs = await this.executionProvider.getLogsByBlockStepsWithRetry(
152+
{
153+
topics: res.topics,
154+
toBlock: 'latest',
155+
fromBlock,
156+
address: res.address,
157+
},
158+
'ELRewardsReceived',
159+
RewardsService.SERVICE_LOG_NAME,
160+
);
156161
const lastLog = logs[0];
157162

158163
if (!lastLog) {
@@ -170,16 +175,15 @@ export class RewardsService {
170175
postCLBalance: BigNumber;
171176
}> {
172177
const res = this.contractLido.filters.ETHDistributed();
173-
const logs = await getLogsByRetryCount(
174-
this.provider,
178+
const logs = await this.executionProvider.getLogsByBlockStepsWithRetry(
175179
{
176180
topics: res.topics,
177181
toBlock: 'latest',
178182
fromBlock,
179183
address: res.address,
180184
},
181-
this.logger,
182185
'ETHDistributed',
186+
RewardsService.SERVICE_LOG_NAME,
183187
);
184188

185189
this.logger.log('ETHDistributed event logs', { service: RewardsService.SERVICE_LOG_NAME, logsCount: logs.length });
@@ -216,16 +220,15 @@ export class RewardsService {
216220

217221
protected async getWithdrawalsReceived(fromBlock: number): Promise<BigNumber> {
218222
const res = this.contractLido.filters.WithdrawalsReceived();
219-
const logs = await getLogsByRetryCount(
220-
this.provider,
223+
const logs = await this.executionProvider.getLogsByBlockStepsWithRetry(
221224
{
222225
topics: res.topics,
223226
toBlock: 'latest',
224227
fromBlock,
225228
address: res.address,
226229
},
227-
this.logger,
228230
'WithdrawalsReceived',
231+
RewardsService.SERVICE_LOG_NAME,
229232
);
230233

231234
this.logger.log('WithdrawalsReceived event logs', {
@@ -256,16 +259,15 @@ export class RewardsService {
256259

257260
const res = this.contractLido.filters.TokenRebased();
258261

259-
const logs = await getLogsByRetryCount(
260-
this.provider,
262+
const logs = await this.executionProvider.getLogsByBlockStepsWithRetry(
261263
{
262264
topics: res.topics,
263265
toBlock: 'latest',
264266
fromBlock: weekAgoBlock,
265267
address: res.address,
266268
},
267-
this.logger,
268269
'TokenRebased',
270+
RewardsService.SERVICE_LOG_NAME,
269271
);
270272

271273
this.logger.log('TokenRebase event logs for last week', {

src/events/rewards/rewards.utils.ts

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)