diff --git a/fin_depo/defi_kraken.py b/fin_depo/defi_kraken.py index c924834..d5c3495 100644 --- a/fin_depo/defi_kraken.py +++ b/fin_depo/defi_kraken.py @@ -2,8 +2,8 @@ import datetime import logging -from decimal import Decimal from collections.abc import Iterator +from decimal import Decimal import fin_defs import krakenex @@ -64,9 +64,8 @@ class KrakenDepoFetcher(DepoFetcher): updated_time=now, ) - def _get_withdrawals(self) -> list[WithdrawalDetails]: - raise NotImplementedError("work in progress") + raise NotImplementedError('work in progress') """ json = self.client.query_private('WithdrawStatus',data={'start':1}) results = [] @@ -82,7 +81,7 @@ class KrakenDepoFetcher(DepoFetcher): """ def _get_deposits(self) -> list[DepositDetails]: - raise NotImplementedError("work in progress") + raise NotImplementedError('work in progress') """ json = self.client.query_private('DepositStatus',data={'start':1}) results = [] @@ -98,7 +97,7 @@ class KrakenDepoFetcher(DepoFetcher): """ def _get_historic_spot_orders(self) -> Iterator[TradeOrderDetails]: - raise NotImplementedError("work in progress") + raise NotImplementedError('work in progress') """ json = self.client.query_private('ClosedOrders',data={'start':1}) for order_id, v in json['result']['closed'].items(): @@ -118,16 +117,18 @@ class KrakenDepoFetcher(DepoFetcher): """ def _get_double_registers(self) -> list[DoubleRegister]: - json = self.client.query_private('Ledgers',data={'start':1}) + json = self.client.query_private('Ledgers', data={'start': 1}) return list(parse_from_ledger(json['result']['ledger'].values())) + def parse_asset_from_ticker(ticker: str) -> fin_defs.Asset: account = ticker.removesuffix('.HOLD') if account == 'ZEUR': return fin_defs.EUR return fin_defs.WELL_KNOWN_SYMBOLS[account] -def parse_from_ledger(ledger_items: list[dict[str,str]]) -> Iterator: + +def parse_from_ledger(ledger_items: list[dict[str, str]]) -> Iterator: collected_items = {} for item in ledger_items: collected_items.setdefault(item['refid'], []).append(item) @@ -139,19 +140,23 @@ def parse_from_ledger(ledger_items: list[dict[str,str]]) -> Iterator: assert len(items) == 1 asset = parse_asset_from_ticker(items[0]['asset']) yield DepositDetails( - deposit = fin_defs.AssetAmount(asset, Decimal(items[0]['amount'])), - fee = fin_defs.AssetAmount(asset, Decimal(items[0]['fee'])), - executed_time = datetime.datetime.fromtimestamp(items[0]['time'],tz=datetime.UTC), - raw_details = items[0], + deposit=fin_defs.AssetAmount(asset, Decimal(items[0]['amount'])), + fee=fin_defs.AssetAmount(asset, Decimal(items[0]['fee'])), + executed_time=datetime.datetime.fromtimestamp( + items[0]['time'], tz=datetime.UTC, + ), + raw_details=items[0], ) elif items[0]['type'] == 'withdrawal': assert len(items) == 1 asset = parse_asset_from_ticker(items[0]['asset']) yield WithdrawalDetails( - withdrawn = -fin_defs.AssetAmount(asset, Decimal(items[0]['amount'])), - fee = fin_defs.AssetAmount(asset, Decimal(items[0]['fee'])), - executed_time = datetime.datetime.fromtimestamp(items[0]['time'],tz=datetime.UTC), - raw_details = items[0], + withdrawn=-fin_defs.AssetAmount(asset, Decimal(items[0]['amount'])), + fee=fin_defs.AssetAmount(asset, Decimal(items[0]['fee'])), + executed_time=datetime.datetime.fromtimestamp( + items[0]['time'], tz=datetime.UTC, + ), + raw_details=items[0], ) else: assert len(items) == 2, items @@ -160,18 +165,20 @@ def parse_from_ledger(ledger_items: list[dict[str,str]]) -> Iterator: assert float(items[0]['amount']) > 0 assert float(items[1]['amount']) < 0 asset_input = parse_asset_from_ticker(items[1]['asset']) - asset_output = parse_asset_from_ticker(items[0]['asset']) + asset_output = parse_asset_from_ticker(items[0]['asset']) input = -fin_defs.AssetAmount(asset_input, Decimal(items[1]['amount'])) output = fin_defs.AssetAmount(asset_output, Decimal(items[0]['amount'])) fee_of_input = fin_defs.AssetAmount(asset_input, Decimal(items[1]['fee'])) fee_of_output = fin_defs.AssetAmount(asset_output, Decimal(items[0]['fee'])) details = TradeOrderDetails( - input = input, - output = output, - fee = fee_of_input if fee_of_input.amount != 0 else fee_of_output, - executed_time = datetime.datetime.fromtimestamp(items[1]['time'],tz=datetime.UTC), - order_id = refid, - raw_order_details = items[0], + input=input, + output=output, + fee=fee_of_input if fee_of_input.amount != 0 else fee_of_output, + executed_time=datetime.datetime.fromtimestamp( + items[1]['time'], tz=datetime.UTC, + ), + order_id=refid, + raw_order_details=items[0], ) yield details diff --git a/fin_depo/defi_kucoin.py b/fin_depo/defi_kucoin.py index 9db273d..003c516 100644 --- a/fin_depo/defi_kucoin.py +++ b/fin_depo/defi_kucoin.py @@ -244,7 +244,9 @@ class KucoinDepoFetcher(DepoFetcher): timestamp = int(end_time.timestamp() * 1000) page_index = 1 while True: - raw_details = self.kucoin_client.get_orders(end=timestamp, page=page_index) + raw_details = self.kucoin_client.get_orders( + end=timestamp, page=page_index, + ) yield from (order_from_json(item) for item in raw_details['items']) page_index = raw_details['currentPage'] + 1 diff --git a/test/test_kraken.py b/test/test_kraken.py index 31795b9..5a7b8d4 100644 --- a/test/test_kraken.py +++ b/test/test_kraken.py @@ -9,6 +9,7 @@ needs_secrets = pytest.mark.skipif( reason='Secret kraken_USERNAME required', ) + def get_fetcher(): return fin_depo.defi_kraken.KrakenDepoFetcher( secrets.KRAKEN_KEY, diff --git a/test/test_kucoin_trading.py b/test/test_kucoin_trading.py index b547f10..a21e953 100644 --- a/test/test_kucoin_trading.py +++ b/test/test_kucoin_trading.py @@ -32,7 +32,7 @@ def test_place_market_order_requires_allow_trades(): with pytest.raises(PermissionError) as m: fetcher.place_market_order( - fin_defs.AssetAmount(fin_defs.MPC, Decimal(1)), fin_defs.USDT + fin_defs.AssetAmount(fin_defs.MPC, Decimal(1)), fin_defs.USDT, ) assert 'KucoinDepoFetcher.allow_trades is not enabled: Cannot make trades' in str(m)