Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 0 additions & 38 deletions MANIFEST

This file was deleted.

2 changes: 1 addition & 1 deletion bfxapi/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "3.0.1"
__version__ = "3.0.2"
4 changes: 2 additions & 2 deletions bfxapi/rest/_interfaces/rest_auth_endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ def get_ledgers(

def get_base_margin_info(self) -> BaseMarginInfo:
return serializers.BaseMarginInfo.parse(
*(self._m.post("auth/r/info/margin/base")[1])
*self._m.post("auth/r/info/margin/base")
)

def get_symbol_margin_info(self, symbol: str) -> SymbolMarginInfo:
Expand Down Expand Up @@ -551,7 +551,7 @@ def get_funding_trades_history(

def get_funding_info(self, key: str) -> FundingInfo:
return serializers.FundingInfo.parse(
*(self._m.post(f"auth/r/info/funding/{key}")[2])
*self._m.post(f"auth/r/info/funding/{key}")
)

def transfer_between_wallets(
Expand Down
1 change: 1 addition & 0 deletions bfxapi/types/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from .dataclasses import (
BalanceAvailable,
BalanceInfo,
BaseMarginInfo,
Candle,
CurrencyConversion,
Expand Down
7 changes: 7 additions & 0 deletions bfxapi/types/dataclasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,7 @@ class FundingAutoRenew(_Type):

@dataclass()
class FundingInfo(_Type):
symbol: str
yield_loan: float
yield_lend: float
duration_loan: float
Expand Down Expand Up @@ -607,6 +608,12 @@ class DerivativePositionCollateralLimits(_Type):
max_collateral: float


@dataclass
class BalanceInfo(_Type):
aum: float
aum_net: float


# endregion

# region Dataclass definitions for types of merchant use
Expand Down
26 changes: 24 additions & 2 deletions bfxapi/types/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -632,7 +632,15 @@
FundingInfo = generate_labeler_serializer(
name="FundingInfo",
klass=dataclasses.FundingInfo,
labels=["yield_loan", "yield_lend", "duration_loan", "duration_lend"],
labels=[
"_PLACEHOLDER",
"symbol",
"yield_loan",
"yield_lend",
"duration_loan",
"duration_lend",
],
flat=True,
)

Wallet = generate_labeler_serializer(
Expand Down Expand Up @@ -745,7 +753,15 @@
BaseMarginInfo = generate_labeler_serializer(
name="BaseMarginInfo",
klass=dataclasses.BaseMarginInfo,
labels=["user_pl", "user_swaps", "margin_balance", "margin_net", "margin_min"],
labels=[
"_PLACEHOLDER",
"user_pl",
"user_swaps",
"margin_balance",
"margin_net",
"margin_min",
],
flat=True,
)

PositionClaim = generate_labeler_serializer(
Expand Down Expand Up @@ -888,4 +904,10 @@
labels=["min_collateral", "max_collateral"],
)

BalanceInfo = generate_labeler_serializer(
name="BalanceInfo",
klass=dataclasses.BalanceInfo,
labels=["aum", "aum_net"],
)

# endregion
6 changes: 5 additions & 1 deletion bfxapi/websocket/_event_emitter/bfx_event_emitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@
"trade_execution",
"trade_execution_update",
"wallet_update",
"base_margin_info",
"symbol_margin_info",
"funding_info_update",
"balance_update",
"notification",
"on-req-notification",
"ou-req-notification",
Expand Down Expand Up @@ -105,7 +109,7 @@ def on(
) -> Union[_Handler, Callable[[_Handler], _Handler]]:
if event not in BfxEventEmitter._EVENTS:
raise UnknownEventError(
f"Can't register to unknown event: <{event}> (to get a full"
f"Can't register to unknown event: <{event}> (to get a full "
"list of available events see https://docs.bitfinex.com/)."
)

Expand Down
31 changes: 22 additions & 9 deletions bfxapi/websocket/_handlers/auth_events_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ class AuthEventsHandler:
"flc": "funding_loan_close",
"ws": "wallet_snapshot",
"wu": "wallet_update",
"fiu": "funding_info_update",
"bu": "balance_update",
}

__SERIALIZERS: Dict[Tuple[str, ...], serializers._Serializer] = {
Expand All @@ -43,6 +45,8 @@ class AuthEventsHandler:
("fcs", "fcn", "fcu", "fcc"): serializers.FundingCredit,
("fls", "fln", "flu", "flc"): serializers.FundingLoan,
("ws", "wu"): serializers.Wallet,
("fiu",): serializers.FundingInfo,
("bu",): serializers.BalanceInfo,
}

def __init__(self, event_emitter: EventEmitter) -> None:
Expand All @@ -51,17 +55,26 @@ def __init__(self, event_emitter: EventEmitter) -> None:
def handle(self, abbrevation: str, stream: Any) -> None:
if abbrevation == "n":
self.__notification(stream)
elif abbrevation == "miu":
if stream[0] == "base":
self.__event_emitter.emit(
"base_margin_info", serializers.BaseMarginInfo.parse(*stream)
)
elif stream[0] == "sym":
self.__event_emitter.emit(
"symbol_margin_info", serializers.SymbolMarginInfo.parse(*stream)
)
else:
for abbrevations, serializer in AuthEventsHandler.__SERIALIZERS.items():
if abbrevation in abbrevations:
event = AuthEventsHandler.__ABBREVIATIONS[abbrevation]

for abbrevations, serializer in AuthEventsHandler.__SERIALIZERS.items():
if abbrevation in abbrevations:
event = AuthEventsHandler.__ABBREVIATIONS[abbrevation]
if all(isinstance(sub_stream, list) for sub_stream in stream):
data = [serializer.parse(*sub_stream) for sub_stream in stream]
else:
data = serializer.parse(*stream)

if all(isinstance(sub_stream, list) for sub_stream in stream):
data = [serializer.parse(*sub_stream) for sub_stream in stream]
else:
data = serializer.parse(*stream)

self.__event_emitter.emit(event, data)
self.__event_emitter.emit(event, data)

def __notification(self, stream: Any) -> None:
event: str = "notification"
Expand Down
36 changes: 36 additions & 0 deletions examples/websocket/auth/calc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# python -c "import examples.websocket.auth.calc"

import os

from bfxapi import Client
from bfxapi.types import BaseMarginInfo, FundingInfo, SymbolMarginInfo

bfx = Client(
api_key=os.getenv("BFX_API_KEY"),
api_secret=os.getenv("BFX_API_SECRET"),
)


@bfx.wss.on("authenticated")
async def on_authenticated(_):
await bfx.wss.inputs.calc("margin_base", "margin_sym_tBTCUSD", "funding_sym_fUST")


@bfx.wss.on("base_margin_info")
def on_base_margin_info(data: BaseMarginInfo):
print("Base margin info:", data)


@bfx.wss.on("symbol_margin_info")
def on_symbol_margin_info(data: SymbolMarginInfo):
if data.symbol == "tBTCUSD":
print("Symbol margin info:", data)


@bfx.wss.on("funding_info_update")
def on_funding_info_update(data: FundingInfo):
if data.symbol == "fUST":
print("Funding info update:", data)


bfx.wss.run()
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

setup(
name="bitfinex-api-py",
version="3.0.1",
version="3.0.2",
description="Official Bitfinex Python API",
long_description=(
"A Python reference implementation of the Bitfinex API "
Expand Down