diff --git a/README.md b/README.md index 461cf05..8e27ce5 100644 --- a/README.md +++ b/README.md @@ -365,6 +365,57 @@ derivatives = pro_client.volumes.getDerivativesOverview() gmx = pro_client.volumes.getDerivativesSummary("gmx") ``` +### getDexMetrics 🔐 + +Get summary of DEX metrics with protocol list (no charts). + +```python +metrics = pro_client.volumes.getDexMetrics() + +# With data type +metrics = pro_client.volumes.getDexMetrics({"dataType": "dailyVolume"}) +``` + +### getDexMetricsByProtocol 🔐 + +Get DEX metrics for a specific protocol. + +```python +uniswap = pro_client.volumes.getDexMetricsByProtocol("uniswap") +``` + +### getDerivativesMetrics 🔐 + +Get summary of derivatives metrics with protocol list (no charts). + +```python +metrics = pro_client.volumes.getDerivativesMetrics() +``` + +### getDerivativesMetricsByProtocol 🔐 + +Get derivatives metrics for a specific protocol. + +```python +hyperliquid = pro_client.volumes.getDerivativesMetricsByProtocol("hyperliquid") +``` + +### getOptionsMetrics 🔐 + +Get summary of options metrics with protocol list (no charts). + +```python +metrics = pro_client.volumes.getOptionsMetrics() +``` + +### getOptionsMetricsByProtocol 🔐 + +Get options metrics for a specific protocol. + +```python +hegic = pro_client.volumes.getOptionsMetricsByProtocol("hegic") +``` + --- ## Fees diff --git a/defillama_sdk/modules/volumes.py b/defillama_sdk/modules/volumes.py index e5588a5..aeec6ff 100644 --- a/defillama_sdk/modules/volumes.py +++ b/defillama_sdk/modules/volumes.py @@ -14,6 +14,15 @@ OptionsOverviewOptions, OptionsOverviewResponse, OptionsSummaryResponse, + DexMetricsOptions, + DexMetricsResponse, + DexMetricsByProtocolResponse, + DerivativesMetricsOptions, + DerivativesMetricsResponse, + DerivativesMetricsByProtocolResponse, + OptionsMetricsOptions, + OptionsMetricsResponse, + OptionsMetricsByProtocolResponse, ) @@ -111,3 +120,93 @@ def getDerivativesSummary(self, protocol: str) -> DerivativesSummaryResponse: f"/summary/derivatives/{quote(protocol)}", requires_auth=True, ) + + def getDexMetrics( + self, options: Optional[DexMetricsOptions] = None + ) -> DexMetricsResponse: + """Get DEX volume metrics across protocols.""" + + params = {} + if options and options.get("dataType"): + params["dataType"] = options.get("dataType") + return self._client.get( + "/metrics/dexs", + base="v2", + requires_auth=True, + params=params or None, + ) + + def getDexMetricsByProtocol( + self, protocol: str, options: Optional[DexMetricsOptions] = None + ) -> DexMetricsByProtocolResponse: + """Get DEX volume metrics for a protocol.""" + + params = {} + if options and options.get("dataType"): + params["dataType"] = options.get("dataType") + return self._client.get( + f"/metrics/dexs/protocol/{quote(protocol)}", + base="v2", + requires_auth=True, + params=params or None, + ) + + def getDerivativesMetrics( + self, options: Optional[DerivativesMetricsOptions] = None + ) -> DerivativesMetricsResponse: + """Get derivatives volume metrics across protocols.""" + + params = {} + if options and options.get("dataType"): + params["dataType"] = options.get("dataType") + return self._client.get( + "/metrics/derivatives", + base="v2", + requires_auth=True, + params=params or None, + ) + + def getDerivativesMetricsByProtocol( + self, protocol: str, options: Optional[DerivativesMetricsOptions] = None + ) -> DerivativesMetricsByProtocolResponse: + """Get derivatives volume metrics for a protocol.""" + + params = {} + if options and options.get("dataType"): + params["dataType"] = options.get("dataType") + return self._client.get( + f"/metrics/derivatives/protocol/{quote(protocol)}", + base="v2", + requires_auth=True, + params=params or None, + ) + + def getOptionsMetrics( + self, options: Optional[OptionsMetricsOptions] = None + ) -> OptionsMetricsResponse: + """Get options volume metrics across protocols.""" + + params = {} + if options and options.get("dataType"): + params["dataType"] = options.get("dataType") + return self._client.get( + "/metrics/options", + base="v2", + requires_auth=True, + params=params or None, + ) + + def getOptionsMetricsByProtocol( + self, protocol: str, options: Optional[OptionsMetricsOptions] = None + ) -> OptionsMetricsByProtocolResponse: + """Get options volume metrics for a protocol.""" + + params = {} + if options and options.get("dataType"): + params["dataType"] = options.get("dataType") + return self._client.get( + f"/metrics/options/protocol/{quote(protocol)}", + base="v2", + requires_auth=True, + params=params or None, + ) diff --git a/defillama_sdk/types/volumes.py b/defillama_sdk/types/volumes.py index b19a9b8..8784f5f 100644 --- a/defillama_sdk/types/volumes.py +++ b/defillama_sdk/types/volumes.py @@ -1,6 +1,6 @@ """Volume type definitions.""" -from typing import Dict, List, Optional, Tuple, TypedDict, Literal +from typing import Dict, List, Optional, Tuple, TypedDict, Literal, Union class VolumeOverviewOptions(TypedDict, total=False): @@ -32,6 +32,8 @@ class VolumeProtocol(TypedDict, total=False): total60dto30d: Optional[float] total1y: Optional[float] totalAllTime: Optional[float] + total7DaysAgo: Optional[float] + total30DaysAgo: Optional[float] average1y: Optional[float] monthlyAverage1y: Optional[float] change_1d: Optional[float] @@ -41,6 +43,8 @@ class VolumeProtocol(TypedDict, total=False): change_30dover30d: Optional[float] breakdown24h: Optional[Dict[str, Dict[str, float]]] breakdown30d: Optional[Dict[str, Dict[str, float]]] + linkedProtocols: Optional[List[str]] + doublecounted: Optional[bool] parentProtocol: Optional[str] slug: str @@ -116,6 +120,104 @@ class VolumeSummaryResponse(TypedDict, total=False): change_1d: Optional[float] +class VolumeMetricsOptions(TypedDict, total=False): + dataType: Optional[Literal["dailyVolume", "totalVolume"]] + + +class VolumeMetricsProtocol(TypedDict, total=False): + id: Optional[str] + tokenRights: Optional[Dict[str, object]] + symbol: Optional[str] + address: Optional[str] + linkedProtocols: Optional[List[str]] + childProtocols: Optional[List["VolumeMetricsChildProtocol"]] + defillamaId: str + displayName: str + module: Optional[str] + category: Optional[str] + methodologyURL: Optional[str] + methodology: Optional[Dict[str, str]] + forkedFrom: Optional[List[str]] + audits: Optional[str] + audit_links: Optional[List[str]] + parentProtocol: Optional[str] + previousNames: Optional[List[str]] + hallmarks: Optional[List[Tuple[int, str]]] + defaultChartView: Optional[str] + breakdownMethodology: Optional[Union[str, Dict[str, Dict[str, str]]]] + slug: str + protocolType: str + total24h: Optional[float] + total48hto24h: Optional[float] + total7d: Optional[float] + total30d: Optional[float] + totalAllTime: Optional[float] + hasLabelBreakdown: bool + change_1d: Optional[float] + dimensions: Optional[Dict[str, object]] + misrepresentedTokens: bool + doublecounted: Optional[bool] + referralUrl: Optional[str] + + +class VolumeMetricsChildProtocol(TypedDict, total=False): + name: str + defillamaId: str + displayName: str + methodologyURL: Optional[str] + methodology: Optional[Dict[str, str]] + defaultChartView: Optional[str] + breakdownMethodology: Optional[Union[str, Dict[str, Dict[str, str]]]] + + +class VolumeMetricsResponse(TypedDict, total=False): + protocols: List[VolumeMetricsProtocol] + total24h: Optional[float] + total48hto24h: Optional[float] + total7d: Optional[float] + total30d: Optional[float] + totalAllTime: Optional[float] + hasLabelBreakdown: bool + change_1d: Optional[float] + dimensions: Optional[Dict[str, object]] + + +class VolumeMetricsByProtocolResponse(TypedDict, total=False): + id: Optional[str] + tokenRights: Optional[Dict[str, object]] + symbol: Optional[str] + address: Optional[str] + linkedProtocols: Optional[List[str]] + childProtocols: Optional[List[VolumeMetricsChildProtocol]] + defillamaId: str + displayName: str + module: Optional[str] + category: Optional[str] + methodologyURL: Optional[str] + methodology: Optional[Dict[str, str]] + forkedFrom: Optional[List[str]] + audits: Optional[str] + audit_links: Optional[List[str]] + parentProtocol: Optional[str] + previousNames: Optional[List[str]] + hallmarks: Optional[List[Tuple[int, str]]] + defaultChartView: Optional[str] + breakdownMethodology: Optional[Union[str, Dict[str, Dict[str, str]]]] + slug: str + protocolType: str + total24h: Optional[float] + total48hto24h: Optional[float] + total7d: Optional[float] + total30d: Optional[float] + totalAllTime: Optional[float] + hasLabelBreakdown: bool + change_1d: Optional[float] + dimensions: Optional[Dict[str, object]] + misrepresentedTokens: bool + doublecounted: Optional[bool] + referralUrl: Optional[str] + + DexOverviewOptions = VolumeOverviewOptions DexOverviewResponse = VolumeOverviewResponse DexSummaryOptions = VolumeSummaryOptions @@ -126,6 +228,16 @@ class VolumeSummaryResponse(TypedDict, total=False): DerivativesOverviewResponse = VolumeOverviewResponse DerivativesSummaryResponse = VolumeSummaryResponse +DexMetricsOptions = VolumeMetricsOptions +DexMetricsResponse = VolumeMetricsResponse +DexMetricsByProtocolResponse = VolumeMetricsByProtocolResponse +DerivativesMetricsOptions = VolumeMetricsOptions +DerivativesMetricsResponse = VolumeMetricsResponse +DerivativesMetricsByProtocolResponse = VolumeMetricsByProtocolResponse +OptionsMetricsOptions = VolumeMetricsOptions +OptionsMetricsResponse = VolumeMetricsResponse +OptionsMetricsByProtocolResponse = VolumeMetricsByProtocolResponse + __all__ = [ "VolumeOverviewOptions", @@ -135,6 +247,11 @@ class VolumeSummaryResponse(TypedDict, total=False): "VolumeSummaryResponse", "VolumeChartBreakdownDataPoint", "VolumeNestedChartBreakdownDataPoint", + "VolumeMetricsOptions", + "VolumeMetricsProtocol", + "VolumeMetricsChildProtocol", + "VolumeMetricsResponse", + "VolumeMetricsByProtocolResponse", "DexOverviewOptions", "DexOverviewResponse", "DexSummaryOptions", @@ -144,4 +261,13 @@ class VolumeSummaryResponse(TypedDict, total=False): "OptionsSummaryResponse", "DerivativesOverviewResponse", "DerivativesSummaryResponse", + "DexMetricsOptions", + "DexMetricsResponse", + "DexMetricsByProtocolResponse", + "DerivativesMetricsOptions", + "DerivativesMetricsResponse", + "DerivativesMetricsByProtocolResponse", + "OptionsMetricsOptions", + "OptionsMetricsResponse", + "OptionsMetricsByProtocolResponse", ] diff --git a/pyproject.toml b/pyproject.toml index 5e1c0ee..6e6ea7c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "defillama-sdk" -version = "0.1.1" +version = "0.1.2" description = "Python SDK for DefiLlama API" authors = [{name = "DefiLlama"}] readme = "README.md"