diff --git a/bfxapi/rest/BfxRestInterface.py b/bfxapi/rest/BfxRestInterface.py index c16c555..741a3ec 100644 --- a/bfxapi/rest/BfxRestInterface.py +++ b/bfxapi/rest/BfxRestInterface.py @@ -192,8 +192,10 @@ class _RestPublicEndpoints(_Requests): data = self._GET(f"candles/trade:{tf}:{symbol}/last", params=params) return serializers.Candle.parse(*data) - def get_derivatives_status(self, symbols: Union[List[str], Literal["ALL"]]) -> List[DerivativesStatus]: - params = { "keys": ",".join(symbols) if type(symbols) == List else "ALL" } + def get_derivatives_status(self, keys: Union[List[str], Literal["ALL"]]) -> List[DerivativesStatus]: + if keys == "ALL": + params = { "keys": "ALL" } + else: params = { "keys": ",".join(keys) } data = self._GET(f"status/deriv", params=params) @@ -405,4 +407,50 @@ class _RestAuthenticatedEndpoints(_Requests): "limit": limit } - return [ serializers.FundingCredit.parse(*subdata) for subdata in self._POST(endpoint, data=data) ] \ No newline at end of file + return [ serializers.FundingCredit.parse(*subdata) for subdata in self._POST(endpoint, data=data) ] + + def submit_wallet_transfer(self, from_wallet: str, to_wallet: str, currency: str, currency_to: str, amount: Union[Decimal, str]) -> Notification[Transfer]: + data = { + "from": from_wallet, "to": to_wallet, + "currency": currency, "currency_to": currency_to, + "amount": amount + } + + return serializers._Notification[Transfer](serializer=serializers.Transfer).parse(*self._POST("auth/w/transfer", data=data)) + + def submit_wallet_withdraw(self, wallet: str, method: str, address: str, amount: Union[Decimal, str]) -> Notification[Withdrawal]: + data = { + "wallet": wallet, "method": method, + "address": address, "amount": amount, + } + + return serializers._Notification[Withdrawal](serializer=serializers.Withdrawal).parse(*self._POST("auth/w/withdraw", data=data)) + + def get_deposit_address(self, wallet: str, method: str, renew: bool = False) -> Notification[DepositAddress]: + data = { + "wallet": wallet, + "method": method, + "renew": int(renew) + } + + return serializers._Notification[DepositAddress](serializer=serializers.DepositAddress).parse(*self._POST("auth/w/deposit/address", data=data)) + + def get_deposit_invoice(self, wallet: str, currency: str, amount: Union[Decimal, str]) -> Invoice: + data = { + "wallet": wallet, "currency": currency, + "amount": amount + } + + return serializers.Invoice.parse(*self._POST("auth/w/deposit/invoice", data=data)) + + def get_movements(self, currency: Optional[str] = None, start: Optional[str] = None, end: Optional[str] = None, limit: Optional[int] = None) -> List[Movement]: + if currency == None: + endpoint = "auth/r/movements/hist" + else: endpoint = f"auth/r/movements/{currency}/hist" + + data = { + "start": start, "end": end, + "limit": limit + } + + return [ serializers.Movement.parse(*subdata) for subdata in self._POST(endpoint, data=data) ] \ No newline at end of file diff --git a/bfxapi/rest/serializers.py b/bfxapi/rest/serializers.py index 35df8ae..b6af19f 100644 --- a/bfxapi/rest/serializers.py +++ b/bfxapi/rest/serializers.py @@ -348,4 +348,69 @@ FundingCredit = generate_labeler_serializer("FundingCredit", klass=types.Funding "POSITION_PAIR" ]) +Transfer = generate_labeler_serializer("Transfer", klass=types.Transfer, labels=[ + "MTS", + "WALLET_FROM", + "WALLET_TO", + "_PLACEHOLDER", + "CURRENCY", + "CURRENCY_TO", + "_PLACEHOLDER", + "AMOUNT" +]) + +Withdrawal = generate_labeler_serializer("Withdrawal", klass=types.Withdrawal, labels=[ + "WITHDRAWAL_ID", + "_PLACEHOLDER", + "METHOD", + "PAYMENT_ID", + "WALLET", + "AMOUNT", + "_PLACEHOLDER", + "_PLACEHOLDER", + "WITHDRAWAL_FEE" +]) + +DepositAddress = generate_labeler_serializer("DepositAddress", klass=types.DepositAddress, labels=[ + "_PLACEHOLDER", + "METHOD", + "CURRENCY_CODE", + "_PLACEHOLDER", + "ADDRESS", + "POOL_ADDRESS" +]) + +Invoice = generate_labeler_serializer("Invoice", klass=types.Invoice, labels=[ + "INVOICE_HASH", + "INVOICE", + "_PLACEHOLDER", + "_PLACEHOLDER", + "AMOUNT" +]) + +Movement = generate_labeler_serializer("Movement", klass=types.Movement, labels=[ + "ID", + "CURRENCY", + "CURRENCY_NAME", + "_PLACEHOLDER", + "_PLACEHOLDER", + "MTS_STARTED", + "MTS_UPDATED", + "_PLACEHOLDER", + "_PLACEHOLDER", + "STATUS", + "_PLACEHOLDER", + "_PLACEHOLDER", + "AMOUNT", + "FEES", + "_PLACEHOLDER", + "_PLACEHOLDER", + "DESTINATION_ADDRESS", + "_PLACEHOLDER", + "_PLACEHOLDER", + "_PLACEHOLDER", + "TRANSACTION_ID", + "WITHDRAW_TRANSACTION_NOTE" +]) + #endregion \ No newline at end of file diff --git a/bfxapi/rest/types.py b/bfxapi/rest/types.py index a27a404..1dbc533 100644 --- a/bfxapi/rest/types.py +++ b/bfxapi/rest/types.py @@ -286,4 +286,49 @@ class FundingCredit(_Type): NO_CLOSE: int POSITION_PAIR: str +@dataclass +class Transfer(_Type): + MTS: int + WALLET_FROM: str + WALLET_TO: str + CURRENCY: str + CURRENCY_TO: str + AMOUNT: int + +@dataclass +class Withdrawal(_Type): + WITHDRAWAL_ID: int + METHOD: str + PAYMENT_ID: str + WALLET: str + AMOUNT: float + WITHDRAWAL_FEE: float + +@dataclass +class DepositAddress(_Type): + METHOD: str + CURRENCY_CODE: str + ADDRESS: str + POOL_ADDRESS: str + +@dataclass +class Invoice(_Type): + INVOICE_HASH: str + INVOICE: str + AMOUNT: str + +@dataclass +class Movement(_Type): + ID: str + CURRENCY: str + CURRENCY_NAME: str + MTS_STARTED: int + MTS_UPDATED: int + STATUS: str + AMOUNT: int + FEES: int + DESTINATION_ADDRESS: str + TRANSACTION_ID: str + WITHDRAW_TRANSACTION_NOTE: str + #endregion \ No newline at end of file diff --git a/examples/rest/get_seed_candles.py b/examples/rest/get_seed_candles.py deleted file mode 100644 index ef02550..0000000 --- a/examples/rest/get_seed_candles.py +++ /dev/null @@ -1,15 +0,0 @@ -# python -c "from examples.rest.get_seed_candles import *" - -import time - -from bfxapi.client import Client, Constants - -bfx = Client( - REST_HOST=Constants.REST_HOST -) - -print(f"Candles: {bfx.rest.public.get_seed_candles(symbol='tBTCUSD')}") - -# Be sure to specify a period or aggregated period when retrieving funding candles. -# If you wish to mimic the candles found in the UI, use the following setup to aggregate all funding candles: a30:p2:p30 -print(f"Candles: {bfx.rest.public.get_seed_candles(symbol='fUSD:a30:p2:p30', tf='15m')}") \ No newline at end of file diff --git a/examples/rest/transfer_wallet.py b/examples/rest/transfer_wallet.py new file mode 100644 index 0000000..28dcccb --- /dev/null +++ b/examples/rest/transfer_wallet.py @@ -0,0 +1,46 @@ +# python -c "from examples.rest.transfer_wallet import *" + +import os + +from bfxapi.client import Client, Constants + +bfx = Client( + REST_HOST=Constants.REST_HOST, + API_KEY=os.getenv("BFX_API_KEY"), + API_SECRET=os.getenv("BFX_API_SECRET") +) + +def transfer_wallet(): + response = bfx.rest.auth.submit_wallet_transfer(from_wallet="exchange", to_wallet="funding", from_currency="ETH", to_currency="ETH", amount=0.001) + print("Transfer:", response.NOTIFY_INFO) + +def get_existing_deposit_address(): + response = bfx.rest.auth.get_deposit_address(wallet="exchange", method="bitcoin", renew=False) + print("Address:", response.NOTIFY_INFO) + +def create_new_deposit_address(): + response = bfx.rest.auth.get_deposit_address(wallet="exchange", method="bitcoin", renew=True) + print("Address:", response.NOTIFY_INFO) + +def withdraw(): + # tetheruse = Tether (ERC20) + response = bfx.rest.auth.submit_wallet_withdraw(wallet="exchange", method="tetheruse", amount=1, address="0x742d35Cc6634C0532925a3b844Bc454e4438f44e") + print("Address:", response.NOTIFY_INFO) + +def create_lighting_network_deposit_address(): + invoice = bfx.rest.auth.get_deposit_invoice(wallet="funding", currency="LNX", amount=0.001) + print("Invoice:", invoice) + +def get_movements(): + movements = bfx.rest.auth.get_movements(currency="BTC") + print("Movements:", movements) + +def run(): + transfer_wallet() + get_existing_deposit_address() + create_new_deposit_address() + withdraw() + create_lighting_network_deposit_address() + get_movements() + +run() \ No newline at end of file