|
1 | 1 | import { AaveV2Ethereum, MiscEthereum } from '@bgd-labs/aave-address-book';
|
2 | 2 | import { Provider } from '@ethersproject/providers';
|
3 |
| -import { Contract } from 'ethers'; |
| 3 | +import { Contract, EventFilter } from 'ethers'; |
4 | 4 | import { formatUnits } from 'ethers/lib/utils';
|
| 5 | +import { FORK_ENABLED } from 'src/utils/marketsAndNetworksConfig'; |
5 | 6 |
|
6 | 7 | import {
|
7 | 8 | cbEthOracle,
|
@@ -125,11 +126,12 @@ export class UnderlyingYieldService {
|
125 | 126 |
|
126 | 127 | const blocksInDay = DAY_IN_SECONDS / 12;
|
127 | 128 |
|
128 |
| - const events = await connectedContract.queryFilter( |
129 |
| - connectedContract.filters.TokenRebased(), |
130 |
| - currentBlockNumber - blocksInDay * EVENTS_PERIOD_DAYS, |
131 |
| - currentBlockNumber |
132 |
| - ); |
| 129 | + const events = await this.fetchEventsInBatches({ |
| 130 | + connectedContract, |
| 131 | + eventFilter: connectedContract.filters.TokenRebased(), |
| 132 | + fromBlock: currentBlockNumber - blocksInDay * EVENTS_PERIOD_DAYS, |
| 133 | + toBlock: currentBlockNumber, |
| 134 | + }); |
133 | 135 |
|
134 | 136 | const latestEvent = events.length === 0 ? null : events[events.length - 1];
|
135 | 137 |
|
@@ -198,11 +200,12 @@ export class UnderlyingYieldService {
|
198 | 200 |
|
199 | 201 | const contract = new Contract(rocketNetworkBalances, abi);
|
200 | 202 | const connectedContract = contract.connect(provider);
|
201 |
| - const events = await connectedContract.queryFilter( |
202 |
| - connectedContract.filters.BalancesUpdated(), |
203 |
| - currentBlockNumber - BLOCKS_A_DAY * EVENTS_PERIOD_DAYS, |
204 |
| - currentBlockNumber |
205 |
| - ); |
| 203 | + const events = await this.fetchEventsInBatches({ |
| 204 | + connectedContract, |
| 205 | + eventFilter: connectedContract.filters.BalancesUpdated(), |
| 206 | + fromBlock: currentBlockNumber - BLOCKS_A_DAY * EVENTS_PERIOD_DAYS, |
| 207 | + toBlock: currentBlockNumber, |
| 208 | + }); |
206 | 209 |
|
207 | 210 | const rates = events
|
208 | 211 | .map((event) => {
|
@@ -246,12 +249,12 @@ export class UnderlyingYieldService {
|
246 | 249 |
|
247 | 250 | const contract = new Contract(staderLabsOracle, abi); // Stader Labs Oracle
|
248 | 251 | const connectedContract = contract.connect(provider);
|
249 |
| - |
250 |
| - const events = await connectedContract.queryFilter( |
251 |
| - connectedContract.filters.ExchangeRateUpdated(), |
252 |
| - currentBlockNumber - BLOCKS_A_DAY * EVENTS_PERIOD_DAYS, |
253 |
| - currentBlockNumber |
254 |
| - ); |
| 252 | + const events = await this.fetchEventsInBatches({ |
| 253 | + connectedContract, |
| 254 | + eventFilter: connectedContract.filters.ExchangeRateUpdated(), |
| 255 | + fromBlock: currentBlockNumber - BLOCKS_A_DAY * EVENTS_PERIOD_DAYS, |
| 256 | + toBlock: currentBlockNumber, |
| 257 | + }); |
255 | 258 |
|
256 | 259 | const rates = events
|
257 | 260 | .map((event) => {
|
@@ -285,12 +288,12 @@ export class UnderlyingYieldService {
|
285 | 288 |
|
286 | 289 | const contract = new Contract(cbEthOracle, abi); // cbETH Oracle
|
287 | 290 | const connectedContract = contract.connect(provider);
|
288 |
| - |
289 |
| - const events = await connectedContract.queryFilter( |
290 |
| - connectedContract.filters.ExchangeRateUpdated(), |
291 |
| - currentBlockNumber - BLOCKS_A_DAY * EVENTS_PERIOD_DAYS, |
292 |
| - currentBlockNumber |
293 |
| - ); |
| 291 | + const events = await this.fetchEventsInBatches({ |
| 292 | + connectedContract, |
| 293 | + eventFilter: connectedContract.filters.ExchangeRateUpdated(), |
| 294 | + fromBlock: currentBlockNumber - BLOCKS_A_DAY * EVENTS_PERIOD_DAYS, |
| 295 | + toBlock: currentBlockNumber, |
| 296 | + }); |
294 | 297 |
|
295 | 298 | if (events && events.length > 2) {
|
296 | 299 | const lastestEventArgs = events[events.length - 1].args;
|
@@ -346,11 +349,12 @@ export class UnderlyingYieldService {
|
346 | 349 | ];
|
347 | 350 | const contract = new Contract(etherfiLiquidityPool, abi); // Etherfi LiquidityPool
|
348 | 351 | const connectedContract = contract.connect(provider);
|
349 |
| - const events = await connectedContract.queryFilter( |
350 |
| - connectedContract.filters.Rebase(), |
351 |
| - currentBlockNumber - BLOCKS_A_DAY * EVENTS_PERIOD_DAYS, |
352 |
| - currentBlockNumber |
353 |
| - ); |
| 352 | + const events = await this.fetchEventsInBatches({ |
| 353 | + connectedContract, |
| 354 | + eventFilter: connectedContract.filters.Rebase(), |
| 355 | + fromBlock: currentBlockNumber - BLOCKS_A_DAY * EVENTS_PERIOD_DAYS, |
| 356 | + toBlock: currentBlockNumber, |
| 357 | + }); |
354 | 358 |
|
355 | 359 | if (events && events.length > 2) {
|
356 | 360 | const lastestEventArgs = events[events.length - 1].args;
|
@@ -381,4 +385,38 @@ export class UnderlyingYieldService {
|
381 | 385 | return await getApyFromApi();
|
382 | 386 | }
|
383 | 387 | };
|
| 388 | + |
| 389 | + fetchEventsInBatches = async (parameters: { |
| 390 | + connectedContract: Contract; |
| 391 | + eventFilter: EventFilter; |
| 392 | + fromBlock: number; |
| 393 | + toBlock: number; |
| 394 | + blockRange?: number; |
| 395 | + }) => { |
| 396 | + const { connectedContract, eventFilter, fromBlock, toBlock } = parameters; |
| 397 | + |
| 398 | + let blockRange; |
| 399 | + |
| 400 | + if (parameters.blockRange) { |
| 401 | + blockRange = parameters.blockRange; |
| 402 | + } else if (FORK_ENABLED) { |
| 403 | + blockRange = 1000; |
| 404 | + } else { |
| 405 | + blockRange = 100000; |
| 406 | + } |
| 407 | + |
| 408 | + let startBlock = fromBlock; |
| 409 | + |
| 410 | + const allEvents = []; |
| 411 | + |
| 412 | + while (startBlock <= toBlock) { |
| 413 | + const nextBlock = startBlock + blockRange - 1; |
| 414 | + const endBlock = nextBlock < toBlock ? nextBlock : toBlock; |
| 415 | + const events = await connectedContract.queryFilter(eventFilter, startBlock, endBlock); |
| 416 | + allEvents.push(...events); |
| 417 | + startBlock = endBlock + 1; |
| 418 | + } |
| 419 | + |
| 420 | + return allEvents; |
| 421 | + }; |
384 | 422 | }
|
0 commit comments