moonstream/moonstreamapi/moonstreamapi/routes/address_info.py

123 wiersze
3.4 KiB
Python

import logging
from typing import Optional
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from web3 import Web3
from moonstreamdb.db import yield_db_session
from .. import actions, data
from ..middleware import MoonstreamHTTPException
from ..web3_provider import yield_web3_provider
logger = logging.getLogger(__name__)
router = APIRouter(
prefix="/address_info",
)
@router.get(
"/ethereum",
tags=["addressinfo"],
response_model=data.EthereumAddressInfo,
)
async def addressinfo_handler(
address: str,
db_session: Session = Depends(yield_db_session),
web3: Web3 = Depends(yield_web3_provider),
) -> Optional[data.EthereumAddressInfo]:
try:
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)
return response
@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(
"/labels/ethereum",
tags=["labels"],
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(
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)
return addresses_response