| from dotenv import load_dotenv |
|
|
| import httpx |
| from typing import List, Union |
| from src.databases.redis import REDIS_CACHED |
| from src.libs.constants import ONE_HOUR_IN_SECONDS, ONE_MINUTE_IN_SECONDS |
| from src.libs.constants import DEX_SCREENER_BASE_URL |
|
|
| load_dotenv() |
|
|
| redis_cache = REDIS_CACHED |
|
|
| class DexScreener: |
| """ |
| A class for interacting with the Dex Screener API. |
| |
| Attributes: |
| DEX_SCREENER_BASE_URL (str): The base URL for the Dex Screener API. |
| |
| Methods: |
| __init__(self, base_url: str) -> None: |
| Initialize the DexScreener class. |
| |
| get_pairs(self, chain_id: str, pair_addresses: str) -> dict: |
| |
| get_tokens(self, token_addresses: Union[str, List[str]]) -> dict: |
| |
| search_pairs(self, query: str) -> dict: |
| """ |
| def __init__(self, base_url: str = None) -> None: |
| self.DEX_SCREENER_BASE_URL = base_url or DEX_SCREENER_BASE_URL |
|
|
| @redis_cache(ttl=ONE_MINUTE_IN_SECONDS) |
| def get_pairs(self, chain_id: str, pair_addresses: str) -> dict: |
| """ |
| This method is used to fetch pair data from Dex Screener API based on the provided chain_id and pair_addresses. |
| |
| Parameters: |
| chain_id (str): The ID of the blockchain network. |
| pair_addresses (str): The address(es) of the pair(s) on the blockchain. |
| |
| Returns: |
| dict: A dictionary containing the JSON response from the API. Returns None if an error occurs. |
| |
| Raises: |
| httpx.HTTPError: If an error occurs while making the request to the API. |
| """ |
| url = f"{self.DEX_SCREENER_BASE_URL}pairs/{chain_id}/{pair_addresses}" |
| try: |
| response = httpx.get(url) |
| response.raise_for_status() |
| return response.json() |
| except httpx.HTTPError as e: |
| print(f"An error occurred while making the request: {e}") |
| return None |
| |
| @redis_cache(ttl=ONE_MINUTE_IN_SECONDS) |
| def get_tokens(self, token_addresses: Union[str, List[str]]) -> dict: |
| """ |
| This method is used to fetch token data from Dex Screener API based on the provided token_addresses. |
| |
| Parameters: |
| token_addresses (Union[str, List[str]]): The address(es) of the token(s) on the blockchain. |
| This parameter can be a single address (str) or a list of addresses (List[str]). |
| |
| Returns: |
| dict: A dictionary containing the JSON response from the API. Returns None if an error occurs. |
| |
| Raises: |
| httpx.HTTPError: If an error occurs while making the request to the API. |
| """ |
| if isinstance(token_addresses, list): |
| token_addresses = ','.join(token_addresses) |
|
|
| url = f"{self.DEX_SCREENER_BASE_URL}tokens/{token_addresses}" |
| try: |
| response = httpx.get(url) |
| response.raise_for_status() |
| return response.json() |
| except httpx.HTTPError as e: |
| print(f"An error occurred while making the request: {e}") |
| return None |
| |
| @redis_cache(ttl=ONE_HOUR_IN_SECONDS) |
| def search(self, query: str) -> dict: |
| """ |
| This method is used to search for pairs matching the provided query from Dex Screener API. |
| The query may include pair address, token address, token name, or token symbol. |
| |
| Parameters: |
| query (str): The search query. |
| |
| Returns: |
| dict: A dictionary containing the JSON response from the API. Returns None if an error occurs. |
| |
| Raises: |
| httpx.HTTPError: If an error occurs while making the request to the API. |
| """ |
| url = f"{self.DEX_SCREENER_BASE_URL}search/?q={query}" |
| try: |
| response = httpx.get(url) |
| response.raise_for_status() |
| return response.json() |
| except httpx.HTTPError as e: |
| print(f"An error occurred while making the request: {e}") |
| return None |
|
|