From 7107ffdc48ad1102688b29a6ae6b63c50c2aaea7 Mon Sep 17 00:00:00 2001 From: yhtiyar Date: Wed, 25 Aug 2021 17:04:58 +0300 Subject: [PATCH] adding address_info endpoint --- backend/moonstream/actions.py | 48 ++++++++++++++++++++++- backend/moonstream/data.py | 12 ++++++ backend/moonstream/routes/address_info.py | 10 +++++ backend/moonstream/routes/txinfo.py | 14 ++++++- 4 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 backend/moonstream/routes/address_info.py diff --git a/backend/moonstream/actions.py b/backend/moonstream/actions.py index 313bb64a..38c20398 100644 --- a/backend/moonstream/actions.py +++ b/backend/moonstream/actions.py @@ -3,7 +3,7 @@ import logging from typing import Dict, Any, List, Optional, Union - +from enum import Enum from sqlalchemy.engine.base import Transaction from moonstreamdb.models import ( EthereumBlock, @@ -265,6 +265,52 @@ def parse_search_query_to_sqlalchemy_filters(q: str, allowed_addresses: List[str return constructed_filters +class AdressType: + TOKEN = 0 + SMART_CONTRACT = 1 + NFT = 2 + EXCHANGE = 3 + + +class LabelNames(Enum): + ETHERSCAN_SMARTCONTRACT = "etherscan_smartcontract" + COINMARKETCAP_TOKEN = "coinmarketcap_token" + EXCHANGE = "EXCANGE" + + +def get_ethereum_address_info( + db_session: Session, address: str +) -> Optional[data.EthereumAddressInfo]: + query = db_session.query(EthereumAddress.id).filter( + EthereumAddress.address == address + ) + id = query.one_or_none() + if id is None: + return None + labels = ( + db_session.query(EthereumLabel).filter(EthereumLabel.address_id == id[0]).all() + ) + address_info = data.EthereumAddressInfo(address=address) + for label in labels: + if label.label == LabelNames.ETHERSCAN_SMARTCONTRACT: + address_info.address_type = AdressType.SMART_CONTRACT + address_info.details.name = label.label_data["name"] + address_info.details.external_URL = ( + f"https://etherscan.io/address/{address}" + ) + elif label.label == LabelNames.COINMARKETCAP_TOKEN: + address_info.address_type = AdressType.TOKEN + address_info.details.name = label.label_data["name"] + address_info.details.symbol = label.label_data["symbol"] + address_info.details.external_URL = label.label_data["coinmarketcap_url"] + elif label.label == LabelNames.EXCHANGE: + address_info.address_type = AdressType.EXCHANGE + address_info.details.name = label.label_data["name"] + address_info.details.symbol = label.label_data["label"] + + return address_info + + def get_contract_source_info( db_session: Session, contract_address: str ) -> Optional[data.EthereumSmartContractSourceInfo]: diff --git a/backend/moonstream/data.py b/backend/moonstream/data.py index 93b8ecb0..fbbd0a29 100644 --- a/backend/moonstream/data.py +++ b/backend/moonstream/data.py @@ -140,6 +140,18 @@ class EthereumSmartContractSourceInfo(BaseModel): compiler_version: str +class EthereumAddressDetails(BaseModel): + name: Optional[str] + symbol: Optional[str] + external_URL: Optional[str] + + +class EthereumAddressInfo(BaseModel): + address: str + address_type: Optional[int] + details: EthereumAddressDetails = EthereumAddressDetails() + + class TxinfoEthereumBlockchainResponse(BaseModel): tx: EthereumTransaction is_smart_contract_deployment: bool = False diff --git a/backend/moonstream/routes/address_info.py b/backend/moonstream/routes/address_info.py new file mode 100644 index 00000000..967e7521 --- /dev/null +++ b/backend/moonstream/routes/address_info.py @@ -0,0 +1,10 @@ +import logging +from typing import Dict, Optional + +from sqlalchemy.sql.expression import true + +from fastapi import FastAPI, Depends, HTTPException, Query +from fastapi.middleware.cors import CORSMiddleware +from moonstreamdb.db import yield_db_session +from moonstreamdb.models import EthereumAddress +from sqlalchemy.orm import Session diff --git a/backend/moonstream/routes/txinfo.py b/backend/moonstream/routes/txinfo.py index 18f4f320..ae523131 100644 --- a/backend/moonstream/routes/txinfo.py +++ b/backend/moonstream/routes/txinfo.py @@ -10,7 +10,7 @@ from typing import Dict, Optional from sqlalchemy.sql.expression import true -from fastapi import FastAPI, Depends, HTTPException, Query +from fastapi import FastAPI, Depends, HTTPException, Query, Form from fastapi.middleware.cors import CORSMiddleware from moonstreamdb.db import yield_db_session from moonstreamdb.models import EthereumAddress @@ -94,6 +94,18 @@ async def txinfo_ethereum_blockchain_handler( return response +@app.get( + "/ethereum_blockchain/address_info", + tags=["address info"], + response_model=data.EthereumAddressInfo, +) +async def address_info_handler( + address: str = Form(...), db_session: Session = Depends(yield_db_session) +) -> Optional[data.EthereumAddressInfo]: + response = actions.get_ethereum_address_info(db_session, address) + return response + + @app.get( "/addresses", tags=["address info"], response_model=data.AddressListLabelsResponse )