ccxt 4.2.66__py2.py3-none-any.whl → 4.2.68__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ccxt/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.2.66'
25
+ __version__ = '4.2.68'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.66'
7
+ __version__ = '4.2.68'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.2.66'
5
+ __version__ = '4.2.68'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -1527,7 +1527,9 @@ class Exchange(BaseExchange):
1527
1527
  response = await getattr(self, method)(symbol, None, maxEntriesPerRequest, params)
1528
1528
  responseLength = len(response)
1529
1529
  if self.verbose:
1530
- backwardMessage = 'Dynamic pagination call ' + calls + ' method ' + method + ' response length ' + responseLength + ' timestamp ' + paginationTimestamp
1530
+ backwardMessage = 'Dynamic pagination call ' + self.number_to_string(calls) + ' method ' + method + ' response length ' + self.number_to_string(responseLength)
1531
+ if paginationTimestamp is not None:
1532
+ backwardMessage += ' timestamp ' + self.number_to_string(paginationTimestamp)
1531
1533
  self.log(backwardMessage)
1532
1534
  if responseLength == 0:
1533
1535
  break
@@ -1542,7 +1544,9 @@ class Exchange(BaseExchange):
1542
1544
  response = await getattr(self, method)(symbol, paginationTimestamp, maxEntriesPerRequest, params)
1543
1545
  responseLength = len(response)
1544
1546
  if self.verbose:
1545
- forwardMessage = 'Dynamic pagination call ' + calls + ' method ' + method + ' response length ' + responseLength + ' timestamp ' + paginationTimestamp
1547
+ forwardMessage = 'Dynamic pagination call ' + self.number_to_string(calls) + ' method ' + method + ' response length ' + self.number_to_string(responseLength)
1548
+ if paginationTimestamp is not None:
1549
+ forwardMessage += ' timestamp ' + self.number_to_string(paginationTimestamp)
1546
1550
  self.log(forwardMessage)
1547
1551
  if responseLength == 0:
1548
1552
  break
@@ -1347,9 +1347,10 @@ class bitfinex2(Exchange, ImplicitAPI):
1347
1347
  'symbol': market['id'],
1348
1348
  'timeframe': self.safe_string(self.timeframes, timeframe, timeframe),
1349
1349
  'sort': 1,
1350
- 'start': since,
1351
1350
  'limit': limit,
1352
1351
  }
1352
+ if since is not None:
1353
+ request['start'] = since
1353
1354
  request, params = self.handle_until_option('end', request, params)
1354
1355
  response = await self.publicGetCandlesTradeTimeframeSymbolHist(self.extend(request, params))
1355
1356
  #
@@ -2792,7 +2793,7 @@ class bitfinex2(Exchange, ImplicitAPI):
2792
2793
  :param dict [params]: extra parameters specific to the exchange API endpoint
2793
2794
  :returns dict: a `funding rate structure <https://docs.ccxt.com/#/?id=funding-rate-structure>`
2794
2795
  """
2795
- return self.fetch_funding_rates([symbol], params)
2796
+ return await self.fetch_funding_rates([symbol], params)
2796
2797
 
2797
2798
  async def fetch_funding_rates(self, symbols: Strings = None, params={}):
2798
2799
  """
@@ -2174,7 +2174,8 @@ class gate(Exchange, ImplicitAPI):
2174
2174
  request, requestParams = self.prepare_request(market, type, query)
2175
2175
  request['type'] = 'fund' # 'dnw' 'pnl' 'fee' 'refr' 'fund' 'point_dnw' 'point_fee' 'point_refr'
2176
2176
  if since is not None:
2177
- request['from'] = since / 1000
2177
+ # from should be integer
2178
+ request['from'] = self.parse_to_int(since / 1000)
2178
2179
  if limit is not None:
2179
2180
  request['limit'] = limit
2180
2181
  response = None
@@ -849,13 +849,15 @@ class hyperliquid(Exchange, ImplicitAPI):
849
849
  if clientOrderId is not None:
850
850
  orderObj['c'] = clientOrderId
851
851
  orderReq.append(orderObj)
852
+ vaultAddress = self.safe_string(params, 'vaultAddress')
852
853
  orderAction = {
853
854
  'type': 'order',
854
855
  'orders': orderReq,
855
856
  'grouping': 'na',
856
- 'brokerCode': 1,
857
+ # 'brokerCode': 1, # cant
857
858
  }
858
- vaultAddress = self.safe_string(params, 'vaultAddress')
859
+ if vaultAddress is None:
860
+ orderAction['brokerCode'] = 1
859
861
  signature = self.sign_l1_action(orderAction, nonce, vaultAddress)
860
862
  request = {
861
863
  'action': orderAction,
@@ -263,6 +263,9 @@ class krakenfutures(Exchange, ImplicitAPI):
263
263
  },
264
264
  },
265
265
  },
266
+ 'fetchTrades': {
267
+ 'method': 'historyGetMarketSymbolExecutions', # historyGetMarketSymbolExecutions, publicGetHistory
268
+ },
266
269
  },
267
270
  'timeframes': {
268
271
  '1m': '1m',
@@ -685,6 +688,7 @@ class krakenfutures(Exchange, ImplicitAPI):
685
688
  async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
686
689
  """
687
690
  :see: https://docs.futures.kraken.com/#http-api-trading-v3-api-market-data-get-trade-history
691
+ :see: https://docs.futures.kraken.com/#http-api-history-market-history-get-public-execution-events
688
692
  Fetch a history of filled trades that self account has made
689
693
  :param str symbol: Unified CCXT market symbol
690
694
  :param int [since]: Timestamp in ms of earliest trade. Not used by krakenfutures except in combination with params.until
@@ -692,6 +696,7 @@ class krakenfutures(Exchange, ImplicitAPI):
692
696
  :param dict [params]: Exchange specific params
693
697
  :param int [params.until]: Timestamp in ms of latest trade
694
698
  :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
699
+ :param str [params.method]: The method to use to fetch trades. Can be 'historyGetMarketSymbolExecutions' or 'publicGetHistory' default is 'historyGetMarketSymbolExecutions'
695
700
  :returns: An array of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
696
701
  """
697
702
  await self.load_markets()
@@ -703,34 +708,105 @@ class krakenfutures(Exchange, ImplicitAPI):
703
708
  request = {
704
709
  'symbol': market['id'],
705
710
  }
706
- until = self.safe_integer(params, 'until')
707
- if until is not None:
708
- request['lastTime'] = self.iso8601(until)
709
- #
710
- # {
711
- # "result": "success",
712
- # "history": [
713
- # {
714
- # "time": "2022-03-18T04:55:37.692Z",
715
- # "trade_id": 100,
716
- # "price": 0.7921,
717
- # "size": 1068,
718
- # "side": "sell",
719
- # "type": "fill",
720
- # "uid": "6c5da0b0-f1a8-483f-921f-466eb0388265"
721
- # },
722
- # ...
723
- # ],
724
- # "serverTime": "2022-03-18T06:39:18.056Z"
725
- # }
726
- #
727
- response = await self.publicGetHistory(self.extend(request, params))
728
- history = self.safe_value(response, 'history')
729
- return self.parse_trades(history, market, since, limit)
711
+ method = None
712
+ method, params = self.handle_option_and_params(params, 'fetchTrades', 'method', 'historyGetMarketSymbolExecutions')
713
+ rawTrades = None
714
+ isFullHistoryEndpoint = (method == 'historyGetMarketSymbolExecutions')
715
+ if isFullHistoryEndpoint:
716
+ request, params = self.handle_until_option('before', request, params)
717
+ if since is not None:
718
+ request['since'] = since
719
+ request['sort'] = 'asc'
720
+ if limit is not None:
721
+ request['count'] = limit
722
+ response = await self.historyGetMarketSymbolExecutions(self.extend(request, params))
723
+ #
724
+ # {
725
+ # "elements": [
726
+ # {
727
+ # "uid": "a5105030-f054-44cc-98ab-30d5cae96bef",
728
+ # "timestamp": "1710150778607",
729
+ # "event": {
730
+ # "Execution": {
731
+ # "execution": {
732
+ # "uid": "2d485b71-cd28-4a1e-9364-371a127550d2",
733
+ # "makerOrder": {
734
+ # "uid": "0a25f66b-1109-49ec-93a3-d17bf9e9137e",
735
+ # "tradeable": "PF_XBTUSD",
736
+ # "direction": "Buy",
737
+ # "quantity": "0.26500",
738
+ # "timestamp": "1710150778570",
739
+ # "limitPrice": "71907",
740
+ # "orderType": "Post",
741
+ # "reduceOnly": False,
742
+ # "lastUpdateTimestamp": "1710150778570"
743
+ # },
744
+ # "takerOrder": {
745
+ # "uid": "04de3ee0-9125-4960-bf8f-f63b577b6790",
746
+ # "tradeable": "PF_XBTUSD",
747
+ # "direction": "Sell",
748
+ # "quantity": "0.0002",
749
+ # "timestamp": "1710150778607",
750
+ # "limitPrice": "71187.00",
751
+ # "orderType": "Market",
752
+ # "reduceOnly": False,
753
+ # "lastUpdateTimestamp": "1710150778607"
754
+ # },
755
+ # "timestamp": "1710150778607",
756
+ # "quantity": "0.0002",
757
+ # "price": "71907",
758
+ # "markPrice": "71903.32715463147",
759
+ # "limitFilled": False,
760
+ # "usdValue": "14.38"
761
+ # },
762
+ # "takerReducedQuantity": ""
763
+ # }
764
+ # }
765
+ # },
766
+ # ... followed by older items
767
+ # ],
768
+ # "len": "1000",
769
+ # "continuationToken": "QTexMDE0OTe33NTcyXy8xNDIzAjc1NjY5MwI="
770
+ # }
771
+ #
772
+ elements = self.safe_list(response, 'elements', [])
773
+ # we need to reverse the list to fix chronology
774
+ rawTrades = []
775
+ length = len(elements)
776
+ for i in range(0, length):
777
+ index = length - 1 - i
778
+ element = elements[index]
779
+ event = self.safe_dict(element, 'event', {})
780
+ executionContainer = self.safe_dict(event, 'Execution', {})
781
+ rawTrade = self.safe_dict(executionContainer, 'execution', {})
782
+ rawTrades.append(rawTrade)
783
+ else:
784
+ request, params = self.handle_until_option('lastTime', request, params)
785
+ response = await self.publicGetHistory(self.extend(request, params))
786
+ #
787
+ # {
788
+ # "result": "success",
789
+ # "history": [
790
+ # {
791
+ # "time": "2022-03-18T04:55:37.692Z",
792
+ # "trade_id": 100,
793
+ # "price": 0.7921,
794
+ # "size": 1068,
795
+ # "side": "sell",
796
+ # "type": "fill",
797
+ # "uid": "6c5da0b0-f1a8-483f-921f-466eb0388265"
798
+ # },
799
+ # ...
800
+ # ],
801
+ # "serverTime": "2022-03-18T06:39:18.056Z"
802
+ # }
803
+ #
804
+ rawTrades = self.safe_list(response, 'history', [])
805
+ return self.parse_trades(rawTrades, market, since, limit)
730
806
 
731
807
  def parse_trade(self, trade, market: Market = None) -> Trade:
732
808
  #
733
- # fetchTrades(public)
809
+ # fetchTrades(recent trades)
734
810
  #
735
811
  # {
736
812
  # "time": "2019-02-14T09:25:33.920Z",
@@ -738,10 +814,24 @@ class krakenfutures(Exchange, ImplicitAPI):
738
814
  # "price": 3574,
739
815
  # "size": 100,
740
816
  # "side": "buy",
741
- # "type": "fill" # fill, liquidation, assignment, termination
817
+ # "type": "fill" # fill, liquidation, assignment, termination
742
818
  # "uid": "11c3d82c-9e70-4fe9-8115-f643f1b162d4"
743
819
  # }
744
820
  #
821
+ # fetchTrades(executions history)
822
+ #
823
+ # {
824
+ # "timestamp": "1710152516830",
825
+ # "price": "71927.0",
826
+ # "quantity": "0.0695",
827
+ # "markPrice": "71936.38701675525",
828
+ # "limitFilled": True,
829
+ # "usdValue": "4998.93",
830
+ # "uid": "116ae634-253f-470b-bd20-fa9d429fb8b1",
831
+ # "makerOrder": {"uid": "17bfe4de-c01e-4938-926c-617d2a2d0597", "tradeable": "PF_XBTUSD", "direction": "Buy", "quantity": "0.0695", "timestamp": "1710152515836", "limitPrice": "71927.0", "orderType": "Post", "reduceOnly": False, "lastUpdateTimestamp": "1710152515836"},
832
+ # "takerOrder": {"uid": "d3e437b4-aa70-4108-b5cf-b1eecb9845b5", "tradeable": "PF_XBTUSD", "direction": "Sell", "quantity": "0.940100", "timestamp": "1710152516830", "limitPrice": "71915", "orderType": "IoC", "reduceOnly": False, "lastUpdateTimestamp": "1710152516830"}
833
+ # }
834
+ #
745
835
  # fetchMyTrades(private)
746
836
  #
747
837
  # {
@@ -782,7 +872,7 @@ class krakenfutures(Exchange, ImplicitAPI):
782
872
  #
783
873
  timestamp = self.parse8601(self.safe_string_2(trade, 'time', 'fillTime'))
784
874
  price = self.safe_string(trade, 'price')
785
- amount = self.safe_string_2(trade, 'size', 'amount', '0.0')
875
+ amount = self.safe_string_n(trade, ['size', 'amount', 'quantity'], '0.0')
786
876
  id = self.safe_string_2(trade, 'uid', 'fill_id')
787
877
  if id is None:
788
878
  id = self.safe_string(trade, 'executionId')
@@ -821,6 +911,13 @@ class krakenfutures(Exchange, ImplicitAPI):
821
911
  takerOrMaker = 'taker'
822
912
  elif fillType.find('maker') >= 0:
823
913
  takerOrMaker = 'maker'
914
+ isHistoricalExecution = ('takerOrder' in trade)
915
+ if isHistoricalExecution:
916
+ timestamp = self.safe_integer(trade, 'timestamp')
917
+ taker = self.safe_dict(trade, 'takerOrder', {})
918
+ if taker is not None:
919
+ side = self.safe_string_lower(taker, 'direction')
920
+ takerOrMaker = 'taker'
824
921
  return self.safe_trade({
825
922
  'info': trade,
826
923
  'id': id,
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.66'
7
+ __version__ = '4.2.68'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -3514,12 +3514,18 @@ class Exchange(object):
3514
3514
  market = self.market(symbol)
3515
3515
  return self.safe_string(market, 'symbol', symbol)
3516
3516
 
3517
- def handle_param_string(self, params: object, paramName: str, defaultValue=None):
3517
+ def handle_param_string(self, params: object, paramName: str, defaultValue: Str = None):
3518
3518
  value = self.safe_string(params, paramName, defaultValue)
3519
3519
  if value is not None:
3520
3520
  params = self.omit(params, paramName)
3521
3521
  return [value, params]
3522
3522
 
3523
+ def handle_param_integer(self, params: object, paramName: str, defaultValue: Int = None):
3524
+ value = self.safe_integer(params, paramName, defaultValue)
3525
+ if value is not None:
3526
+ params = self.omit(params, paramName)
3527
+ return [value, params]
3528
+
3523
3529
  def resolve_path(self, path, params):
3524
3530
  return [
3525
3531
  self.implode_params(path, params),
@@ -5060,7 +5066,9 @@ class Exchange(object):
5060
5066
  response = getattr(self, method)(symbol, None, maxEntriesPerRequest, params)
5061
5067
  responseLength = len(response)
5062
5068
  if self.verbose:
5063
- backwardMessage = 'Dynamic pagination call ' + calls + ' method ' + method + ' response length ' + responseLength + ' timestamp ' + paginationTimestamp
5069
+ backwardMessage = 'Dynamic pagination call ' + self.number_to_string(calls) + ' method ' + method + ' response length ' + self.number_to_string(responseLength)
5070
+ if paginationTimestamp is not None:
5071
+ backwardMessage += ' timestamp ' + self.number_to_string(paginationTimestamp)
5064
5072
  self.log(backwardMessage)
5065
5073
  if responseLength == 0:
5066
5074
  break
@@ -5075,7 +5083,9 @@ class Exchange(object):
5075
5083
  response = getattr(self, method)(symbol, paginationTimestamp, maxEntriesPerRequest, params)
5076
5084
  responseLength = len(response)
5077
5085
  if self.verbose:
5078
- forwardMessage = 'Dynamic pagination call ' + calls + ' method ' + method + ' response length ' + responseLength + ' timestamp ' + paginationTimestamp
5086
+ forwardMessage = 'Dynamic pagination call ' + self.number_to_string(calls) + ' method ' + method + ' response length ' + self.number_to_string(responseLength)
5087
+ if paginationTimestamp is not None:
5088
+ forwardMessage += ' timestamp ' + self.number_to_string(paginationTimestamp)
5079
5089
  self.log(forwardMessage)
5080
5090
  if responseLength == 0:
5081
5091
  break
ccxt/bitfinex2.py CHANGED
@@ -1347,9 +1347,10 @@ class bitfinex2(Exchange, ImplicitAPI):
1347
1347
  'symbol': market['id'],
1348
1348
  'timeframe': self.safe_string(self.timeframes, timeframe, timeframe),
1349
1349
  'sort': 1,
1350
- 'start': since,
1351
1350
  'limit': limit,
1352
1351
  }
1352
+ if since is not None:
1353
+ request['start'] = since
1353
1354
  request, params = self.handle_until_option('end', request, params)
1354
1355
  response = self.publicGetCandlesTradeTimeframeSymbolHist(self.extend(request, params))
1355
1356
  #
ccxt/gate.py CHANGED
@@ -2173,7 +2173,8 @@ class gate(Exchange, ImplicitAPI):
2173
2173
  request, requestParams = self.prepare_request(market, type, query)
2174
2174
  request['type'] = 'fund' # 'dnw' 'pnl' 'fee' 'refr' 'fund' 'point_dnw' 'point_fee' 'point_refr'
2175
2175
  if since is not None:
2176
- request['from'] = since / 1000
2176
+ # from should be integer
2177
+ request['from'] = self.parse_to_int(since / 1000)
2177
2178
  if limit is not None:
2178
2179
  request['limit'] = limit
2179
2180
  response = None
ccxt/hyperliquid.py CHANGED
@@ -849,13 +849,15 @@ class hyperliquid(Exchange, ImplicitAPI):
849
849
  if clientOrderId is not None:
850
850
  orderObj['c'] = clientOrderId
851
851
  orderReq.append(orderObj)
852
+ vaultAddress = self.safe_string(params, 'vaultAddress')
852
853
  orderAction = {
853
854
  'type': 'order',
854
855
  'orders': orderReq,
855
856
  'grouping': 'na',
856
- 'brokerCode': 1,
857
+ # 'brokerCode': 1, # cant
857
858
  }
858
- vaultAddress = self.safe_string(params, 'vaultAddress')
859
+ if vaultAddress is None:
860
+ orderAction['brokerCode'] = 1
859
861
  signature = self.sign_l1_action(orderAction, nonce, vaultAddress)
860
862
  request = {
861
863
  'action': orderAction,
ccxt/krakenfutures.py CHANGED
@@ -263,6 +263,9 @@ class krakenfutures(Exchange, ImplicitAPI):
263
263
  },
264
264
  },
265
265
  },
266
+ 'fetchTrades': {
267
+ 'method': 'historyGetMarketSymbolExecutions', # historyGetMarketSymbolExecutions, publicGetHistory
268
+ },
266
269
  },
267
270
  'timeframes': {
268
271
  '1m': '1m',
@@ -685,6 +688,7 @@ class krakenfutures(Exchange, ImplicitAPI):
685
688
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
686
689
  """
687
690
  :see: https://docs.futures.kraken.com/#http-api-trading-v3-api-market-data-get-trade-history
691
+ :see: https://docs.futures.kraken.com/#http-api-history-market-history-get-public-execution-events
688
692
  Fetch a history of filled trades that self account has made
689
693
  :param str symbol: Unified CCXT market symbol
690
694
  :param int [since]: Timestamp in ms of earliest trade. Not used by krakenfutures except in combination with params.until
@@ -692,6 +696,7 @@ class krakenfutures(Exchange, ImplicitAPI):
692
696
  :param dict [params]: Exchange specific params
693
697
  :param int [params.until]: Timestamp in ms of latest trade
694
698
  :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
699
+ :param str [params.method]: The method to use to fetch trades. Can be 'historyGetMarketSymbolExecutions' or 'publicGetHistory' default is 'historyGetMarketSymbolExecutions'
695
700
  :returns: An array of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
696
701
  """
697
702
  self.load_markets()
@@ -703,34 +708,105 @@ class krakenfutures(Exchange, ImplicitAPI):
703
708
  request = {
704
709
  'symbol': market['id'],
705
710
  }
706
- until = self.safe_integer(params, 'until')
707
- if until is not None:
708
- request['lastTime'] = self.iso8601(until)
709
- #
710
- # {
711
- # "result": "success",
712
- # "history": [
713
- # {
714
- # "time": "2022-03-18T04:55:37.692Z",
715
- # "trade_id": 100,
716
- # "price": 0.7921,
717
- # "size": 1068,
718
- # "side": "sell",
719
- # "type": "fill",
720
- # "uid": "6c5da0b0-f1a8-483f-921f-466eb0388265"
721
- # },
722
- # ...
723
- # ],
724
- # "serverTime": "2022-03-18T06:39:18.056Z"
725
- # }
726
- #
727
- response = self.publicGetHistory(self.extend(request, params))
728
- history = self.safe_value(response, 'history')
729
- return self.parse_trades(history, market, since, limit)
711
+ method = None
712
+ method, params = self.handle_option_and_params(params, 'fetchTrades', 'method', 'historyGetMarketSymbolExecutions')
713
+ rawTrades = None
714
+ isFullHistoryEndpoint = (method == 'historyGetMarketSymbolExecutions')
715
+ if isFullHistoryEndpoint:
716
+ request, params = self.handle_until_option('before', request, params)
717
+ if since is not None:
718
+ request['since'] = since
719
+ request['sort'] = 'asc'
720
+ if limit is not None:
721
+ request['count'] = limit
722
+ response = self.historyGetMarketSymbolExecutions(self.extend(request, params))
723
+ #
724
+ # {
725
+ # "elements": [
726
+ # {
727
+ # "uid": "a5105030-f054-44cc-98ab-30d5cae96bef",
728
+ # "timestamp": "1710150778607",
729
+ # "event": {
730
+ # "Execution": {
731
+ # "execution": {
732
+ # "uid": "2d485b71-cd28-4a1e-9364-371a127550d2",
733
+ # "makerOrder": {
734
+ # "uid": "0a25f66b-1109-49ec-93a3-d17bf9e9137e",
735
+ # "tradeable": "PF_XBTUSD",
736
+ # "direction": "Buy",
737
+ # "quantity": "0.26500",
738
+ # "timestamp": "1710150778570",
739
+ # "limitPrice": "71907",
740
+ # "orderType": "Post",
741
+ # "reduceOnly": False,
742
+ # "lastUpdateTimestamp": "1710150778570"
743
+ # },
744
+ # "takerOrder": {
745
+ # "uid": "04de3ee0-9125-4960-bf8f-f63b577b6790",
746
+ # "tradeable": "PF_XBTUSD",
747
+ # "direction": "Sell",
748
+ # "quantity": "0.0002",
749
+ # "timestamp": "1710150778607",
750
+ # "limitPrice": "71187.00",
751
+ # "orderType": "Market",
752
+ # "reduceOnly": False,
753
+ # "lastUpdateTimestamp": "1710150778607"
754
+ # },
755
+ # "timestamp": "1710150778607",
756
+ # "quantity": "0.0002",
757
+ # "price": "71907",
758
+ # "markPrice": "71903.32715463147",
759
+ # "limitFilled": False,
760
+ # "usdValue": "14.38"
761
+ # },
762
+ # "takerReducedQuantity": ""
763
+ # }
764
+ # }
765
+ # },
766
+ # ... followed by older items
767
+ # ],
768
+ # "len": "1000",
769
+ # "continuationToken": "QTexMDE0OTe33NTcyXy8xNDIzAjc1NjY5MwI="
770
+ # }
771
+ #
772
+ elements = self.safe_list(response, 'elements', [])
773
+ # we need to reverse the list to fix chronology
774
+ rawTrades = []
775
+ length = len(elements)
776
+ for i in range(0, length):
777
+ index = length - 1 - i
778
+ element = elements[index]
779
+ event = self.safe_dict(element, 'event', {})
780
+ executionContainer = self.safe_dict(event, 'Execution', {})
781
+ rawTrade = self.safe_dict(executionContainer, 'execution', {})
782
+ rawTrades.append(rawTrade)
783
+ else:
784
+ request, params = self.handle_until_option('lastTime', request, params)
785
+ response = self.publicGetHistory(self.extend(request, params))
786
+ #
787
+ # {
788
+ # "result": "success",
789
+ # "history": [
790
+ # {
791
+ # "time": "2022-03-18T04:55:37.692Z",
792
+ # "trade_id": 100,
793
+ # "price": 0.7921,
794
+ # "size": 1068,
795
+ # "side": "sell",
796
+ # "type": "fill",
797
+ # "uid": "6c5da0b0-f1a8-483f-921f-466eb0388265"
798
+ # },
799
+ # ...
800
+ # ],
801
+ # "serverTime": "2022-03-18T06:39:18.056Z"
802
+ # }
803
+ #
804
+ rawTrades = self.safe_list(response, 'history', [])
805
+ return self.parse_trades(rawTrades, market, since, limit)
730
806
 
731
807
  def parse_trade(self, trade, market: Market = None) -> Trade:
732
808
  #
733
- # fetchTrades(public)
809
+ # fetchTrades(recent trades)
734
810
  #
735
811
  # {
736
812
  # "time": "2019-02-14T09:25:33.920Z",
@@ -738,10 +814,24 @@ class krakenfutures(Exchange, ImplicitAPI):
738
814
  # "price": 3574,
739
815
  # "size": 100,
740
816
  # "side": "buy",
741
- # "type": "fill" # fill, liquidation, assignment, termination
817
+ # "type": "fill" # fill, liquidation, assignment, termination
742
818
  # "uid": "11c3d82c-9e70-4fe9-8115-f643f1b162d4"
743
819
  # }
744
820
  #
821
+ # fetchTrades(executions history)
822
+ #
823
+ # {
824
+ # "timestamp": "1710152516830",
825
+ # "price": "71927.0",
826
+ # "quantity": "0.0695",
827
+ # "markPrice": "71936.38701675525",
828
+ # "limitFilled": True,
829
+ # "usdValue": "4998.93",
830
+ # "uid": "116ae634-253f-470b-bd20-fa9d429fb8b1",
831
+ # "makerOrder": {"uid": "17bfe4de-c01e-4938-926c-617d2a2d0597", "tradeable": "PF_XBTUSD", "direction": "Buy", "quantity": "0.0695", "timestamp": "1710152515836", "limitPrice": "71927.0", "orderType": "Post", "reduceOnly": False, "lastUpdateTimestamp": "1710152515836"},
832
+ # "takerOrder": {"uid": "d3e437b4-aa70-4108-b5cf-b1eecb9845b5", "tradeable": "PF_XBTUSD", "direction": "Sell", "quantity": "0.940100", "timestamp": "1710152516830", "limitPrice": "71915", "orderType": "IoC", "reduceOnly": False, "lastUpdateTimestamp": "1710152516830"}
833
+ # }
834
+ #
745
835
  # fetchMyTrades(private)
746
836
  #
747
837
  # {
@@ -782,7 +872,7 @@ class krakenfutures(Exchange, ImplicitAPI):
782
872
  #
783
873
  timestamp = self.parse8601(self.safe_string_2(trade, 'time', 'fillTime'))
784
874
  price = self.safe_string(trade, 'price')
785
- amount = self.safe_string_2(trade, 'size', 'amount', '0.0')
875
+ amount = self.safe_string_n(trade, ['size', 'amount', 'quantity'], '0.0')
786
876
  id = self.safe_string_2(trade, 'uid', 'fill_id')
787
877
  if id is None:
788
878
  id = self.safe_string(trade, 'executionId')
@@ -821,6 +911,13 @@ class krakenfutures(Exchange, ImplicitAPI):
821
911
  takerOrMaker = 'taker'
822
912
  elif fillType.find('maker') >= 0:
823
913
  takerOrMaker = 'maker'
914
+ isHistoricalExecution = ('takerOrder' in trade)
915
+ if isHistoricalExecution:
916
+ timestamp = self.safe_integer(trade, 'timestamp')
917
+ taker = self.safe_dict(trade, 'takerOrder', {})
918
+ if taker is not None:
919
+ side = self.safe_string_lower(taker, 'direction')
920
+ takerOrMaker = 'taker'
824
921
  return self.safe_trade({
825
922
  'info': trade,
826
923
  'id': id,
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.66'
7
+ __version__ = '4.2.68'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.2.66
3
+ Version: 4.2.68
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -259,13 +259,13 @@ console.log(version, Object.keys(exchanges));
259
259
 
260
260
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
261
261
 
262
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.66/dist/ccxt.browser.js
263
- * unpkg: https://unpkg.com/ccxt@4.2.66/dist/ccxt.browser.js
262
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.68/dist/ccxt.browser.js
263
+ * unpkg: https://unpkg.com/ccxt@4.2.68/dist/ccxt.browser.js
264
264
 
265
265
  CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
266
266
 
267
267
  ```HTML
268
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.66/dist/ccxt.browser.js"></script>
268
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.68/dist/ccxt.browser.js"></script>
269
269
  ```
270
270
 
271
271
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=97OpITwY_1kmtUaxKIFu0nYQ_ZdPBXkKAJQY4Y7TT5o,15444
1
+ ccxt/__init__.py,sha256=CawUjzL4-ousENhUpIvPjP5EGA2Cx_yAGVG2v4qqgGg,15444
2
2
  ccxt/ace.py,sha256=pIA1Ipres_-IcaIF1hiSewvx3gLNH_19ZPykd4OO5zc,41406
3
3
  ccxt/alpaca.py,sha256=EN4OdS7Z3hU5FUgrtd-PP3E1b3jplP-cGViamkAWUaM,46889
4
4
  ccxt/ascendex.py,sha256=uJvx7lkPbZmHDOcFw11vKqKWUkn9pbRz2OkfpvUMHKs,144175
@@ -15,7 +15,7 @@ ccxt/bitbay.py,sha256=xAIjzGRDVGwoy-Gygd99H0YN4wiaz_0lR0Z14oxaaxc,478
15
15
  ccxt/bitbns.py,sha256=tqJs4hyNpX3TOYVkpvu9xwL1xK_7SPbv7vVxFEUZlMI,48117
16
16
  ccxt/bitcoincom.py,sha256=PyWIl4nC4jp5Uba2lI1At0N_hhNyWD0DoZC_MSyL_s4,502
17
17
  ccxt/bitfinex.py,sha256=e4k5Flv2W4DFLa12jdcmJ0z9fIyaIqpDV72SYOf5OPc,71434
18
- ccxt/bitfinex2.py,sha256=loIpNjyP25Mech-INXTQ1zhUaQC6-tzdJUhTYEDiLTA,157636
18
+ ccxt/bitfinex2.py,sha256=nFloUvu64Uu5X2Fr9McSoJCe0rqjsr7ZAuCL8XzjMNs,157675
19
19
  ccxt/bitflyer.py,sha256=4p6VZl4A6WzKMtOzyJDkEZceCAt0vfhtPoU0dZ_avHA,40255
20
20
  ccxt/bitget.py,sha256=4DS44u4Tw8iqHo4e5ARJ9CSoDrg8GtofuFKmAjwuDC0,404705
21
21
  ccxt/bithumb.py,sha256=48jV03pqYBmAQGjGX4wJDrwV5r35u3OZyS6wOtBqtSg,45228
@@ -55,7 +55,7 @@ ccxt/digifinex.py,sha256=V2nJqSNoiUsiNYRz9GLk8ItUJ2dAlD1WAF9Ei4Rzsls,169285
55
55
  ccxt/exmo.py,sha256=luqEu6-URZ6ML7k8bv0Q9s3vuZZVBnn4xRHXkbq2od4,114223
56
56
  ccxt/flowbtc.py,sha256=YPvm6tbsHJJUQBspFcHuVPQfVmiWzwnVvfzRqBdQX6U,1169
57
57
  ccxt/fmfwio.py,sha256=RbVLvzPwnqfDsE7Ea-N13ISCC82eJVPsXYjrleASmew,1236
58
- ccxt/gate.py,sha256=BIlJJqnRIBkIOcv9menfPgmzx2pjZfqBUVE_6uJ9G_0,298140
58
+ ccxt/gate.py,sha256=GtFMw46wWYmPPri_txuFo3uhatihAFQr_DX51RgpdeA,298196
59
59
  ccxt/gateio.py,sha256=86AETJWODl_vA5VNeQRHZprmpNIY1HAxCddKZcnKSi8,445
60
60
  ccxt/gemini.py,sha256=U4ap6suVPmNq_-52HnlPCxs5X_Z-nkW2Wm-oA5po25A,75945
61
61
  ccxt/hitbtc.py,sha256=8BXEFGy29swu_k8fJh4FXDd6qGwSa3oAeLFUBCdv324,150711
@@ -64,12 +64,12 @@ ccxt/hollaex.py,sha256=7QViVaPjHuxAVqUkwKPZHJDrMQFHNHILrU4CK_fy5KE,75827
64
64
  ccxt/htx.py,sha256=rlayFd5u3yi7AWLPNomsTAfnfRn0nTupQhNJVWH3JCI,417465
65
65
  ccxt/huobi.py,sha256=4vaG7IRN7fyjaJ_ac6S-njlHOfSEN5de7aq0noznxYw,438
66
66
  ccxt/huobijp.py,sha256=siZ9iHjR-TNFLiiVqBGN2dZ3jQvAZzQPr48WbaqdqiM,87878
67
- ccxt/hyperliquid.py,sha256=nFPLL6xRss1XMxYt904uBhc4eQrNXfXoUelcaWGCvPs,80227
67
+ ccxt/hyperliquid.py,sha256=GIBKEj8L2JftXCZbE44baztdT6lTXnZV7bgvZ-bULoo,80312
68
68
  ccxt/idex.py,sha256=iLgcPQW4BZrun0ccINYSq6xUacsJ24Kt6sX9BiCkAZ4,72703
69
69
  ccxt/independentreserve.py,sha256=awlESBQdUPDpgnKWpHAo2pxC-wcNiBLI8f3Wn9V7OdI,31979
70
70
  ccxt/indodax.py,sha256=2X0AboPTwvdxFWT9BwhkY90K1U1aaPA8L6UiHnO-AIY,51762
71
71
  ccxt/kraken.py,sha256=JSoRerunwUGX7wdr-mHQigNkxNlZK0au-brEb3NmX5c,121866
72
- ccxt/krakenfutures.py,sha256=WUadlpVv4Ddbsu5XN8rhPQmHnS0P_Nk3jAdnZU5G8z0,109967
72
+ ccxt/krakenfutures.py,sha256=QabY6HWZ6W7qXvS-o21h4vbvfu2q-32tOX3CB82e-rg,115791
73
73
  ccxt/kucoin.py,sha256=_oUrmBWaRkqbSxz94lFlsEJD_CjXwNCLnfUBJajMYvM,200934
74
74
  ccxt/kucoinfutures.py,sha256=zZGAb5fLZeBeOGGx5dDxGvXWROgV1P8JLZvqKdT7m48,110519
75
75
  ccxt/kuna.py,sha256=VKSqCZfv4gtz2vBGI3hElarbzACaGwywkpwnOhA5jLI,95951
@@ -203,7 +203,7 @@ ccxt/abstract/woo.py,sha256=E-QXVJKVI4EOW72NX6wv99px9EyitWtd9KWvXUc9Tyo,10216
203
203
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
204
204
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
205
205
  ccxt/abstract/zonda.py,sha256=aSfewvRojzmuymX6QbOnDR8v9VFqWTULMHX9Y7kKD1M,5820
206
- ccxt/async_support/__init__.py,sha256=DDu26_OBWNnyEryRNoIz2zfhRDRT0LeQZ_Wsmnsf26Q,15177
206
+ ccxt/async_support/__init__.py,sha256=jATVXN85hoqBSdAZ7hzY_LerkMSnlpgPx006WUCOX78,15177
207
207
  ccxt/async_support/ace.py,sha256=LjNrCLc5OA9CTZ-SCNkBBeSUa144U1ayh6lSw_6GVgI,41630
208
208
  ccxt/async_support/alpaca.py,sha256=tGinjTamFx1lvVoHyB3crGlKF97gUPOtG9Dy8kPMqhQ,47101
209
209
  ccxt/async_support/ascendex.py,sha256=KKPnXkJPf3fC8JvOEwtsW1On8jNHAJ59_n072dvxAO8,144915
@@ -220,7 +220,7 @@ ccxt/async_support/bitbay.py,sha256=jcaEXi2IhYTva8ezO_SfJhwxEZk7HST4J3NaxD16BQA,
220
220
  ccxt/async_support/bitbns.py,sha256=bOIgrLFpDIn7l2QQy_FWh5q-Z7ydVjY2RlDBm0G9hDg,48371
221
221
  ccxt/async_support/bitcoincom.py,sha256=RiqwhK3RfxQ_PXTa860fphDCvwA8dalL-_rXlK85-8A,516
222
222
  ccxt/async_support/bitfinex.py,sha256=YoIJEYhhMnvf6nTsScz4DKLI0oi98xfWnwgY8V-G0dU,71874
223
- ccxt/async_support/bitfinex2.py,sha256=idrkdoHVYEMNiprEOJRKfgifdxgavmZ2Pp7AM6Jc-Co,158364
223
+ ccxt/async_support/bitfinex2.py,sha256=_eotTq3W3G-_crTKv0sLM9uvZWbgesoedi6RJiT5g0M,158409
224
224
  ccxt/async_support/bitflyer.py,sha256=eiahvUWnJS85H2-T-QSrKL0tsbjwAcr6qBm42Ex9y30,40563
225
225
  ccxt/async_support/bitget.py,sha256=VvPnOYxpB7lE0tK3-YxUdwGcjMsEcCT0oKdhBnoxmhU,406239
226
226
  ccxt/async_support/bithumb.py,sha256=X8JSN39xl28CBgJYxWefJlXu2XZ3Lr-QXyh6Fxd-eb8,45458
@@ -260,7 +260,7 @@ ccxt/async_support/digifinex.py,sha256=UfloaYAZEZtD03f7ME35GfCD5P-DKFYtPJiwqW_53
260
260
  ccxt/async_support/exmo.py,sha256=IEvbMNo9iFQnmaAD8w0xXBkXfK5jfKaVhoUUExsT-40,114855
261
261
  ccxt/async_support/flowbtc.py,sha256=bCnvtcNnPxxaxqVjI1GGXKhIpz_1r4GIFWqqPokvCR0,1183
262
262
  ccxt/async_support/fmfwio.py,sha256=lzfSnPrB2ARcC3EIqAuBM4vyg6LJ6n8RE71Zvt3ez1s,1250
263
- ccxt/async_support/gate.py,sha256=9a-TrNMpzQVX7CcYaJLBBtk9FzZ66OZq81HgoDaGx9k,299704
263
+ ccxt/async_support/gate.py,sha256=OUXPvc2xLkCbwDrwbdjuhRLY4pRMHvnT87ramo0OCWs,299760
264
264
  ccxt/async_support/gateio.py,sha256=6_t032F9p9x5KGTjtSuqGXITzFOx-XAQBYLpsuQjzxw,459
265
265
  ccxt/async_support/gemini.py,sha256=iGbPCElTUa9IEiWYOQfwn3R8mhODeEbbSYsbH560NBs,76458
266
266
  ccxt/async_support/hitbtc.py,sha256=pOUK_W78YHi-A8AGTRgantl4St3TwbZnEwhFT8OlyUI,151757
@@ -269,12 +269,12 @@ ccxt/async_support/hollaex.py,sha256=g4lC-7l8jfWfQmx6Z7POc7iewBSLCh_Atj5DW2pyAm0
269
269
  ccxt/async_support/htx.py,sha256=vAQacwFaBJOms5PeImOq9O75_DdhyhFARCsC9YfPArI,419803
270
270
  ccxt/async_support/huobi.py,sha256=fup0j6wQ1khAtfbb1H4CSyJAOzhxuoHMmrM6sgTuhr8,452
271
271
  ccxt/async_support/huobijp.py,sha256=y7CVKCg3tr7Gw-6ubDz0-OJpm2EogjPWxbJ2ziV5QTk,88378
272
- ccxt/async_support/hyperliquid.py,sha256=MgIsumQ6GImw8EXAvMR78dpr9zfRRWJPoX4moZ54MDA,80649
272
+ ccxt/async_support/hyperliquid.py,sha256=kOBvb3aMWO0ccPqYPBjIGJgagGo6DxudhbejM10HVKg,80734
273
273
  ccxt/async_support/idex.py,sha256=5QR6eiE5NiJNyBPxFL46OnoA4y15-bxHUYVMtPwOr5k,73179
274
274
  ccxt/async_support/independentreserve.py,sha256=QPlcKtYXK9SBakjN1A3OHJRAUauijfUM9f535IP7bc4,32239
275
275
  ccxt/async_support/indodax.py,sha256=CKPRtmG8p69Do6TdxWCpccUWIlTr_edUe2DKakVj2Hs,52070
276
276
  ccxt/async_support/kraken.py,sha256=5tAmqHvfixjGKD7hLkVTCF-P4RWHK3lWa4g6zpsIPnY,122450
277
- ccxt/async_support/krakenfutures.py,sha256=I9_gLxyDLRvmcdM3N_UOahxZAqvU8nwWbp-COjTZEh4,110431
277
+ ccxt/async_support/krakenfutures.py,sha256=TDKy2QyNUN64y8cblOPiC8ohLFAwKyohPvdt9trEHCA,116261
278
278
  ccxt/async_support/kucoin.py,sha256=T-fG7EriBHqRHfmOoImPEA2TGAfRH_PyHXfNi871RzU,201952
279
279
  ccxt/async_support/kucoinfutures.py,sha256=93boneXD3FcCsGZG_xpiefQrLiGoXOOc3i0ikjHnJyU,111079
280
280
  ccxt/async_support/kuna.py,sha256=Mlwx_DBFlu7LWuy7m875052ih7z4loCgIZfK5k81hnQ,96367
@@ -307,7 +307,7 @@ ccxt/async_support/yobit.py,sha256=JKwcd4_sPc7sFWTI5eICzbHcVMOxUrghlFTPmfWYgUQ,5
307
307
  ccxt/async_support/zaif.py,sha256=A4lhLoQNHt8EWeCH067sQrSiziNZ9nJU_-ZyVE59Xgo,28116
308
308
  ccxt/async_support/zonda.py,sha256=GqTR3gmRA9dcC2dCpSUVK-k19b_DiNGpIRfmmvfchiM,80763
309
309
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
310
- ccxt/async_support/base/exchange.py,sha256=9c8A89VmOCS1NqmJjshE_rdXKIiqrWOAsCQR_saWcZY,90473
310
+ ccxt/async_support/base/exchange.py,sha256=7ebrsRehEmBevgaD0skYyHjTQns2TEuEvzTTnKQ1G4o,90820
311
311
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
312
312
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
313
313
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=Ed1765emEde2Hj8Ys6f5EjS54ZI1wQ0qIhd04eB7yhU,5751
@@ -321,10 +321,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=Pxrq22nCODckJ6G1OXkYEmUunIu
321
321
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
322
322
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
323
323
  ccxt/base/errors.py,sha256=JBn3zTrtru7tLgyEi6MzKAUwiZe0fltQLYoJcsdP-AA,4099
324
- ccxt/base/exchange.py,sha256=X5Fs_0_zGYXSVuFFjmvCK67WbGjPEJ2EZ6zxB8The14,246246
324
+ ccxt/base/exchange.py,sha256=QjsPXTLTLC42wWRAj6CwHw4ekQ8gkc7G5QzVUP5soH0,246873
325
325
  ccxt/base/precise.py,sha256=_xfu54sV0vWNnOfGTKRFykeuWP8mn4K1m9lk1tcllX4,8565
326
326
  ccxt/base/types.py,sha256=Bc5lH1L29xvaQDl4uSx7_3w_gZTyhcUrBh-SSyKXzRI,6126
327
- ccxt/pro/__init__.py,sha256=0RKR2sZB3lBa7tE8C9f3iVBP9KajbmUyF98np8uCHDs,6675
327
+ ccxt/pro/__init__.py,sha256=lguDe-qhw2wcjN-g-URNYhlplGwyGcjzUx36-P00l-U,6675
328
328
  ccxt/pro/alpaca.py,sha256=ABL5GvXMmcSC7LaYRtUqS3tgsLpCBf1IChgC5f2aA2E,27161
329
329
  ccxt/pro/ascendex.py,sha256=Tjpk9KPF4YPKsdgq-Cabs3nx1Zkrnd7srdjqHYeghLs,35413
330
330
  ccxt/pro/bequant.py,sha256=5zbsP8BHQTUZ8ZNL6uaACxDbUClgkOV4SYfXT_LfQVg,1351
@@ -520,7 +520,7 @@ ccxt/test/base/test_ticker.py,sha256=cmYHv5ZtbAq27y4LGDcGzaro-qkSNJWme5rLHOEdA4U
520
520
  ccxt/test/base/test_trade.py,sha256=lhT9nxiSr0AEvKbdGXL9qJOkz1EiKEmA0TDfdCbubg8,2295
521
521
  ccxt/test/base/test_trading_fee.py,sha256=2aDCNJtqBkTC_AieO0l1HYGq5hz5qkWlkWb9Nv_fcwk,1066
522
522
  ccxt/test/base/test_transaction.py,sha256=BTbB4UHHXkrvYgwbrhh867nVRlevmIkIrz1W_odlQJI,1434
523
- ccxt-4.2.66.dist-info/METADATA,sha256=HN7gcXinUfhaZYNaVy5rhEy5rsvEldu7yzoTZ0szH6g,107754
524
- ccxt-4.2.66.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
525
- ccxt-4.2.66.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
526
- ccxt-4.2.66.dist-info/RECORD,,
523
+ ccxt-4.2.68.dist-info/METADATA,sha256=Fz6qDl2hcKi8rjvmG4I_rzWUF5PPKyKOQNz8U4KStLg,107754
524
+ ccxt-4.2.68.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
525
+ ccxt-4.2.68.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
526
+ ccxt-4.2.68.dist-info/RECORD,,
File without changes