|
19 | 19 | from dipdup.datasources.proxy import DatasourceRequestProxy |
20 | 20 | from dipdup.datasources.tzkt.enums import TzktMessageType |
21 | 21 | from dipdup.models import BigMapAction, BigMapData, OperationData |
| 22 | +from dipdup.utils import split_by_chunks |
22 | 23 |
|
23 | 24 | OperationID = int |
24 | 25 |
|
25 | 26 | TZKT_HTTP_REQUEST_LIMIT = 10000 |
| 27 | +TZKT_ORIGINATIONS_REQUEST_LIMIT = 100 |
26 | 28 | OPERATION_FIELDS = ( |
27 | 29 | "type", |
28 | 30 | "id", |
@@ -356,28 +358,34 @@ async def get_latest_block(self) -> Dict[str, Any]: |
356 | 358 | self._logger.debug(block) |
357 | 359 | return block |
358 | 360 |
|
359 | | - async def get_originations(self, addresses: Set[str], offset: int, first_level, last_level) -> List[OperationData]: |
360 | | - raw_originations = await self._proxy.http_request( |
361 | | - 'get', |
362 | | - url=f'{self._url}/v1/operations/originations', |
363 | | - params={ |
364 | | - "originatedContract.in": ','.join(addresses), |
365 | | - "offset": offset, |
366 | | - "limit": self.request_limit, |
367 | | - "level.gt": first_level, |
368 | | - "level.le": last_level, |
369 | | - "select": ','.join(ORIGINATION_OPERATION_FIELDS), |
370 | | - "status": "applied", |
371 | | - }, |
372 | | - ) |
| 361 | + async def get_originations(self, addresses: Set[str], offset: int, first_level: int, last_level: int) -> List[OperationData]: |
| 362 | + raw_originations = [] |
| 363 | + # NOTE: TzKT may hit URL length limit with hundreds of originations in a single request. |
| 364 | + # NOTE: Chunk of 100 addresses seems like a reasonable choice - URL of ~3971 characters. |
| 365 | + # NOTE: Other operation requests won't hit that limit. |
| 366 | + for addresses_chunk in split_by_chunks(list(addresses), TZKT_ORIGINATIONS_REQUEST_LIMIT): |
| 367 | + raw_originations += await self._proxy.http_request( |
| 368 | + 'get', |
| 369 | + url=f'{self._url}/v1/operations/originations', |
| 370 | + params={ |
| 371 | + "originatedContract.in": ','.join(addresses_chunk), |
| 372 | + "offset": offset, |
| 373 | + "limit": self.request_limit, |
| 374 | + "level.gt": first_level, |
| 375 | + "level.le": last_level, |
| 376 | + "select": ','.join(ORIGINATION_OPERATION_FIELDS), |
| 377 | + "status": "applied", |
| 378 | + }, |
| 379 | + ) |
| 380 | + |
373 | 381 | originations = [] |
374 | 382 | for op in raw_originations: |
375 | 383 | # NOTE: `type` field needs to be set manually when requesting operations by specific type |
376 | 384 | op['type'] = 'origination' |
377 | 385 | originations.append(self.convert_operation(op)) |
378 | 386 | return originations |
379 | 387 |
|
380 | | - async def get_transactions(self, field: str, addresses: Set[str], offset: int, first_level, last_level) -> List[OperationData]: |
| 388 | + async def get_transactions(self, field: str, addresses: Set[str], offset: int, first_level: int, last_level: int) -> List[OperationData]: |
381 | 389 | raw_transactions = await self._proxy.http_request( |
382 | 390 | 'get', |
383 | 391 | url=f'{self._url}/v1/operations/transactions', |
|
0 commit comments