|
|
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 |
|
|
|