diff --git a/bfxapi/rest/BfxRestInterface.py b/bfxapi/rest/BfxRestInterface.py index 35153fc..0c02687 100644 --- a/bfxapi/rest/BfxRestInterface.py +++ b/bfxapi/rest/BfxRestInterface.py @@ -2,7 +2,7 @@ import requests from http import HTTPStatus -from typing import List, Union, Literal, Optional +from typing import List, Union, Literal, Optional, Any from . import serializers from .typings import * @@ -135,4 +135,24 @@ class BfxRestInterface(object): data = self.__GET("liquidations/hist", params=params) - return [ serializers.Liquidation.parse(*subdata[0]) for subdata in data ] \ No newline at end of file + return [ serializers.Liquidation.parse(*subdata[0]) for subdata in data ] + + def leaderboards( + self, + resource: str, section: Literal["hist", "last"], + sort: Optional[int] = None, start: Optional[str] = None, end: Optional[str] = None, limit: Optional[int] = None + ) -> Union[Leaderboard, Leaderboards]: + params = { "sort": sort, "start": start, "end": end, "limit": limit } + + data = self.__GET(f"rankings/{resource}/{section}", params=params) + + if section == "last": + return serializers.Leaderboard.parse(*data) + return [ serializers.Leaderboard.parse(*subdata) for subdata in data ] + + def funding_stats(self, symbol: str, start: Optional[str] = None, end: Optional[str] = None, limit: Optional[int] = None) -> FundingStats: + params = { "start": start, "end": end, "limit": limit } + + data = self.__GET(f"funding/stats/{symbol}/hist", params=params) + + return [ serializers.FundingStat.parse(*subdata) for subdata in data ] \ No newline at end of file diff --git a/bfxapi/rest/serializers.py b/bfxapi/rest/serializers.py index 22817e0..a2f69df 100644 --- a/bfxapi/rest/serializers.py +++ b/bfxapi/rest/serializers.py @@ -13,7 +13,7 @@ class _Serializer(Generic[T]): def __serialize(self, *args: Any, skip: Optional[List[str]]) -> Iterable[T]: labels = list(filter(lambda label: label not in (skip or list()), self.__labels)) - if len(labels) != len(args): + if len(labels) > len(args): raise BfxRestException(" and <*args> arguments should contain the same amount of elements.") for index, label in enumerate(labels): @@ -176,4 +176,32 @@ Liquidation = _Serializer[typings.Liquidation]("Liquidation", labels=[ "PRICE_ACQUIRED" ]) +Leaderboard = _Serializer[typings.Leaderboard]("Leaderboard", labels=[ + "MTS", + "_PLACEHOLDER", + "USERNAME", + "RANKING", + "_PLACEHOLDER", + "_PLACEHOLDER", + "VALUE", + "_PLACEHOLDER", + "_PLACEHOLDER", + "TWITTER_HANDLE" +]) + +FundingStat = _Serializer[typings.FundingStat]("FundingStat", labels=[ + "TIMESTAMP", + "_PLACEHOLDER", + "_PLACEHOLDER", + "FRR", + "AVG_PERIOD", + "_PLACEHOLDER", + "_PLACEHOLDER", + "FUNDING_AMOUNT", + "FUNDING_AMOUNT_USED", + "_PLACEHOLDER", + "_PLACEHOLDER", + "FUNDING_BELOW_THRESHOLD" +]) + #endregion \ No newline at end of file diff --git a/bfxapi/rest/typings.py b/bfxapi/rest/typings.py index 5afc040..828c228 100644 --- a/bfxapi/rest/typings.py +++ b/bfxapi/rest/typings.py @@ -87,7 +87,7 @@ Candle = TypedDict("Candle", { Candles = List[Candle] DerivativesStatus = TypedDict("DerivativesStatus", { - "KEY": str, + "KEY": Optional[str], "MTS": int, "DERIV_PRICE": float, "SPOT_PRICE": float, @@ -117,4 +117,25 @@ Liquidation = TypedDict("Liquidation", { Liquidations = List[Liquidation] +Leaderboard = TypedDict("Leaderboard", { + "MTS": int, + "USERNAME": str, + "RANKING": int, + "VALUE": float, + "TWITTER_HANDLE": Optional[str] +}) + +Leaderboards = List[Leaderboard] + +FundingStat = TypedDict("FundingStat", { + "TIMESTAMP": int, + "FRR": float, + "AVG_PERIOD": float, + "FUNDING_AMOUNT": float, + "FUNDING_AMOUNT_USED": float, + "FUNDING_BELOW_THRESHOLD": float +}) + +FundingStats = List[FundingStat] + #endregion \ No newline at end of file