moonstream/moonstreamapi/moonstreamapi/routes/address_info.py

123 wiersze
3.4 KiB
Python
Czysty Zwykły widok Historia

2021-08-25 14:04:58 +00:00
import logging
from typing import Optional
2021-08-25 14:04:58 +00:00
from fastapi import APIRouter, Depends, Query
2021-08-25 14:04:58 +00:00
from sqlalchemy.orm import Session
2021-10-26 08:12:09 +00:00
from web3 import Web3
2021-08-26 14:06:58 +00:00
2021-12-16 13:26:04 +00:00
from moonstreamdb.db import yield_db_session
from .. import actions, data
from ..middleware import MoonstreamHTTPException
2021-10-26 08:12:09 +00:00
from ..web3_provider import yield_web3_provider
2021-08-26 14:06:58 +00:00
logger = logging.getLogger(__name__)
router = APIRouter(
2021-10-20 15:45:11 +00:00
prefix="/address_info",
2021-08-26 14:06:58 +00:00
)
@router.get(
2021-10-26 08:12:09 +00:00
"/ethereum",
2021-08-26 14:06:58 +00:00
tags=["addressinfo"],
response_model=data.EthereumAddressInfo,
)
async def addressinfo_handler(
2021-08-27 15:28:47 +00:00
address: str,
db_session: Session = Depends(yield_db_session),
2021-10-26 08:12:09 +00:00
web3: Web3 = Depends(yield_web3_provider),
2021-08-26 14:06:58 +00:00
) -> Optional[data.EthereumAddressInfo]:
try:
2021-10-26 08:12:09 +00:00
response = actions.get_ethereum_address_info(db_session, web3, address)
except ValueError as e:
raise MoonstreamHTTPException(status_code=400, detail=str(e), internal_error=e)
except Exception as e:
logger.error(f"Unable to get info about Ethereum address {e}")
raise MoonstreamHTTPException(status_code=500, internal_error=e)
2021-08-26 14:06:58 +00:00
return response
2021-08-30 13:46:51 +00:00
@router.get(
"/ethereum/ens_name",
tags=["ens_name"],
response_model=str,
)
async def ens_name_handler(
address: str,
web3: Web3 = Depends(yield_web3_provider),
) -> Optional[str]:
try:
response = actions.get_ens_name(web3, address)
except ValueError as e:
raise MoonstreamHTTPException(
status_code=400,
detail=str(e),
internal_error=e,
)
except Exception as e:
logger.error(f"Failed to get ens name: {e}")
raise MoonstreamHTTPException(
status_code=500,
internal_error=e,
detail="Currently unable to get ens name",
)
return response
@router.get(
"/ethereum/ens_address",
tags=["ens_address"],
response_model=str,
)
async def ens_address_handler(
name: str,
web3: Web3 = Depends(yield_web3_provider),
) -> Optional[str]:
try:
response = actions.get_ens_address(web3, name)
except ValueError as e:
raise MoonstreamHTTPException(
status_code=400,
detail=str(e),
internal_error=e,
)
except Exception as e:
logger.error(f"Failed to get ens address: {e}")
raise MoonstreamHTTPException(
status_code=500,
internal_error=e,
detail="Currently unable to get ens address",
)
return response
@router.get(
2021-10-26 08:12:09 +00:00
"/labels/ethereum",
tags=["labels"],
2021-08-30 13:46:51 +00:00
response_model=data.AddressListLabelsResponse,
)
async def addresses_labels_bulk_handler(
addresses: Optional[str] = Query(None),
start: int = Query(0),
limit: int = Query(100),
db_session: Session = Depends(yield_db_session),
) -> data.AddressListLabelsResponse:
"""
Fetch labels with additional public information
about known addresses.
"""
if limit > 100:
raise MoonstreamHTTPException(
2021-08-30 13:46:51 +00:00
status_code=406, detail="The limit cannot exceed 100 addresses"
)
try:
addresses_response = actions.get_address_labels(
db_session=db_session, start=start, limit=limit, addresses=addresses
)
except Exception as e:
logger.error(f"Unable to get info about Ethereum addresses {e}")
raise MoonstreamHTTPException(status_code=500, internal_error=e)
2021-08-30 13:46:51 +00:00
return addresses_response