51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
from .api import ApiClient
|
|
from .constants import DATA_SOURCE_BY_COIN, EXPLORER_URL_BY_COIN
|
|
from .models import LookupResult
|
|
from .validators import validate_address
|
|
|
|
|
|
def build_lookup_result(client: ApiClient, coin: str, address: str) -> LookupResult:
|
|
explorer_url = EXPLORER_URL_BY_COIN[coin].format(address=address)
|
|
data_source = DATA_SOURCE_BY_COIN[coin]
|
|
is_valid, reason = validate_address(coin, address)
|
|
|
|
result = LookupResult(
|
|
coin=coin,
|
|
address=address,
|
|
is_valid_format=is_valid,
|
|
validation_reason=reason,
|
|
confirmed_balance=None,
|
|
unconfirmed_balance=None,
|
|
total_received=None,
|
|
total_sent=None,
|
|
tx_count=None,
|
|
explorer_url=explorer_url,
|
|
data_source=data_source,
|
|
fetched_at_utc=datetime.now(timezone.utc).isoformat(),
|
|
api_error=None,
|
|
api_skipped=False,
|
|
)
|
|
|
|
if not is_valid:
|
|
result.api_skipped = True
|
|
return result
|
|
|
|
try:
|
|
payload = client.fetch_coin_info(coin, address)
|
|
except RuntimeError as exc:
|
|
result.api_error = str(exc)
|
|
return result
|
|
|
|
if isinstance(payload.get("data_source"), str):
|
|
result.data_source = payload["data_source"]
|
|
result.confirmed_balance = payload["confirmed_balance"]
|
|
result.unconfirmed_balance = payload["unconfirmed_balance"]
|
|
result.total_received = payload["total_received"]
|
|
result.total_sent = payload["total_sent"]
|
|
result.tx_count = payload["tx_count"]
|
|
return result
|