diff --git a/src/dipdup/context.py b/src/dipdup/context.py index d1a44310d..5b1339754 100644 --- a/src/dipdup/context.py +++ b/src/dipdup/context.py @@ -71,7 +71,7 @@ async def fire_handler( self, name: str, index: str, - datasource: Datasource, + datasource: TzktDatasource, fmt: Optional[str] = None, *args, **kwargs: Any, @@ -208,7 +208,7 @@ def __init__( callbacks: 'CallbackManager', logger: FormattedLogger, handler_config: HandlerConfig, - datasource: Datasource, + datasource: TzktDatasource, ) -> None: super().__init__(datasources, config, callbacks) self.logger = logger @@ -246,7 +246,7 @@ async def fire_handler( ctx: 'DipDupContext', name: str, index: str, - datasource: Datasource, + datasource: TzktDatasource, fmt: Optional[str] = None, *args, **kwargs: Any, diff --git a/src/dipdup/datasources/tzkt/datasource.py b/src/dipdup/datasources/tzkt/datasource.py index 248d796e0..ad92bf95d 100644 --- a/src/dipdup/datasources/tzkt/datasource.py +++ b/src/dipdup/datasources/tzkt/datasource.py @@ -22,7 +22,7 @@ ) from dipdup.datasources.datasource import IndexDatasource from dipdup.datasources.tzkt.enums import TzktMessageType -from dipdup.models import BigMapAction, BigMapData, BlockData, Head, HeadBlockData, OperationData +from dipdup.models import BigMapAction, BigMapData, BlockData, Head, HeadBlockData, OperationData, QuoteData from dipdup.utils import groupby, split_by_chunks OperationID = int @@ -537,6 +537,17 @@ async def get_big_maps( big_maps.append(self.convert_big_map(bm)) return big_maps + async def get_quotes(self, level: int) -> QuoteData: + """Get quote for block""" + self._logger.info('Fetching quotes for level %s', level) + quote_json = await self._http.request( + 'get', + url='v1/quotes', + params={"level": level}, + cache=True, + ) + return self.convert_quote(quote_json[0]) + async def add_index(self, index_config: ResolvedIndexConfigT) -> None: """Register index config in internal mappings and matchers. Find and register subscriptions.""" @@ -866,6 +877,21 @@ def convert_head_block(cls, head_block_json: Dict[str, Any]) -> HeadBlockData: quote_eth=Decimal(head_block_json['quoteEth']), ) + @classmethod + def convert_quote(cls, quote_json: Dict[str, Any]) -> QuoteData: + """Convert raw quote message from REST into dataclass""" + return QuoteData( + level=quote_json['level'], + timestamp=cls._parse_timestamp(quote_json['timestamp']), + btc=Decimal(quote_json['btc']), + eur=Decimal(quote_json['eur']), + usd=Decimal(quote_json['usd']), + cny=Decimal(quote_json['cny']), + jpy=Decimal(quote_json['jpy']), + krw=Decimal(quote_json['krw']), + eth=Decimal(quote_json['eth']), + ) + async def _send(self, method: str, arguments: List[Dict[str, Any]], on_invocation=None) -> None: client = self._get_client() while client.transport.state != ConnectionState.connected: diff --git a/src/dipdup/models.py b/src/dipdup/models.py index d7659f4bc..141d7a4c2 100644 --- a/src/dipdup/models.py +++ b/src/dipdup/models.py @@ -249,6 +249,21 @@ class HeadBlockData: quote_eth: Decimal +@dataclass +class QuoteData: + """Basic structure for quotes from TzKT HTTP response""" + + level: int + timestamp: datetime + btc: Decimal + eur: Decimal + usd: Decimal + cny: Decimal + jpy: Decimal + krw: Decimal + eth: Decimal + + class Schema(Model): name = fields.CharField(256, pk=True) hash = fields.CharField(256)