kopia lustrzana https://github.com/bugout-dev/moonstream
				
				
				
			added ens name and ens address resolver
							rodzic
							
								
									9e02e969ba
								
							
						
					
					
						commit
						8be1b7948c
					
				| 
						 | 
				
			
			@ -7,6 +7,8 @@ import uuid
 | 
			
		|||
import boto3  # type: ignore
 | 
			
		||||
from bugout.data import BugoutSearchResults
 | 
			
		||||
from bugout.journal import SearchOrder
 | 
			
		||||
from ens.utils import is_valid_ens_name
 | 
			
		||||
from eth_utils.address import is_address
 | 
			
		||||
from moonstreamdb.models import (
 | 
			
		||||
    EthereumLabel,
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -74,25 +76,56 @@ def get_contract_source_info(
 | 
			
		|||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_ens_name(web3: Web3, address: str) -> Optional[str]:
 | 
			
		||||
    try:
 | 
			
		||||
        checksum_address = web3.toChecksumAddress(address)
 | 
			
		||||
    except:
 | 
			
		||||
        raise ValueError(f"{address} is invalid ethereum address is passed")
 | 
			
		||||
    try:
 | 
			
		||||
        ens_name = web3.ens.name(checksum_address)
 | 
			
		||||
        return ens_name
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        reporter.error_report(e, ["web3", "ens"])
 | 
			
		||||
        logger.error(
 | 
			
		||||
            f"Cannot get ens name for address {checksum_address}. Probably node is down"
 | 
			
		||||
        )
 | 
			
		||||
        raise e
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_ens_address(web3: Web3, name: str) -> Optional[str]:
 | 
			
		||||
 | 
			
		||||
    if not is_valid_ens_name(name):
 | 
			
		||||
        raise ValueError(f"{name} is not valid ens name")
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        ens_checksum_address = web3.ens.address(name)
 | 
			
		||||
        if ens_checksum_address is not None:
 | 
			
		||||
            ordinary_address = ens_checksum_address.lower()
 | 
			
		||||
            return ordinary_address
 | 
			
		||||
        return None
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        reporter.error_report(e, ["web3", "ens"])
 | 
			
		||||
        logger.error(f"Cannot get ens address for name {name}. Probably node is down")
 | 
			
		||||
        raise e
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_ethereum_address_info(
 | 
			
		||||
    db_session: Session, web3: Web3, address: str
 | 
			
		||||
) -> Optional[data.EthereumAddressInfo]:
 | 
			
		||||
 | 
			
		||||
    if not is_address(address):
 | 
			
		||||
        raise ValueError(f"Invalid ethereum address : {address}")
 | 
			
		||||
 | 
			
		||||
    address_info = data.EthereumAddressInfo(address=address)
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        address_info.ens_name = get_ens_name(web3, address)
 | 
			
		||||
    except:
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    etherscan_address_url = f"https://etherscan.io/address/{address}"
 | 
			
		||||
    etherscan_token_url = f"https://etherscan.io/token/{address}"
 | 
			
		||||
    blockchain_com_url = f"https://www.blockchain.com/eth/address/{address}"
 | 
			
		||||
    try:
 | 
			
		||||
        checksum_address = web3.toChecksumAddress(address)
 | 
			
		||||
        try:
 | 
			
		||||
            ens_name = web3.ens.name(checksum_address)
 | 
			
		||||
            address_info.ens_name = ens_name
 | 
			
		||||
        except:
 | 
			
		||||
            logger.warning(
 | 
			
		||||
                f"Cannot get ens name for address {ens_name}. Probably node is down"
 | 
			
		||||
            )
 | 
			
		||||
    except:
 | 
			
		||||
        raise ValueError("Invalid address is passed")
 | 
			
		||||
 | 
			
		||||
    coinmarketcap_label: Optional[EthereumLabel] = (
 | 
			
		||||
        db_session.query(EthereumLabel)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,60 @@ async def addressinfo_handler(
 | 
			
		|||
    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"],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue