summaryrefslogtreecommitdiffstats
path: root/openbb_terminal/cryptocurrency/discovery/dappradar_model.py
diff options
context:
space:
mode:
Diffstat (limited to 'openbb_terminal/cryptocurrency/discovery/dappradar_model.py')
-rw-r--r--openbb_terminal/cryptocurrency/discovery/dappradar_model.py405
1 files changed, 262 insertions, 143 deletions
diff --git a/openbb_terminal/cryptocurrency/discovery/dappradar_model.py b/openbb_terminal/cryptocurrency/discovery/dappradar_model.py
index 9e641063804..fdc6a28fde2 100644
--- a/openbb_terminal/cryptocurrency/discovery/dappradar_model.py
+++ b/openbb_terminal/cryptocurrency/discovery/dappradar_model.py
@@ -7,7 +7,8 @@ from typing import Optional
import pandas as pd
-from openbb_terminal.decorators import log_start_end
+from openbb_terminal.core.session.current_user import get_current_user
+from openbb_terminal.decorators import check_api_key, log_start_end
from openbb_terminal.helper_funcs import get_user_agent, request
from openbb_terminal.rich_config import console
@@ -15,26 +16,15 @@ logger = logging.getLogger(__name__)
NFT_COLUMNS = [
"Name",
- "Protocols",
- "Floor Price [$]",
+ "Dapp ID",
+ "Logo",
+ "Chains",
"Avg Price [$]",
- "Market Cap [$]",
+ "Avg Price Change [%]",
"Volume [$]",
-]
-
-DAPPS_COLUMNS = [
- "Name",
- "Category",
- "Protocols",
- "Daily Users",
- "Daily Volume [$]",
-]
-
-DEX_COLUMNS = [
- "Name",
- "Category",
- "Daily Users",
- "Daily Volume [$]",
+ "Volume Change [%]",
+ "Traders",
+ "Traders Change [%]",
]
@@ -54,11 +44,13 @@ def _make_request(url: str, verbose: bool = False) -> Optional[dict]:
Optional[dict]:
dictionary with response data
"""
+ current_user = get_current_user()
headers = {
"Accept": "application/json",
"User-Agent": get_user_agent(),
- "referer": "https://dappradar.com/",
+ # "referer": "https://api.dappradar.com/4tsxo4vuhotaojtl/",
+ "X-BLOBR-KEY": current_user.credentials.API_DAPPRADAR_KEY,
}
response = request(url, headers=headers)
if not 200 <= response.status_code < 300:
@@ -75,193 +67,320 @@ def _make_request(url: str, verbose: bool = False) -> Optional[dict]:
@log_start_end(log=logger)
-def get_top_nfts(sortby: str = "", limit: int = 10) -> pd.DataFrame:
+@check_api_key(["API_DAPPRADAR_KEY"])
+def get_nft_marketplaces(
+ chain: str = "", sortby: str = "", order: str = "", limit: int = 10
+) -> pd.DataFrame:
"""Get top nft collections [Source: https://dappradar.com/]
Parameters
----------
+ chain: str
+ Name of the chain
sortby: str
Key by which to sort data
+ order: str
+ Order of sorting
+ limit: int
+ Number of records to display
Returns
-------
pd.DataFrame
- NFTs Columns: Name, Protocols, Floor Price [$], Avg Price [$], Market Cap [$], Volume [$]
+ Columns: Name, Dapp ID, Logo, Chains, Avg Price [$], Avg Price Change [%],
+ Volume [$], Volume Change [%], Traders, Traders Change [%]
"""
- sortby = sortby.replace("_", " ").title()
+ args = {
+ "chain": chain,
+ "order": order,
+ "sort": sortby,
+ "resultsPerPage": limit,
+ }
+ args = {k: v for k, v in args.items() if v}
+ query_string = "&".join([f"{k}={v}" for k, v in args.items()])
response = _make_request(
- "https://nft-sales-service.dappradar.com/v2/collection/day?limit=20&p"
- "age=1&currency=USD&sort=marketCapInFiat&order=desc"
+ f"https://api.dappradar.com/4tsxo4vuhotaojtl/nfts/marketplaces?{query_string}"
)
if response:
data = response.get("results")
- df = pd.DataFrame(
+
+ return pd.DataFrame(
data,
columns=[
"name",
- "activeProtocols",
- "floorPriceInFiat",
- "avgPriceInFiat",
- "marketCapInFiat",
- "volumeInFiat",
+ "dappId",
+ "logo",
+ "chains",
+ "avgPrice",
+ "avgPricePercentageChange",
+ "volume",
+ "volumePercentageChange",
+ "traders",
+ "tradersPercentageChange",
],
+ ).rename(
+ columns={
+ "name": "Name",
+ "dappId": "Dapp ID",
+ "logo": "Logo",
+ "chains": "Chains",
+ "avgPrice": "Avg Price [$]",
+ "avgPricePercentageChange": "Avg Price Change [%]",
+ "volume": "Volume [$]",
+ "volumePercentageChange": "Volume Change [%]",
+ "traders": "Traders",
+ "tradersPercentageChange": "Traders Change [%]",
+ }
)
+ return pd.DataFrame()
+
- df = df.set_axis(
- NFT_COLUMNS,
- axis=1,
- copy=False,
+@log_start_end(log=logger)
+@check_api_key(["API_DAPPRADAR_KEY"])
+def get_nft_marketplace_chains() -> pd.DataFrame:
+ """Get nft marketplaces chains [Source: https://dappradar.com/]
+
+ Returns
+ -------
+ pd.DataFrame
+ Columns: Chain
+ """
+
+ response = _make_request(
+ "https://api.dappradar.com/4tsxo4vuhotaojtl/nfts/marketplaces/chains"
+ )
+ if response:
+ data = response.get("chains")
+
+ return pd.DataFrame(
+ data,
+ columns=["Chain"],
)
- df["Protocols"] = df["Protocols"].apply(lambda x: ",".join(x))
- if response and sortby in NFT_COLUMNS:
- df = df.sort_values(by=sortby, ascending=False)
- return df.head(limit)
return pd.DataFrame()
@log_start_end(log=logger)
-def get_top_dexes(sortby: str = "", limit: int = 10) -> pd.DataFrame:
- """Get top dexes by daily volume and users [Source: https://dappradar.com/]
+@check_api_key(["API_DAPPRADAR_KEY"])
+def get_dapps(chain: str = "", page: int = 1, resultPerPage: int = 15):
+ """Get dapps [Source: https://dappradar.com/]
Parameters
----------
- sortby: str
- Key by which to sort data
+ chain: str
+ Name of the chain
+ page: int
+ Page number
+ resultPerPage: int
+ Number of records to display
Returns
-------
pd.DataFrame
- Top decentralized exchanges. Columns: Name, Daily Users, Daily Volume [$]
+ Columns: Dapp ID, Name, Description, Full Description, Logo, Link, Website,
+ Chains, Categories
"""
- sortby = sortby.replace("_", " ").title()
+ args = {
+ "chain": chain,
+ "page": page,
+ }
+ args = {k: v for k, v in args.items() if v}
+ query_string = "&".join([f"{k}={v}" for k, v in args.items()])
- data = _make_request(
- "https://dappradar.com/v2/api/dapps?params=WkdGd2NISmhaR0Z5Y0dGblpUMHhKbk5uY205MWNEMXR"
- # pragma: allowlist nextline secret
- "ZWGdtWTNWeWNtVnVZM2s5VlZORUptWmxZWFIxY21Wa1BURW1jbUZ1WjJVOVpHRjVKbU5oZEdWbmIzSjVQV1Y0WTJ"
- # pragma: allowlist nextline secret
- "oaGJtZGxjeVp6YjNKMFBYUnZkR0ZzVm05c2RXMWxTVzVHYVdGMEptOXlaR1Z5UFdSbGMyTW1iR2x0YVhROU1qWT0="
+ response = _make_request(
+ f"https://api.dappradar.com/4tsxo4vuhotaojtl/dapps?{query_string}"
)
- if data:
- arr = [
- [
- dex["name"],
- dex["category"],
- dex["statistic"]["userActivity"],
- dex["statistic"]["totalVolumeInFiat"],
- ]
- for dex in data["dapps"]
- ]
-
- df = pd.DataFrame(arr, columns=DEX_COLUMNS)
- if sortby in DEX_COLUMNS:
- df = df.sort_values(by=sortby, ascending=False)
- df = df[df["Category"] == "exchanges"]
- if df.empty:
- return pd.DataFrame()
- df.drop("Category", axis=1, inplace=True)
- return df.head(limit)
+
+ if response:
+ data = response.get("results")
+ return (
+ pd.DataFrame(
+ data,
+ columns=[
+ "dappId",
+ "name",
+ "description",
+ "fullDescription",
+ "chains",
+ "categories",
+ "logo",
+ "link",
+ "website",
+ ],
+ )
+ .rename(
+ columns={
+ "dappId": "Dapp ID",
+ "name": "Name",
+ "description": "Description",
+ "fullDescription": "Full Description",
+ "chains": "Chains",
+ "categories": "Categories",
+ "logo": "Logo",
+ "link": "Link",
+ "website": "Website",
+ }
+ )
+ .head(resultPerPage) # DappRadar resultsPerPage is broken
+ )
+
return pd.DataFrame()
@log_start_end(log=logger)
-def get_top_games(sortby: str = "", limit: int = 10) -> pd.DataFrame:
- """Get top blockchain games by daily volume and users [Source: https://dappradar.com/]
+@check_api_key(["API_DAPPRADAR_KEY"])
+def get_dapp_categories() -> pd.DataFrame:
+ """Get dapp categories [Source: https://dappradar.com/]
+
+ Returns
+ -------
+ pd.DataFrame
+ Columns: Category
+ """
+
+ response = _make_request(
+ "https://api.dappradar.com/4tsxo4vuhotaojtl/dapps/categories"
+ )
+ if response:
+ data = response.get("categories")
+
+ return pd.DataFrame(
+ data,
+ columns=["Category"],
+ )
+ return pd.DataFrame()
- Parameters
- ----------
- limit: int
- Number of records to display
- sortby: str
- Key by which to sort data
+
+@log_start_end(log=logger)
+@check_api_key(["API_DAPPRADAR_KEY"])
+def get_dapp_chains() -> pd.DataFrame:
+ """Get dapp chains [Source: https://dappradar.com/]
Returns
-------
pd.DataFrame
- Top blockchain games. Columns: Name, Daily Users, Daily Volume [$]
+ Columns: Chain
"""
- sortby = sortby.replace("_", " ").title()
+ response = _make_request("https://api.dappradar.com/4tsxo4vuhotaojtl/dapps/chains")
+ if response:
+ data = response.get("chains")
- data = _make_request(
- # pragma: allowlist nextline secret
- "https://dappradar.com/v2/api/dapps?params=WkdGd2NISmhaR0Z5Y0dGblpUMHhKbk5uY205MWNEMX"
- # pragma: allowlist nextline secret
- "RZWGdtWTNWeWNtVnVZM2s5VlZORUptWmxZWFIxY21Wa1BURW1jbUZ1WjJVOVpHRjVKbU5oZEdWbmIzSjVQV2R"
- # pragma: allowlist nextline secret
- "oYldWekpuTnZjblE5ZFhObGNpWnZjbVJsY2oxa1pYTmpKbXhwYldsMFBUSTI="
- )
- if data:
- arr = [
- [
- dex["name"],
- dex["category"],
- dex["statistic"]["userActivity"],
- dex["statistic"]["totalVolumeInFiat"],
- ]
- for dex in data["dapps"]
- ]
-
- df = pd.DataFrame(
- arr,
- columns=DEX_COLUMNS,
- ).sort_values("Daily Users", ascending=False)
- if sortby in df.columns:
- df = df.sort_values(by=sortby, ascending=False)
- df = df[df["Category"] == "games"]
- df.drop("Category", axis=1, inplace=True)
- return df.head(limit)
+ return pd.DataFrame(
+ data,
+ columns=["Chain"],
+ )
return pd.DataFrame()
@log_start_end(log=logger)
-def get_top_dapps(sortby: str = "", limit: int = 10) -> pd.DataFrame:
- """Get top decentralized applications by daily volume and users [Source: https://dappradar.com/]
+@check_api_key(["API_DAPPRADAR_KEY"])
+def get_dapp_metrics(
+ dappId: int, chain: str = "", time_range: str = ""
+) -> pd.DataFrame:
+ """Get dapp metrics [Source: https://dappradar.com/]
Parameters
----------
- sortby: str
- Key by which to sort data
+ dappId: int
+ Dapp ID
+ chain: str
+ Name of the chain if the dapp is multi-chain
+ range: str
+ Time range for the metrics. Can be 24h, 7d, 30d
Returns
-------
pd.DataFrame
- Top decentralized exchanges.
- Columns: Name, Category, Protocols, Daily Users, Daily Volume [$]
+ Columns: Transactions, Transactions Change [%], Users, UAW, UAW Change [%],
+ Volume [$], Volume Change [%], Balance [$], Balance Change [%]
"""
+ if not dappId:
+ console.print("[red]Please provide a dappId[/red]")
+ return pd.DataFrame()
- sortby = sortby.replace("_", " ").title()
+ query_string = (
+ f"range={time_range}" if not chain else f"chain={chain}&range={time_range}"
+ )
- data = _make_request(
- # pragma: allowlist nextline secret
- "https://dappradar.com/v2/api/dapps?params=WkdGd2NISmhaR0Z5Y0dGblpUMHhKbk5uY205MWNEMX"
- # pragma: allowlist nextline secret
- "RZWGdtWTNWeWNtVnVZM2s5VlZORUptWmxZWFIxY21Wa1BURW1jbUZ1WjJVOVpHRjVKbk52Y25ROWRYTmxjaVp"
- # pragma: allowlist nextline secret
- "2Y21SbGNqMWtaWE5qSm14cGJXbDBQVEky",
- False,
+ response = _make_request(
+ f"https://api.dappradar.com/4tsxo4vuhotaojtl/dapps/{dappId}?{query_string}"
)
- if data:
- arr = [
- [
- dex["name"],
- dex["category"],
- dex["activeProtocols"],
- dex["statistic"]["userActivity"],
- dex["statistic"]["totalVolumeInFiat"],
- ]
- for dex in data["dapps"]
- ]
-
- df = pd.DataFrame(
- arr,
- columns=DAPPS_COLUMNS,
- ).sort_values("Daily Users", ascending=False)
- df["Protocols"] = df["Protocols"].apply(lambda x: ",".join(x))
- if sortby in DAPPS_COLUMNS:
- df = df.sort_values(by=sortby, ascending=False)
- return df.head(limit)
+
+ if response:
+ data = response["results"].get("metrics")
+ return pd.DataFrame(
+ data,
+ columns=[
+ "transactions",
+ "transactionsPercentageChange",
+ "users",
+ "uaw",
+ "uawPercentageChange",
+ "volume",
+ "volumePercentageChange",
+ "balance",
+ "balancePercentageChange",
+ ],
+ index=[response["results"]["name"]],
+ ).rename(
+ columns={
+ "transactions": "Transactions",
+ "transactionsPercentageChange": "Transactions Change [%]",
+ "users": "Users",
+ "uaw": "UAW",
+ "uawPercentageChange": "UAW Change [%]",
+ "volume": "Volume [$]",
+ "volumePercentageChange": "Volume Change [%]",
+ "balance": "Balance [$]",
+ "balancePercentageChange": "Balance Change [%]",
+ }
+ )
+
+ return pd.DataFrame()
+
+
+@log_start_end(log=logger)
+@check_api_key(["API_DAPPRADAR_KEY"])
+def get_defi_chains() -> pd.DataFrame:
+ """Get defi chains [Source: https://dappradar.com/]
+
+ Returns
+ -------
+ pd.DataFrame
+ Columns: Chains
+ """
+
+ response = _make_request("https://api.dappradar.com/4tsxo4vuhotaojtl/defi/chains")
+ if response:
+ data = response.get("chains")
+
+ return pd.DataFrame(
+ data,
+ columns=["Chains"],
+ )
+ return pd.DataFrame()
+
+
+@log_start_end(log=logger)
+@check_api_key(["API_DAPPRADAR_KEY"])
+def get_token_chains() -> pd.DataFrame:
+ """Get chains that support tokens [Source: https://dappradar.com/]
+
+ Returns
+ -------
+ pd.DataFrame
+ Columns: Chains
+ """
+
+ response = _make_request("https://api.dappradar.com/4tsxo4vuhotaojtl/tokens/chains")
+ if response:
+ data = response.get("chains")
+
+ return pd.DataFrame(
+ data,
+ columns=["Chains"],
+ )
return pd.DataFrame()