ccxt 4.3.53__py2.py3-none-any.whl → 4.3.54__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.3.53'
25
+ __version__ = '4.3.54'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.53'
7
+ __version__ = '4.3.54'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.3.53'
5
+ __version__ = '4.3.54'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -704,7 +704,7 @@ class bingx(Exchange, ImplicitAPI):
704
704
  'limits': {
705
705
  'leverage': {
706
706
  'min': None,
707
- 'max': self.safe_integer(market, 'maxLongLeverage'),
707
+ 'max': None,
708
708
  },
709
709
  'amount': {
710
710
  'min': self.safe_number_2(market, 'minQty', 'tradeMinQuantity'),
@@ -2763,11 +2763,38 @@ class phemex(Exchange, ImplicitAPI):
2763
2763
  response = None
2764
2764
  if market['settle'] == 'USDT':
2765
2765
  response = await self.privateDeleteGOrdersAll(self.extend(request, params))
2766
+ #
2767
+ # {
2768
+ # code: '0',
2769
+ # msg: '',
2770
+ # data: '1'
2771
+ # }
2772
+ #
2766
2773
  elif market['swap']:
2767
2774
  response = await self.privateDeleteOrdersAll(self.extend(request, params))
2775
+ #
2776
+ # {
2777
+ # code: '0',
2778
+ # msg: '',
2779
+ # data: '1'
2780
+ # }
2781
+ #
2768
2782
  else:
2769
2783
  response = await self.privateDeleteSpotOrdersAll(self.extend(request, params))
2770
- return response
2784
+ #
2785
+ # {
2786
+ # code: '0',
2787
+ # msg: '',
2788
+ # data: {
2789
+ # total: '1'
2790
+ # }
2791
+ # }
2792
+ #
2793
+ return [
2794
+ self.safe_order({
2795
+ 'info': response,
2796
+ }),
2797
+ ]
2771
2798
 
2772
2799
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
2773
2800
  """
@@ -1255,7 +1255,8 @@ class poloniex(Exchange, ImplicitAPI):
1255
1255
  # }
1256
1256
  #
1257
1257
  response = self.extend(response, {
1258
- 'type': side,
1258
+ 'type': type,
1259
+ 'side': side,
1259
1260
  })
1260
1261
  return self.parse_order(response, market)
1261
1262
 
ccxt/async_support/woo.py CHANGED
@@ -52,7 +52,7 @@ class woo(Exchange, ImplicitAPI):
52
52
  'createMarketBuyOrderWithCost': True,
53
53
  'createMarketOrder': False,
54
54
  'createMarketOrderWithCost': False,
55
- 'createMarketSellOrderWithCost': False,
55
+ 'createMarketSellOrderWithCost': True,
56
56
  'createOrder': True,
57
57
  'createOrderWithTakeProfitAndStopLoss': True,
58
58
  'createReduceOnlyOrder': True,
@@ -832,8 +832,22 @@ class woo(Exchange, ImplicitAPI):
832
832
  market = self.market(symbol)
833
833
  if not market['spot']:
834
834
  raise NotSupported(self.id + ' createMarketBuyOrderWithCost() supports spot orders only')
835
- params['createMarketBuyOrderRequiresPrice'] = False
836
- return await self.create_order(symbol, 'market', 'buy', cost, None, params)
835
+ return await self.create_order(symbol, 'market', 'buy', cost, 1, params)
836
+
837
+ async def create_market_sell_order_with_cost(self, symbol: str, cost: float, params={}):
838
+ """
839
+ create a market sell order by providing the symbol and cost
840
+ :see: https://docs.woo.org/#send-order
841
+ :param str symbol: unified symbol of the market to create an order in
842
+ :param float cost: how much you want to trade in units of the quote currency
843
+ :param dict [params]: extra parameters specific to the exchange API endpoint
844
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
845
+ """
846
+ await self.load_markets()
847
+ market = self.market(symbol)
848
+ if not market['spot']:
849
+ raise NotSupported(self.id + ' createMarketSellOrderWithCost() supports spot orders only')
850
+ return await self.create_order(symbol, 'market', 'sell', cost, 1, params)
837
851
 
838
852
  async def create_trailing_amount_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, trailingAmount=None, trailingTriggerPrice=None, params={}) -> Order:
839
853
  """
@@ -941,28 +955,22 @@ class woo(Exchange, ImplicitAPI):
941
955
  request['order_type'] = 'IOC'
942
956
  if reduceOnly:
943
957
  request[reduceOnlyKey] = reduceOnly
944
- if price is not None:
958
+ if not isMarket and price is not None:
945
959
  request[priceKey] = self.price_to_precision(symbol, price)
946
960
  if isMarket and not isStop:
947
961
  # for market buy it requires the amount of quote currency to spend
948
- if market['spot'] and orderSide == 'BUY':
962
+ cost = self.safe_string_2(params, 'cost', 'order_amount')
963
+ params = self.omit(params, ['cost', 'order_amount'])
964
+ isPriceProvided = price is not None
965
+ if market['spot'] and (isPriceProvided or (cost is not None)):
949
966
  quoteAmount = None
950
- createMarketBuyOrderRequiresPrice = True
951
- createMarketBuyOrderRequiresPrice, params = self.handle_option_and_params(params, 'createOrder', 'createMarketBuyOrderRequiresPrice', True)
952
- cost = self.safe_number_2(params, 'cost', 'order_amount')
953
- params = self.omit(params, ['cost', 'order_amount'])
954
967
  if cost is not None:
955
968
  quoteAmount = self.cost_to_precision(symbol, cost)
956
- elif createMarketBuyOrderRequiresPrice:
957
- if price is None:
958
- raise InvalidOrder(self.id + ' createOrder() requires the price argument for market buy orders to calculate the total cost to spend(amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to False and pass the cost to spend(quote quantity) in the amount argument')
959
- else:
960
- amountString = self.number_to_string(amount)
961
- priceString = self.number_to_string(price)
962
- costRequest = Precise.string_mul(amountString, priceString)
963
- quoteAmount = self.cost_to_precision(symbol, costRequest)
964
969
  else:
965
- quoteAmount = self.cost_to_precision(symbol, amount)
970
+ amountString = self.number_to_string(amount)
971
+ priceString = self.number_to_string(price)
972
+ costRequest = Precise.string_mul(amountString, priceString)
973
+ quoteAmount = self.cost_to_precision(symbol, costRequest)
966
974
  request['order_amount'] = quoteAmount
967
975
  else:
968
976
  request['order_quantity'] = self.amount_to_precision(symbol, amount)
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.53'
7
+ __version__ = '4.3.54'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/bingx.py CHANGED
@@ -703,7 +703,7 @@ class bingx(Exchange, ImplicitAPI):
703
703
  'limits': {
704
704
  'leverage': {
705
705
  'min': None,
706
- 'max': self.safe_integer(market, 'maxLongLeverage'),
706
+ 'max': None,
707
707
  },
708
708
  'amount': {
709
709
  'min': self.safe_number_2(market, 'minQty', 'tradeMinQuantity'),
ccxt/phemex.py CHANGED
@@ -2763,11 +2763,38 @@ class phemex(Exchange, ImplicitAPI):
2763
2763
  response = None
2764
2764
  if market['settle'] == 'USDT':
2765
2765
  response = self.privateDeleteGOrdersAll(self.extend(request, params))
2766
+ #
2767
+ # {
2768
+ # code: '0',
2769
+ # msg: '',
2770
+ # data: '1'
2771
+ # }
2772
+ #
2766
2773
  elif market['swap']:
2767
2774
  response = self.privateDeleteOrdersAll(self.extend(request, params))
2775
+ #
2776
+ # {
2777
+ # code: '0',
2778
+ # msg: '',
2779
+ # data: '1'
2780
+ # }
2781
+ #
2768
2782
  else:
2769
2783
  response = self.privateDeleteSpotOrdersAll(self.extend(request, params))
2770
- return response
2784
+ #
2785
+ # {
2786
+ # code: '0',
2787
+ # msg: '',
2788
+ # data: {
2789
+ # total: '1'
2790
+ # }
2791
+ # }
2792
+ #
2793
+ return [
2794
+ self.safe_order({
2795
+ 'info': response,
2796
+ }),
2797
+ ]
2771
2798
 
2772
2799
  def fetch_order(self, id: str, symbol: Str = None, params={}):
2773
2800
  """
ccxt/poloniex.py CHANGED
@@ -1255,7 +1255,8 @@ class poloniex(Exchange, ImplicitAPI):
1255
1255
  # }
1256
1256
  #
1257
1257
  response = self.extend(response, {
1258
- 'type': side,
1258
+ 'type': type,
1259
+ 'side': side,
1259
1260
  })
1260
1261
  return self.parse_order(response, market)
1261
1262
 
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.53'
7
+ __version__ = '4.3.54'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/binance.py CHANGED
@@ -3409,7 +3409,7 @@ class binance(ccxt.async_support.binance):
3409
3409
  rejected = True
3410
3410
  # private endpoint uses id
3411
3411
  client.reject(e, id)
3412
- # public endpoint stores messageHash in subscriptios
3412
+ # public endpoint stores messageHash in subscriptions
3413
3413
  subscriptionKeys = list(client.subscriptions.keys())
3414
3414
  for i in range(0, len(subscriptionKeys)):
3415
3415
  subscriptionHash = subscriptionKeys[i]
ccxt/pro/bybit.py CHANGED
@@ -142,7 +142,7 @@ class bybit(ccxt.async_support.bybit):
142
142
  self.options['requestId'] = requestId
143
143
  return requestId
144
144
 
145
- def get_url_by_market_type(self, symbol: Str = None, isPrivate=False, method: Str = None, params={}):
145
+ async def get_url_by_market_type(self, symbol: Str = None, isPrivate=False, method: Str = None, params={}):
146
146
  accessibility = 'private' if isPrivate else 'public'
147
147
  isUsdcSettled = None
148
148
  isSpot = None
@@ -160,7 +160,13 @@ class bybit(ccxt.async_support.bybit):
160
160
  isUsdcSettled = (defaultSettle == 'USDC')
161
161
  isSpot = (type == 'spot')
162
162
  if isPrivate:
163
- url = url[accessibility]['usdc'] if (isUsdcSettled) else url[accessibility]['contract']
163
+ unified = await self.isUnifiedEnabled()
164
+ isUnifiedMargin = self.safe_bool(unified, 0, False)
165
+ isUnifiedAccount = self.safe_bool(unified, 1, False)
166
+ if isUsdcSettled and not isUnifiedMargin and not isUnifiedAccount:
167
+ url = url[accessibility]['usdc']
168
+ else:
169
+ url = url[accessibility]['contract']
164
170
  else:
165
171
  if isSpot:
166
172
  url = url[accessibility]['spot']
@@ -313,7 +319,7 @@ class bybit(ccxt.async_support.bybit):
313
319
  market = self.market(symbol)
314
320
  symbol = market['symbol']
315
321
  messageHash = 'ticker:' + symbol
316
- url = self.get_url_by_market_type(symbol, False, 'watchTicker', params)
322
+ url = await self.get_url_by_market_type(symbol, False, 'watchTicker', params)
317
323
  params = self.clean_params(params)
318
324
  options = self.safe_value(self.options, 'watchTicker', {})
319
325
  topic = self.safe_string(options, 'name', 'tickers')
@@ -335,7 +341,7 @@ class bybit(ccxt.async_support.bybit):
335
341
  await self.load_markets()
336
342
  symbols = self.market_symbols(symbols, None, False)
337
343
  messageHashes = []
338
- url = self.get_url_by_market_type(symbols[0], False, 'watchTickers', params)
344
+ url = await self.get_url_by_market_type(symbols[0], False, 'watchTickers', params)
339
345
  params = self.clean_params(params)
340
346
  options = self.safe_value(self.options, 'watchTickers', {})
341
347
  topic = self.safe_string(options, 'name', 'tickers')
@@ -510,7 +516,7 @@ class bybit(ccxt.async_support.bybit):
510
516
  await self.load_markets()
511
517
  market = self.market(symbol)
512
518
  symbol = market['symbol']
513
- url = self.get_url_by_market_type(symbol, False, 'watchOHLCV', params)
519
+ url = await self.get_url_by_market_type(symbol, False, 'watchOHLCV', params)
514
520
  params = self.clean_params(params)
515
521
  ohlcv = None
516
522
  timeframeId = self.safe_string(self.timeframes, timeframe, timeframe)
@@ -619,7 +625,7 @@ class bybit(ccxt.async_support.bybit):
619
625
  if symbolsLength == 0:
620
626
  raise ArgumentsRequired(self.id + ' watchOrderBookForSymbols() requires a non-empty array of symbols')
621
627
  symbols = self.market_symbols(symbols)
622
- url = self.get_url_by_market_type(symbols[0], False, 'watchOrderBook', params)
628
+ url = await self.get_url_by_market_type(symbols[0], False, 'watchOrderBook', params)
623
629
  params = self.clean_params(params)
624
630
  market = self.market(symbols[0])
625
631
  if limit is None:
@@ -737,7 +743,7 @@ class bybit(ccxt.async_support.bybit):
737
743
  if symbolsLength == 0:
738
744
  raise ArgumentsRequired(self.id + ' watchTradesForSymbols() requires a non-empty array of symbols')
739
745
  params = self.clean_params(params)
740
- url = self.get_url_by_market_type(symbols[0], False, 'watchTrades', params)
746
+ url = await self.get_url_by_market_type(symbols[0], False, 'watchTrades', params)
741
747
  topics = []
742
748
  messageHashes = []
743
749
  for i in range(0, len(symbols)):
@@ -887,7 +893,7 @@ class bybit(ccxt.async_support.bybit):
887
893
  if symbol is not None:
888
894
  symbol = self.symbol(symbol)
889
895
  messageHash += ':' + symbol
890
- url = self.get_url_by_market_type(symbol, True, method, params)
896
+ url = await self.get_url_by_market_type(symbol, True, method, params)
891
897
  await self.authenticate(url)
892
898
  topicByMarket: dict = {
893
899
  'spot': 'ticketInfo',
@@ -1006,7 +1012,7 @@ class bybit(ccxt.async_support.bybit):
1006
1012
  symbols = self.market_symbols(symbols)
1007
1013
  messageHash = '::' + ','.join(symbols)
1008
1014
  firstSymbol = self.safe_string(symbols, 0)
1009
- url = self.get_url_by_market_type(firstSymbol, True, method, params)
1015
+ url = await self.get_url_by_market_type(firstSymbol, True, method, params)
1010
1016
  messageHash = 'positions' + messageHash
1011
1017
  client = self.client(url)
1012
1018
  await self.authenticate(url)
@@ -1141,7 +1147,7 @@ class bybit(ccxt.async_support.bybit):
1141
1147
  await self.load_markets()
1142
1148
  market = self.market(symbol)
1143
1149
  symbol = market['symbol']
1144
- url = self.get_url_by_market_type(symbol, False, 'watchLiquidations', params)
1150
+ url = await self.get_url_by_market_type(symbol, False, 'watchLiquidations', params)
1145
1151
  params = self.clean_params(params)
1146
1152
  messageHash = 'liquidations::' + symbol
1147
1153
  topic = 'liquidation.' + market['id']
@@ -1220,7 +1226,7 @@ class bybit(ccxt.async_support.bybit):
1220
1226
  if symbol is not None:
1221
1227
  symbol = self.symbol(symbol)
1222
1228
  messageHash += ':' + symbol
1223
- url = self.get_url_by_market_type(symbol, True, method, params)
1229
+ url = await self.get_url_by_market_type(symbol, True, method, params)
1224
1230
  await self.authenticate(url)
1225
1231
  topicsByMarket: dict = {
1226
1232
  'spot': ['order', 'stopOrder'],
@@ -1518,7 +1524,7 @@ class bybit(ccxt.async_support.bybit):
1518
1524
  unified = await self.isUnifiedEnabled()
1519
1525
  isUnifiedMargin = self.safe_bool(unified, 0, False)
1520
1526
  isUnifiedAccount = self.safe_bool(unified, 1, False)
1521
- url = self.get_url_by_market_type(None, True, method, params)
1527
+ url = await self.get_url_by_market_type(None, True, method, params)
1522
1528
  await self.authenticate(url)
1523
1529
  topicByMarket: dict = {
1524
1530
  'spot': 'outboundAccountInfo',
ccxt/pro/kucoin.py CHANGED
@@ -153,6 +153,7 @@ class kucoin(ccxt.async_support.kucoin):
153
153
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
154
154
  """
155
155
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
156
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/market-snapshot
156
157
  :param str symbol: unified symbol of the market to fetch the ticker for
157
158
  :param dict [params]: extra parameters specific to the exchange API endpoint
158
159
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -367,6 +368,7 @@ class kucoin(ccxt.async_support.kucoin):
367
368
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
368
369
  """
369
370
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
371
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/klines
370
372
  :param str symbol: unified symbol of the market to fetch OHLCV data for
371
373
  :param str timeframe: the length of time each candle represents
372
374
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -431,6 +433,7 @@ class kucoin(ccxt.async_support.kucoin):
431
433
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
432
434
  """
433
435
  get the list of most recent trades for a particular symbol
436
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
434
437
  :param str symbol: unified symbol of the market to fetch trades for
435
438
  :param int [since]: timestamp in ms of the earliest trade to fetch
436
439
  :param int [limit]: the maximum amount of trades to fetch
@@ -442,6 +445,7 @@ class kucoin(ccxt.async_support.kucoin):
442
445
  async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
443
446
  """
444
447
  get the list of most recent trades for a particular symbol
448
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
445
449
  :param str symbol: unified symbol of the market to fetch trades for
446
450
  :param int [since]: timestamp in ms of the earliest trade to fetch
447
451
  :param int [limit]: the maximum amount of trades to fetch
@@ -741,6 +745,8 @@ class kucoin(ccxt.async_support.kucoin):
741
745
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
742
746
  """
743
747
  watches information on multiple orders made by the user
748
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/private-channels/private-order-change
749
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/private-channels/stop-order-event
744
750
  :param str symbol: unified market symbol of the market orders were made in
745
751
  :param int [since]: the earliest time in ms to fetch orders for
746
752
  :param int [limit]: the maximum number of order structures to retrieve
@@ -874,6 +880,9 @@ class kucoin(ccxt.async_support.kucoin):
874
880
  #
875
881
  messageHash = 'orders'
876
882
  data = self.safe_value(message, 'data')
883
+ tradeId = self.safe_string(data, 'tradeId')
884
+ if tradeId is not None:
885
+ self.handle_my_trade(client, message)
877
886
  parsed = self.parse_ws_order(data)
878
887
  symbol = self.safe_string(parsed, 'symbol')
879
888
  orderId = self.safe_string(parsed, 'id')
@@ -898,6 +907,7 @@ class kucoin(ccxt.async_support.kucoin):
898
907
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
899
908
  """
900
909
  watches information on multiple trades made by the user
910
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/private-channels/private-order-change
901
911
  :param str symbol: unified market symbol of the market trades were made in
902
912
  :param int [since]: the earliest time in ms to fetch trades for
903
913
  :param int [limit]: the maximum number of trade structures to retrieve
@@ -906,7 +916,7 @@ class kucoin(ccxt.async_support.kucoin):
906
916
  """
907
917
  await self.load_markets()
908
918
  url = await self.negotiate(True)
909
- topic = '/spot/tradeFills'
919
+ topic = '/spotMarket/tradeOrders'
910
920
  request: dict = {
911
921
  'privateChannel': True,
912
922
  }
@@ -921,6 +931,34 @@ class kucoin(ccxt.async_support.kucoin):
921
931
  return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
922
932
 
923
933
  def handle_my_trade(self, client: Client, message):
934
+ #
935
+ # {
936
+ # "type": "message",
937
+ # "topic": "/spotMarket/tradeOrders",
938
+ # "subject": "orderChange",
939
+ # "channelType": "private",
940
+ # "data": {
941
+ # "symbol": "KCS-USDT",
942
+ # "orderType": "limit",
943
+ # "side": "sell",
944
+ # "orderId": "5efab07953bdea00089965fa",
945
+ # "liquidity": "taker",
946
+ # "type": "match",
947
+ # "feeType": "takerFee",
948
+ # "orderTime": 1670329987026,
949
+ # "size": "0.1",
950
+ # "filledSize": "0.1",
951
+ # "price": "0.938",
952
+ # "matchPrice": "0.96738",
953
+ # "matchSize": "0.1",
954
+ # "tradeId": "5efab07a4ee4c7000a82d6d9",
955
+ # "clientOid": "1593487481000313",
956
+ # "remainSize": "0",
957
+ # "status": "match",
958
+ # "ts": 1670329987311000000
959
+ # }
960
+ # }
961
+ #
924
962
  if self.myTrades is None:
925
963
  limit = self.safe_integer(self.options, 'tradesLimit', 1000)
926
964
  self.myTrades = ArrayCacheBySymbolById(limit)
@@ -934,19 +972,26 @@ class kucoin(ccxt.async_support.kucoin):
934
972
 
935
973
  def parse_ws_trade(self, trade, market=None):
936
974
  #
937
- # {
938
- # "fee": 0.00262148,
939
- # "feeCurrency": "USDT",
940
- # "feeRate": 0.001,
941
- # "orderId": "62417436b29df8000183df2f",
942
- # "orderType": "market",
943
- # "price": 131.074,
944
- # "side": "sell",
945
- # "size": 0.02,
946
- # "symbol": "LTC-USDT",
947
- # "time": "1648456758734571745",
948
- # "tradeId": "624174362e113d2f467b3043"
949
- # }
975
+ # {
976
+ # "symbol": "KCS-USDT",
977
+ # "orderType": "limit",
978
+ # "side": "sell",
979
+ # "orderId": "5efab07953bdea00089965fa",
980
+ # "liquidity": "taker",
981
+ # "type": "match",
982
+ # "feeType": "takerFee",
983
+ # "orderTime": 1670329987026,
984
+ # "size": "0.1",
985
+ # "filledSize": "0.1",
986
+ # "price": "0.938",
987
+ # "matchPrice": "0.96738",
988
+ # "matchSize": "0.1",
989
+ # "tradeId": "5efab07a4ee4c7000a82d6d9",
990
+ # "clientOid": "1593487481000313",
991
+ # "remainSize": "0",
992
+ # "status": "match",
993
+ # "ts": 1670329987311000000
994
+ # }
950
995
  #
951
996
  marketId = self.safe_string(trade, 'symbol')
952
997
  market = self.safe_market(marketId, market, '-')
@@ -957,15 +1002,7 @@ class kucoin(ccxt.async_support.kucoin):
957
1002
  price = self.safe_string(trade, 'price')
958
1003
  amount = self.safe_string(trade, 'size')
959
1004
  order = self.safe_string(trade, 'orderId')
960
- timestamp = self.safe_integer_product(trade, 'time', 0.000001)
961
- feeCurrency = market['quote']
962
- feeRate = self.safe_string(trade, 'feeRate')
963
- feeCost = self.safe_string(trade, 'fee')
964
- fee = {
965
- 'cost': feeCost,
966
- 'rate': feeRate,
967
- 'currency': feeCurrency,
968
- }
1005
+ timestamp = self.safe_integer_product(trade, 'ts', 0.000001)
969
1006
  return self.safe_trade({
970
1007
  'info': trade,
971
1008
  'timestamp': timestamp,
@@ -974,17 +1011,18 @@ class kucoin(ccxt.async_support.kucoin):
974
1011
  'id': tradeId,
975
1012
  'order': order,
976
1013
  'type': type,
977
- 'takerOrMaker': None,
1014
+ 'takerOrMaker': self.safe_string(trade, 'liquidity'),
978
1015
  'side': side,
979
1016
  'price': price,
980
1017
  'amount': amount,
981
1018
  'cost': None,
982
- 'fee': fee,
1019
+ 'fee': None,
983
1020
  }, market)
984
1021
 
985
1022
  async def watch_balance(self, params={}) -> Balances:
986
1023
  """
987
1024
  watch balance and get the amount of funds available for trading or funds locked in orders
1025
+ :see: https://www.kucoin.com/docs/websocket/spot-trading/private-channels/account-balance-change
988
1026
  :param dict [params]: extra parameters specific to the exchange API endpoint
989
1027
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
990
1028
  """
@@ -1079,7 +1117,6 @@ class kucoin(ccxt.async_support.kucoin):
1079
1117
  'trade.l3match': self.handle_trade,
1080
1118
  'trade.candles.update': self.handle_ohlcv,
1081
1119
  'account.balance': self.handle_balance,
1082
- '/spot/tradeFills': self.handle_my_trade,
1083
1120
  'orderChange': self.handle_order,
1084
1121
  'stopOrder': self.handle_order,
1085
1122
  }
ccxt/pro/vertex.py CHANGED
@@ -317,7 +317,7 @@ class vertex(ccxt.async_support.vertex):
317
317
  # "ask_qty": "1000" # quantity at the lowest ask
318
318
  # }
319
319
  #
320
- timestamp = Precise.string_div(self.safe_string(ticker, 'timestamp'), '1000000')
320
+ timestamp = self.safe_integer_product(ticker, 'timestamp', 0.000001)
321
321
  return self.safe_ticker({
322
322
  'symbol': self.safe_symbol(None, market),
323
323
  'timestamp': timestamp,
ccxt/woo.py CHANGED
@@ -52,7 +52,7 @@ class woo(Exchange, ImplicitAPI):
52
52
  'createMarketBuyOrderWithCost': True,
53
53
  'createMarketOrder': False,
54
54
  'createMarketOrderWithCost': False,
55
- 'createMarketSellOrderWithCost': False,
55
+ 'createMarketSellOrderWithCost': True,
56
56
  'createOrder': True,
57
57
  'createOrderWithTakeProfitAndStopLoss': True,
58
58
  'createReduceOnlyOrder': True,
@@ -832,8 +832,22 @@ class woo(Exchange, ImplicitAPI):
832
832
  market = self.market(symbol)
833
833
  if not market['spot']:
834
834
  raise NotSupported(self.id + ' createMarketBuyOrderWithCost() supports spot orders only')
835
- params['createMarketBuyOrderRequiresPrice'] = False
836
- return self.create_order(symbol, 'market', 'buy', cost, None, params)
835
+ return self.create_order(symbol, 'market', 'buy', cost, 1, params)
836
+
837
+ def create_market_sell_order_with_cost(self, symbol: str, cost: float, params={}):
838
+ """
839
+ create a market sell order by providing the symbol and cost
840
+ :see: https://docs.woo.org/#send-order
841
+ :param str symbol: unified symbol of the market to create an order in
842
+ :param float cost: how much you want to trade in units of the quote currency
843
+ :param dict [params]: extra parameters specific to the exchange API endpoint
844
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
845
+ """
846
+ self.load_markets()
847
+ market = self.market(symbol)
848
+ if not market['spot']:
849
+ raise NotSupported(self.id + ' createMarketSellOrderWithCost() supports spot orders only')
850
+ return self.create_order(symbol, 'market', 'sell', cost, 1, params)
837
851
 
838
852
  def create_trailing_amount_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, trailingAmount=None, trailingTriggerPrice=None, params={}) -> Order:
839
853
  """
@@ -941,28 +955,22 @@ class woo(Exchange, ImplicitAPI):
941
955
  request['order_type'] = 'IOC'
942
956
  if reduceOnly:
943
957
  request[reduceOnlyKey] = reduceOnly
944
- if price is not None:
958
+ if not isMarket and price is not None:
945
959
  request[priceKey] = self.price_to_precision(symbol, price)
946
960
  if isMarket and not isStop:
947
961
  # for market buy it requires the amount of quote currency to spend
948
- if market['spot'] and orderSide == 'BUY':
962
+ cost = self.safe_string_2(params, 'cost', 'order_amount')
963
+ params = self.omit(params, ['cost', 'order_amount'])
964
+ isPriceProvided = price is not None
965
+ if market['spot'] and (isPriceProvided or (cost is not None)):
949
966
  quoteAmount = None
950
- createMarketBuyOrderRequiresPrice = True
951
- createMarketBuyOrderRequiresPrice, params = self.handle_option_and_params(params, 'createOrder', 'createMarketBuyOrderRequiresPrice', True)
952
- cost = self.safe_number_2(params, 'cost', 'order_amount')
953
- params = self.omit(params, ['cost', 'order_amount'])
954
967
  if cost is not None:
955
968
  quoteAmount = self.cost_to_precision(symbol, cost)
956
- elif createMarketBuyOrderRequiresPrice:
957
- if price is None:
958
- raise InvalidOrder(self.id + ' createOrder() requires the price argument for market buy orders to calculate the total cost to spend(amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to False and pass the cost to spend(quote quantity) in the amount argument')
959
- else:
960
- amountString = self.number_to_string(amount)
961
- priceString = self.number_to_string(price)
962
- costRequest = Precise.string_mul(amountString, priceString)
963
- quoteAmount = self.cost_to_precision(symbol, costRequest)
964
969
  else:
965
- quoteAmount = self.cost_to_precision(symbol, amount)
970
+ amountString = self.number_to_string(amount)
971
+ priceString = self.number_to_string(price)
972
+ costRequest = Precise.string_mul(amountString, priceString)
973
+ quoteAmount = self.cost_to_precision(symbol, costRequest)
966
974
  request['order_amount'] = quoteAmount
967
975
  else:
968
976
  request['order_quantity'] = self.amount_to_precision(symbol, amount)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.3.53
3
+ Version: 4.3.54
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
@@ -270,13 +270,13 @@ console.log(version, Object.keys(exchanges));
270
270
 
271
271
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
272
272
 
273
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.53/dist/ccxt.browser.min.js
274
- * unpkg: https://unpkg.com/ccxt@4.3.53/dist/ccxt.browser.min.js
273
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.54/dist/ccxt.browser.min.js
274
+ * unpkg: https://unpkg.com/ccxt@4.3.54/dist/ccxt.browser.min.js
275
275
 
276
276
  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.
277
277
 
278
278
  ```HTML
279
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.53/dist/ccxt.browser.min.js"></script>
279
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.54/dist/ccxt.browser.min.js"></script>
280
280
  ```
281
281
 
282
282
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=nFNCXWG4WScfRlxKMcxVN70zBc-zFjF5imMhhkbj6HA,16236
1
+ ccxt/__init__.py,sha256=sGJGLlNmnszjgoZCRPGuhCXTJxBTQK5N9dqM43kTbqg,16236
2
2
  ccxt/ace.py,sha256=RC6jY5dSbiE4cI_MS0thZbDArWn3Drl8Vm1NFzTTQaI,41675
3
3
  ccxt/alpaca.py,sha256=EZ7uF3XI8EXXIsCZ-UVpruBXS96Kps6WOOukmdcgCn0,47326
4
4
  ccxt/ascendex.py,sha256=rUUU3n4j8QrMrJCk4pVwVastIYzS3eDTUAL9R2ePErk,151832
@@ -8,7 +8,7 @@ ccxt/binance.py,sha256=m_RMYP-HttHnP8ziEF49YwjElAuLi1LiRmKgX2WDOyg,629410
8
8
  ccxt/binancecoinm.py,sha256=arFnEh8mErSyi23eVPWE4iwoT7PWQyxGGVJCKCy6UJY,1702
9
9
  ccxt/binanceus.py,sha256=hdcT4OnadcdFFFjF3GtM0nWv90jqojqwdVS3xWGuW40,9163
10
10
  ccxt/binanceusdm.py,sha256=bAPcJj5HLxoCdPolriM8sJpoTBwbV78vBTbKRmWhNP4,2632
11
- ccxt/bingx.py,sha256=4a4qVnjtDZTbI2R2qIq_ojazjesh3nfVz6IWGHN2WRo,188784
11
+ ccxt/bingx.py,sha256=biXpvytbEnU9o7p7Xvbabu3LDP8o6kjAMO0coPxN8QA,188744
12
12
  ccxt/bit2c.py,sha256=un1ZuLNvEt7bkceNeue3UctEoFA-xpoKQlnq4bX5Slc,37062
13
13
  ccxt/bitbank.py,sha256=yxS-W5FeA2Kqp7VbdNt6960GjuMflKVqUlTbtKPgqUY,43535
14
14
  ccxt/bitbay.py,sha256=xAIjzGRDVGwoy-Gygd99H0YN4wiaz_0lR0Z14oxaaxc,478
@@ -89,8 +89,8 @@ ccxt/onetrading.py,sha256=2nSe_Z_Jy7O4rPggwbY17M6oimu-t0PkeTejTu26XcA,88340
89
89
  ccxt/oxfun.py,sha256=k_0Wixo0hQt6MVHR4g61IgWG5qJazAoYoZ3ux2EtD4Y,124653
90
90
  ccxt/p2b.py,sha256=_kQjmJ1O9sgb5HnNsefD0Jy-DejW4chndqraV5jV3ak,54334
91
91
  ccxt/paymium.py,sha256=9TfMe2ViBYYodGcbVTPm6QOyuIxI6vmbl46xa5bl8D8,24420
92
- ccxt/phemex.py,sha256=L060JAxQ1wwtNo8JyUZ7fPMyAkmPkmPhHhWr5gWrJgM,222503
93
- ccxt/poloniex.py,sha256=qctzvVpjtLq_mDr5d1kf0447wkp-Y_aYrCy6QubIAvU,102242
92
+ ccxt/phemex.py,sha256=kT95mRifeiJEPjbdeQd1fPYWbP5k2y7MgIovIaL60yE,223120
93
+ ccxt/poloniex.py,sha256=QqpVP0SDTGgtp-BIom4uBlmrRt_xMnHprb_-g1YhTKs,102268
94
94
  ccxt/poloniexfutures.py,sha256=cPMhbame1K_I1d8JgI2GzFQ8bFh54O0WfA0UTGmqSjg,78106
95
95
  ccxt/probit.py,sha256=DqmkL7v9K6TsY0OwlyNxgOjU7OvpcThApyBOXOQi4Zg,76166
96
96
  ccxt/timex.py,sha256=jTXj6mGZcmsfmDFHbJyWiScLK-vdY7AYsD5gUyk1x0s,71451
@@ -101,7 +101,7 @@ ccxt/vertex.py,sha256=oUeywsZNJFFg0Amd-yeYfZmmUuVfsJrpNvUhK7JdJ-I,121429
101
101
  ccxt/wavesexchange.py,sha256=7vQjJl7C5uT1tDh-oRewkpqeqM9w3vWYEaTSpLL7rIo,114826
102
102
  ccxt/wazirx.py,sha256=_JRQvSh0XLPKjE-0Fi_YqYyz38GObXkyXLM1Pg3hipI,52406
103
103
  ccxt/whitebit.py,sha256=xENpt5u6txhUlLfc4IR_FHCAJMw3u1nj17voGoq0zus,118756
104
- ccxt/woo.py,sha256=EwnecnJS9PzgriHUTuzcZ5h51RgLElrK65NJwrd6T18,140033
104
+ ccxt/woo.py,sha256=8BhndXS-XONYFCxKPfzwLUTgGoLveD0NK5EKK_Bsu4s,140143
105
105
  ccxt/woofipro.py,sha256=jAvxPnpn6ib0e8x0iYqHLg7X7aD_8iTzGAJvnw72HrU,115353
106
106
  ccxt/xt.py,sha256=LIV1YnyhpM2lfPYvEfMg5H2aMP-wkeikm1CxdqgSsPY,200367
107
107
  ccxt/yobit.py,sha256=MFrd_ZvzSPP0T8RWrC3aLNrQN2rDZz3m2cbCnOqXr6s,53372
@@ -216,7 +216,7 @@ ccxt/abstract/xt.py,sha256=xHHv2viFGK0_iPZ4gu6Wb0aOrpcKhr9zoY-BIPWh5bs,27028
216
216
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
217
217
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
218
218
  ccxt/abstract/zonda.py,sha256=X-hCW0SdX3YKZWixDyW-O2211M58Rno8kKJ6quY7rw4,7183
219
- ccxt/async_support/__init__.py,sha256=28XcZzCiEl9jLE5lVpmRtBfivEG7C3dAkPS5TYy4fWI,16039
219
+ ccxt/async_support/__init__.py,sha256=3XCOQxq-O9TY3MK4nbmAcDN_EqvcfgqExOf3efYhz5A,16039
220
220
  ccxt/async_support/ace.py,sha256=ffpHbADxBOtT3QliUmoex2pTS7sSWB7CwO_SAPKJqDs,41899
221
221
  ccxt/async_support/alpaca.py,sha256=3845DgojoA1p0pxrqnDIqHbbRcEwZhZIkE4aygD5ics,47538
222
222
  ccxt/async_support/ascendex.py,sha256=7tZ4C7FfzmuB_ADYjl6IkyQQ5JG0Vt1AD_B3fTeY6V0,152620
@@ -226,7 +226,7 @@ ccxt/async_support/binance.py,sha256=HgyAf1iI1fyxXjkbGPx1a69UB0Bt6z4YhlgC2MTNnpM
226
226
  ccxt/async_support/binancecoinm.py,sha256=yeE73xG5UXD_X3VPul6DMGnV_mgJfWYskpas1BUDdCU,1740
227
227
  ccxt/async_support/binanceus.py,sha256=c-K3Tk7LaRJjmYdCx8vBOqsx01uXrtvt0PC2ekBiD0g,9177
228
228
  ccxt/async_support/binanceusdm.py,sha256=8ugRkx7vyYmn67wdkEEf2f-DFMGAoC4t09usKlPVNyw,2670
229
- ccxt/async_support/bingx.py,sha256=z9hkjHE1fklCaHmoJdxJ2ng-RaTGy1PxiejUjJtjFhA,189820
229
+ ccxt/async_support/bingx.py,sha256=2H-kbaXPdUrv5p4RHjZwS2YAYi_mkQmeUKSCnMy7hx0,189780
230
230
  ccxt/async_support/bit2c.py,sha256=5div5D1LV3QHZUqL3CDdKaBDATQ3c2Phglx9JpAb7fY,37274
231
231
  ccxt/async_support/bitbank.py,sha256=47jVvH8--NkV11uL-1X22vEg0YMyLc--SVtVuTLrFCI,43795
232
232
  ccxt/async_support/bitbay.py,sha256=jcaEXi2IhYTva8ezO_SfJhwxEZk7HST4J3NaxD16BQA,492
@@ -307,8 +307,8 @@ ccxt/async_support/onetrading.py,sha256=u6Y7zWjfVBVBl9RLIUfwAneZzE4fOENx7Y11zE7M
307
307
  ccxt/async_support/oxfun.py,sha256=a_xP9hsjcsooDGO7fLmZPvW-Rlyfis6JRKmsnF0w-hk,125197
308
308
  ccxt/async_support/p2b.py,sha256=vwavNnMyU7tJF1FIIBhZe4az58clzptk0bEuIDPmOAA,54576
309
309
  ccxt/async_support/paymium.py,sha256=WKPElafAfmg06ATcLLIS0V09kZIGlSbn0L7Z3rcLvQA,24608
310
- ccxt/async_support/phemex.py,sha256=a9ROQZNJhnggj7GJWNqC1IcvYnWesrgxTkxpDU9P_CU,223321
311
- ccxt/async_support/poloniex.py,sha256=ReU0bRFEkEvQ3TdQ7SPYWE0uuecIL6AQdkSq34yJ9UQ,102790
310
+ ccxt/async_support/phemex.py,sha256=r4qfgA2IXaNWvhTAzldvpwFueszroj-yJcSU1pc-ess,223938
311
+ ccxt/async_support/poloniex.py,sha256=DqZ9Kp9dOyaVVw0Nk_ayMuexiIiiEoXAau3S9h9YcaE,102816
312
312
  ccxt/async_support/poloniexfutures.py,sha256=xNrXcZ8OjafniqtcJD8AhXq58GC3jKeMqNPJSEsFlJM,78492
313
313
  ccxt/async_support/probit.py,sha256=0W5NjycP_GYZO-FaL0wyId9ZGYvQSA3Wd1RXDneiQSU,76558
314
314
  ccxt/async_support/timex.py,sha256=6_SBBYk3IW3iFFpHejYBPOTvmoOAFROygbh7TR0YvXM,71813
@@ -319,14 +319,14 @@ ccxt/async_support/vertex.py,sha256=UGWLIXgptaVtDawWKCek4SaRlV-mGvox-uP_Pd9CkrE,
319
319
  ccxt/async_support/wavesexchange.py,sha256=D12ssbQvRl4zkQLKwpELn5EYDHjfi-cp6zjXRAhqiI8,115376
320
320
  ccxt/async_support/wazirx.py,sha256=C3Y4R4aMyj4404n5LtotvqlZDt5ILp_MvauyvL06e1k,52708
321
321
  ccxt/async_support/whitebit.py,sha256=mwoolQKWL_9ZpC-zU5Ti4rM7QsK3Fmmo_MRUgj_Nno8,119406
322
- ccxt/async_support/woo.py,sha256=jBZxcNlfiwBG9DRg_ZmySibD0RvItpvv0kN4_mRDAb4,140923
322
+ ccxt/async_support/woo.py,sha256=GUcZ7n4le5T3RJsjO00M9QSRQcWhdMAYGneco0JrFzM,141051
323
323
  ccxt/async_support/woofipro.py,sha256=ePRdVtl3hUBXWfy1cMEPvJl1fzRGbe67sD_bl5_BIUY,116033
324
324
  ccxt/async_support/xt.py,sha256=naduJ9l9TxQXFYGDOVrhIC-rX8CJhwrRyyR8Ps2cLPY,201521
325
325
  ccxt/async_support/yobit.py,sha256=KQcu9nXJPDlAodZyxOXKIn6eTSLmlvUlgRFE6EBLfug,53656
326
326
  ccxt/async_support/zaif.py,sha256=jTK5pLZSpKL1Pt0qAJTjN09TDS5AfhptGgGAqw7sNwE,29045
327
327
  ccxt/async_support/zonda.py,sha256=skMMmUUjXJmnQpzlFrJfmg4-vEIOsTGz2zSW9nI4C90,81721
328
328
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
329
- ccxt/async_support/base/exchange.py,sha256=bQ7I5KZCMQQds0PSJbjZ0Ds0PTogCIeaQ8cx3d6VlFo,109872
329
+ ccxt/async_support/base/exchange.py,sha256=KKwZWvW4HIuwEJY2soRNX1HuB-KJAU0VsbGzxQ8A2x8,109872
330
330
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
331
331
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
332
332
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=5IEiT0elWI9a7Vr-KV0jgmlbpLJWBzIlrLaCkTKGaqY,5752
@@ -340,14 +340,14 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9produGjmB
340
340
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
341
341
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
342
342
  ccxt/base/errors.py,sha256=FGdyULeNCNcl52gA_CNhe2dZmat9GJGkTdlIyDXAF_A,4213
343
- ccxt/base/exchange.py,sha256=kGC3_LVu_1566Va2FCqwoZhnh2wbOnE_6vTxIIthCsg,280900
343
+ ccxt/base/exchange.py,sha256=-gJA5hHpo_qToi34mBLxJMdEv0sReafTCOhUtNpfWaE,280900
344
344
  ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
345
345
  ccxt/base/types.py,sha256=RGGcbz86cVtrmU602zoFO5gSWrv_J7IHxQkPnzmNirs,9247
346
- ccxt/pro/__init__.py,sha256=tdxzluaG_RAvKOTCO9CC9QfGVL8HxQ0Kk6JhkcC1LX4,7308
346
+ ccxt/pro/__init__.py,sha256=I0o_74-e5Mzo6Bqz9Ik_6uvq_hNPRJZte2A9d-OJHZQ,7308
347
347
  ccxt/pro/alpaca.py,sha256=QA_Dmxu1ockCSYJMbOodbNke3t1tAl0hFL-q56UMQWE,27224
348
348
  ccxt/pro/ascendex.py,sha256=181FIeztchLqGmgecRJEN8F8xEM45D5aMKhC-5nuNfU,35467
349
349
  ccxt/pro/bequant.py,sha256=5zbsP8BHQTUZ8ZNL6uaACxDbUClgkOV4SYfXT_LfQVg,1351
350
- ccxt/pro/binance.py,sha256=oFwZckO1pHFbUt3TG2d8TBBK4Sgd331U0HFBtx7isoU,171500
350
+ ccxt/pro/binance.py,sha256=dS62U05hIgXqw66c170o5NPIP7JRuyYCdjB0ao9T-rI,171501
351
351
  ccxt/pro/binancecoinm.py,sha256=LlgF4rXHHrsQMaklhTEzSiE6U9V25AjHHg_DRat7Mf0,1036
352
352
  ccxt/pro/binanceus.py,sha256=_IXpS_wyH0nEtsLR7cJLtrUlsNQoG0MSUVo3PV0RDDc,1946
353
353
  ccxt/pro/binanceusdm.py,sha256=lLdOv0d-lM-1wfCc_y_POb6GdmVIiX7PFzmKTWsVyNw,1512
@@ -365,7 +365,7 @@ ccxt/pro/bitrue.py,sha256=aDbPloGgsEN_DnoAJCkM0Y4MJ1r57OvoKpinynhRNrA,16463
365
365
  ccxt/pro/bitstamp.py,sha256=P8Td5HqWiO6GMdLj-cKqPTZD28fltWlZQ7Z-omDbO60,20916
366
366
  ccxt/pro/bitvavo.py,sha256=vn70dtyWs2TSZieCevvwKliRInmvvzMrvTyGq0fTIYM,56229
367
367
  ccxt/pro/blockchaincom.py,sha256=LtCL3habcuB2IRXXK_oeqdzqpnkj01Gr79X82nK8Mnk,29600
368
- ccxt/pro/bybit.py,sha256=tyMTGFtBbQ2ncwBxjpW3yWKT1xeqT7CXDHgzBaD8neg,88926
368
+ ccxt/pro/bybit.py,sha256=drnZo2-cL5qXzcxl2T2Ow57qwMnHCN0_sznmPhnM6LU,89272
369
369
  ccxt/pro/cex.py,sha256=ri0fnWYa4tFeeuJ_edqUziI5VJ921rRjIapion9Emug,58495
370
370
  ccxt/pro/coinbase.py,sha256=q5PQ--k9q50UrgWCPYV0y2tx5hQ32nmWXBp4nvJsQag,30628
371
371
  ccxt/pro/coinbaseexchange.py,sha256=taV-mCliIcc6XQjxSl2HmYHpBkOIDkxUxF2LrBSXfCc,39035
@@ -390,7 +390,7 @@ ccxt/pro/idex.py,sha256=WAY58yMHFUPoqZUGFvzxqcKizvMuFXqdZ6BD0WgstQA,28361
390
390
  ccxt/pro/independentreserve.py,sha256=1RDkNQ0IKyC84GQRmgl-Mvo0qoOXD3-sxX6zecGbGvU,11214
391
391
  ccxt/pro/kraken.py,sha256=zzDhQN3h80gZu_JNTOx1jsIKMH4oHpzbA-_Mx7cmM5s,60920
392
392
  ccxt/pro/krakenfutures.py,sha256=3qn_aDwiDtgSz31-J9dzLYNaVywhSksz39hhl0v9DoM,63989
393
- ccxt/pro/kucoin.py,sha256=XoH3kW-5pCf-8672tSP-ijpINm7T5sZcBRyHVIrKjiQ,50777
393
+ ccxt/pro/kucoin.py,sha256=FASilISOBbj0bCxyAr0Jgpnz7riNkboWH14q1gvhwkE,52871
394
394
  ccxt/pro/kucoinfutures.py,sha256=NSd0cxEGoO_yytG0KRgZUOoCvjj5UjjXD8m_tlp3pIo,50319
395
395
  ccxt/pro/lbank.py,sha256=ip7zjZFvGKufpu30WN2_lFQ-ODcJVNkcJQHbz-uLfHo,35203
396
396
  ccxt/pro/luno.py,sha256=AzLK0_C0Hu25ukMNkMLP_sY3D4UG9FT38oawpo4jzTg,12336
@@ -406,7 +406,7 @@ ccxt/pro/poloniex.py,sha256=XlnwsZYmA6p93T2C_ZE_wfWUUwujBpwWvCrkl0uDQdA,51289
406
406
  ccxt/pro/poloniexfutures.py,sha256=iyA57Gre_58DaAUnWLGdnBEue2xSWznCuQ6c1qxTH3c,41719
407
407
  ccxt/pro/probit.py,sha256=ngY30aRwNClc_q_Pirajg4-K-mJ3bvipgD2-jBuPs6g,23110
408
408
  ccxt/pro/upbit.py,sha256=jxL1twQsfh0pQ_HcmPbevAcl4WdLZk7_Pg-jhapmGUs,22098
409
- ccxt/pro/vertex.py,sha256=E1wweCWWqzADttnsCzCrkgTOmEyFZOAFHXO2UAxdW-A,40493
409
+ ccxt/pro/vertex.py,sha256=rY_KF5iSlL6V4BlDgCNJ3lEROa6Rfqh11PiGt5JDFLI,40481
410
410
  ccxt/pro/wazirx.py,sha256=LXpotTduk3fhtcJP2TWpssiOOAZGxhou5_MTK-0G7n0,30082
411
411
  ccxt/pro/whitebit.py,sha256=ZoWKxOYFG3flOYHosUo6LGRs83PVgCC3trLxJbbFLpk,35069
412
412
  ccxt/pro/woo.py,sha256=8TtJpGJxo1zMF5DRKyhS4L4fT4i7S1dvAgJgheU_Dhc,43677
@@ -546,8 +546,8 @@ ccxt/test/base/test_ticker.py,sha256=cMTIMb1oySNORUCmqI5ZzMswlEyCF6gJMah3vfvo8wQ
546
546
  ccxt/test/base/test_trade.py,sha256=PMtmB8V38dpaP-eb8h488xYMlR6D69yCOhsA1RuWrUA,2336
547
547
  ccxt/test/base/test_trading_fee.py,sha256=2aDCNJtqBkTC_AieO0l1HYGq5hz5qkWlkWb9Nv_fcwk,1066
548
548
  ccxt/test/base/test_transaction.py,sha256=BTbB4UHHXkrvYgwbrhh867nVRlevmIkIrz1W_odlQJI,1434
549
- ccxt-4.3.53.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
550
- ccxt-4.3.53.dist-info/METADATA,sha256=V9JVZv-PrUkfdP8EgFUfhr7uC9NXlqtYc8-HRFzTiJw,115971
551
- ccxt-4.3.53.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
552
- ccxt-4.3.53.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
553
- ccxt-4.3.53.dist-info/RECORD,,
549
+ ccxt-4.3.54.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
550
+ ccxt-4.3.54.dist-info/METADATA,sha256=syeixMSx3faA9AqJ64WZbu2P0LRRVLBkl6GQqUCot-E,115971
551
+ ccxt-4.3.54.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
552
+ ccxt-4.3.54.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
553
+ ccxt-4.3.54.dist-info/RECORD,,
File without changes