ccxt 4.2.87__py2.py3-none-any.whl → 4.2.88__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.

Potentially problematic release.


This version of ccxt might be problematic. Click here for more details.

ccxt/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.2.87'
25
+ __version__ = '4.2.88'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.87'
7
+ __version__ = '4.2.88'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.2.87'
5
+ __version__ = '4.2.88'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -1883,7 +1883,7 @@ class binance(Exchange, ImplicitAPI):
1883
1883
  '-4140': BadRequest, # Invalid symbol status for opening position
1884
1884
  '-4141': OperationRejected, # Symbol is closed
1885
1885
  '-4144': BadSymbol, # Invalid pair
1886
- '-4164': OperationRejected, # Leverage reduction is not supported in Isolated Margin Mode with open positions
1886
+ '-4164': InvalidOrder, # {"code":-4164,"msg":"Order's notional must be no smaller than 20(unless you choose reduce only)."}
1887
1887
  '-4165': BadRequest, # Invalid time interval
1888
1888
  '-4167': BadRequest, # Unable to adjust to Multi-Assets mode with symbols of USDⓈ-M Futures under isolated-margin mode.
1889
1889
  '-4168': BadRequest, # Unable to adjust to isolated-margin mode under the Multi-Assets mode.
@@ -8500,7 +8500,7 @@ class binance(Exchange, ImplicitAPI):
8500
8500
  'previousFundingDatetime': None,
8501
8501
  }
8502
8502
 
8503
- def parse_account_positions(self, account):
8503
+ def parse_account_positions(self, account, filterClosed=False):
8504
8504
  positions = self.safe_list(account, 'positions')
8505
8505
  assets = self.safe_list(account, 'assets', [])
8506
8506
  balances = {}
@@ -8522,7 +8522,8 @@ class binance(Exchange, ImplicitAPI):
8522
8522
  code = market['quote'] if market['linear'] else market['base']
8523
8523
  maintenanceMargin = self.safe_string(position, 'maintMargin')
8524
8524
  # check for maintenance margin so empty positions are not returned
8525
- if (maintenanceMargin != '0') and (maintenanceMargin != '0.00000000'):
8525
+ isPositionOpen = (maintenanceMargin != '0') and (maintenanceMargin != '0.00000000')
8526
+ if not filterClosed or isPositionOpen:
8526
8527
  # sometimes not all the codes are correctly returned...
8527
8528
  if code in balances:
8528
8529
  parsed = self.parse_account_position(self.extend(position, {
@@ -9288,10 +9289,11 @@ class binance(Exchange, ImplicitAPI):
9288
9289
  :see: https://binance-docs.github.io/apidocs/delivery/en/#account-information-user_data
9289
9290
  :see: https://binance-docs.github.io/apidocs/pm/en/#get-um-account-detail-user_data
9290
9291
  :see: https://binance-docs.github.io/apidocs/pm/en/#get-cm-account-detail-user_data
9291
- :param str[]|None symbols: list of unified market symbols
9292
+ :param str[] [symbols]: list of unified market symbols
9292
9293
  :param dict [params]: extra parameters specific to the exchange API endpoint
9293
9294
  :param boolean [params.portfolioMargin]: set to True if you would like to fetch positions in a portfolio margin account
9294
9295
  :param str [params.subType]: "linear" or "inverse"
9296
+ :param boolean [params.filterClosed]: set to True if you would like to filter out closed positions, default is False
9295
9297
  :returns dict: data on account positions
9296
9298
  """
9297
9299
  if symbols is not None:
@@ -9319,7 +9321,9 @@ class binance(Exchange, ImplicitAPI):
9319
9321
  response = await self.dapiPrivateGetAccount(params)
9320
9322
  else:
9321
9323
  raise NotSupported(self.id + ' fetchPositions() supports linear and inverse contracts only')
9322
- result = self.parse_account_positions(response)
9324
+ filterClosed = None
9325
+ filterClosed, params = self.handle_option_and_params(params, 'fetchAccountPositions', 'filterClosed', False)
9326
+ result = self.parse_account_positions(response, filterClosed)
9323
9327
  symbols = self.market_symbols(symbols)
9324
9328
  return self.filter_by_array_positions(result, 'symbol', symbols, False)
9325
9329
 
@@ -10287,7 +10291,7 @@ class binance(Exchange, ImplicitAPI):
10287
10291
  raise NotSupported(self.id + ' add / reduce margin only supported with type future or delivery')
10288
10292
  await self.load_markets()
10289
10293
  market = self.market(symbol)
10290
- amount = self.cost_to_precision(symbol, amount)
10294
+ amount = self.amount_to_precision(symbol, amount)
10291
10295
  request = {
10292
10296
  'type': addOrReduce,
10293
10297
  'symbol': market['id'],
@@ -1317,6 +1317,7 @@ class bitget(Exchange, ImplicitAPI):
1317
1317
  'commonCurrencies': {
1318
1318
  'JADE': 'Jade Protocol',
1319
1319
  'DEGEN': 'DegenReborn',
1320
+ 'TONCOIN': 'TON',
1320
1321
  },
1321
1322
  'options': {
1322
1323
  'timeframes': {
@@ -1854,8 +1855,8 @@ class bitget(Exchange, ImplicitAPI):
1854
1855
  data = self.safe_value(response, 'data', [])
1855
1856
  for i in range(0, len(data)):
1856
1857
  entry = data[i]
1857
- id = self.safe_string(entry, 'coinId')
1858
- code = self.safe_currency_code(self.safe_string(entry, 'coin'))
1858
+ id = self.safe_string(entry, 'coin') # we don't use 'coinId' has no use. it is 'coin' field that needs to be used in currency related endpoints(deposit, withdraw, etc..)
1859
+ code = self.safe_currency_code(id)
1859
1860
  chains = self.safe_value(entry, 'chains', [])
1860
1861
  networks = {}
1861
1862
  deposit = False
@@ -1972,7 +1973,7 @@ class bitget(Exchange, ImplicitAPI):
1972
1973
  raise ArgumentsRequired(self.id + ' fetchMarketLeverageTiers() requires a code argument')
1973
1974
  params = self.omit(params, 'code')
1974
1975
  currency = self.currency(code)
1975
- request['coin'] = currency['code']
1976
+ request['coin'] = currency['id']
1976
1977
  response = await self.privateMarginGetV2MarginCrossedTierData(self.extend(request, params))
1977
1978
  else:
1978
1979
  raise BadRequest(self.id + ' fetchMarketLeverageTiers() symbol does not support market ' + market['symbol'])
@@ -2119,7 +2120,7 @@ class bitget(Exchange, ImplicitAPI):
2119
2120
  if since is None:
2120
2121
  since = self.milliseconds() - 7776000000 # 90 days
2121
2122
  request = {
2122
- 'coin': currency['code'],
2123
+ 'coin': currency['id'],
2123
2124
  'startTime': since,
2124
2125
  'endTime': self.milliseconds(),
2125
2126
  }
@@ -2174,7 +2175,7 @@ class bitget(Exchange, ImplicitAPI):
2174
2175
  currency = self.currency(code)
2175
2176
  networkId = self.network_code_to_id(chain)
2176
2177
  request = {
2177
- 'coin': currency['code'],
2178
+ 'coin': currency['id'],
2178
2179
  'address': address,
2179
2180
  'chain': networkId,
2180
2181
  'size': amount,
@@ -2253,7 +2254,7 @@ class bitget(Exchange, ImplicitAPI):
2253
2254
  if since is None:
2254
2255
  since = self.milliseconds() - 7776000000 # 90 days
2255
2256
  request = {
2256
- 'coin': currency['code'],
2257
+ 'coin': currency['id'],
2257
2258
  'startTime': since,
2258
2259
  'endTime': self.milliseconds(),
2259
2260
  }
@@ -2391,7 +2392,7 @@ class bitget(Exchange, ImplicitAPI):
2391
2392
  networkId = self.network_code_to_id(networkCode, code)
2392
2393
  currency = self.currency(code)
2393
2394
  request = {
2394
- 'coin': currency['code'],
2395
+ 'coin': currency['id'],
2395
2396
  }
2396
2397
  if networkId is not None:
2397
2398
  request['chain'] = networkId
@@ -5493,7 +5494,7 @@ class bitget(Exchange, ImplicitAPI):
5493
5494
  request = {}
5494
5495
  if code is not None:
5495
5496
  currency = self.currency(code)
5496
- request['coin'] = currency['code']
5497
+ request['coin'] = currency['id']
5497
5498
  request, params = self.handle_until_option('endTime', request, params)
5498
5499
  if since is not None:
5499
5500
  request['startTime'] = since
@@ -6807,7 +6808,7 @@ class bitget(Exchange, ImplicitAPI):
6807
6808
  type = self.safe_string(accountsByType, fromAccount)
6808
6809
  currency = self.currency(code)
6809
6810
  request = {
6810
- 'coin': currency['code'],
6811
+ 'coin': currency['id'],
6811
6812
  'fromType': type,
6812
6813
  }
6813
6814
  if since is not None:
@@ -6862,7 +6863,7 @@ class bitget(Exchange, ImplicitAPI):
6862
6863
  'fromType': fromType,
6863
6864
  'toType': toType,
6864
6865
  'amount': amount,
6865
- 'coin': currency['code'],
6866
+ 'coin': currency['id'],
6866
6867
  }
6867
6868
  symbol = self.safe_string(params, 'symbol')
6868
6869
  params = self.omit(params, 'symbol')
@@ -7042,7 +7043,7 @@ class bitget(Exchange, ImplicitAPI):
7042
7043
  await self.load_markets()
7043
7044
  currency = self.currency(code)
7044
7045
  request = {
7045
- 'coin': currency['code'],
7046
+ 'coin': currency['id'],
7046
7047
  'borrowAmount': self.currency_to_precision(code, amount),
7047
7048
  }
7048
7049
  response = await self.privateMarginPostV2MarginCrossedAccountBorrow(self.extend(request, params))
@@ -7075,7 +7076,7 @@ class bitget(Exchange, ImplicitAPI):
7075
7076
  currency = self.currency(code)
7076
7077
  market = self.market(symbol)
7077
7078
  request = {
7078
- 'coin': currency['code'],
7079
+ 'coin': currency['id'],
7079
7080
  'borrowAmount': self.currency_to_precision(code, amount),
7080
7081
  'symbol': market['id'],
7081
7082
  }
@@ -7110,7 +7111,7 @@ class bitget(Exchange, ImplicitAPI):
7110
7111
  currency = self.currency(code)
7111
7112
  market = self.market(symbol)
7112
7113
  request = {
7113
- 'coin': currency['code'],
7114
+ 'coin': currency['id'],
7114
7115
  'repayAmount': self.currency_to_precision(code, amount),
7115
7116
  'symbol': market['id'],
7116
7117
  }
@@ -7144,7 +7145,7 @@ class bitget(Exchange, ImplicitAPI):
7144
7145
  await self.load_markets()
7145
7146
  currency = self.currency(code)
7146
7147
  request = {
7147
- 'coin': currency['code'],
7148
+ 'coin': currency['id'],
7148
7149
  'repayAmount': self.currency_to_precision(code, amount),
7149
7150
  }
7150
7151
  response = await self.privateMarginPostV2MarginCrossedAccountRepay(self.extend(request, params))
@@ -7490,7 +7491,7 @@ class bitget(Exchange, ImplicitAPI):
7490
7491
  await self.load_markets()
7491
7492
  currency = self.currency(code)
7492
7493
  request = {
7493
- 'coin': currency['code'],
7494
+ 'coin': currency['id'],
7494
7495
  }
7495
7496
  response = await self.privateMarginGetV2MarginCrossedInterestRateAndLimit(self.extend(request, params))
7496
7497
  #
@@ -7581,7 +7582,7 @@ class bitget(Exchange, ImplicitAPI):
7581
7582
  currency = None
7582
7583
  if code is not None:
7583
7584
  currency = self.currency(code)
7584
- request['coin'] = currency['code']
7585
+ request['coin'] = currency['id']
7585
7586
  if since is not None:
7586
7587
  request['startTime'] = since
7587
7588
  else:
@@ -2565,7 +2565,7 @@ class cryptocom(Exchange, ImplicitAPI):
2565
2565
  #
2566
2566
  result = self.safe_dict(response, 'result', {})
2567
2567
  data = self.safe_list(result, 'data', [])
2568
- return self.parse_position(data[0], market)
2568
+ return self.parse_position(self.safe_dict(data, 0), market)
2569
2569
 
2570
2570
  async def fetch_positions(self, symbols: Strings = None, params={}):
2571
2571
  """
@@ -1824,7 +1824,7 @@ class gate(Exchange, ImplicitAPI):
1824
1824
  await self.load_markets()
1825
1825
  currency = self.currency(code)
1826
1826
  request = {
1827
- 'currency': currency['id'],
1827
+ 'currency': currency['id'], # todo: currencies have network-junctions
1828
1828
  }
1829
1829
  response = await self.privateWalletGetDepositAddress(self.extend(request, params))
1830
1830
  addresses = self.safe_value(response, 'multichain_addresses')
@@ -1871,7 +1871,7 @@ class gate(Exchange, ImplicitAPI):
1871
1871
  rawNetwork = self.safe_string_upper(params, 'network')
1872
1872
  params = self.omit(params, 'network')
1873
1873
  request = {
1874
- 'currency': currency['id'],
1874
+ 'currency': currency['id'], # todo: currencies have network-junctions
1875
1875
  }
1876
1876
  response = await self.privateWalletGetDepositAddress(self.extend(request, params))
1877
1877
  #
@@ -3346,7 +3346,7 @@ class gate(Exchange, ImplicitAPI):
3346
3346
  currency = None
3347
3347
  if code is not None:
3348
3348
  currency = self.currency(code)
3349
- request['currency'] = currency['id']
3349
+ request['currency'] = currency['id'] # todo: currencies have network-junctions
3350
3350
  if limit is not None:
3351
3351
  request['limit'] = limit
3352
3352
  if since is not None:
@@ -3378,7 +3378,7 @@ class gate(Exchange, ImplicitAPI):
3378
3378
  currency = None
3379
3379
  if code is not None:
3380
3380
  currency = self.currency(code)
3381
- request['currency'] = currency['id']
3381
+ request['currency'] = currency['id'] # todo: currencies have network-junctions
3382
3382
  if limit is not None:
3383
3383
  request['limit'] = limit
3384
3384
  if since is not None:
@@ -3405,7 +3405,7 @@ class gate(Exchange, ImplicitAPI):
3405
3405
  await self.load_markets()
3406
3406
  currency = self.currency(code)
3407
3407
  request = {
3408
- 'currency': currency['id'],
3408
+ 'currency': currency['id'], # todo: currencies have network-junctions
3409
3409
  'address': address,
3410
3410
  'amount': self.currency_to_precision(code, amount),
3411
3411
  }
@@ -3418,7 +3418,7 @@ class gate(Exchange, ImplicitAPI):
3418
3418
  request['chain'] = network
3419
3419
  params = self.omit(params, 'network')
3420
3420
  else:
3421
- request['chain'] = currency['id']
3421
+ request['chain'] = currency['id'] # todo: currencies have network-junctions
3422
3422
  response = await self.privateWithdrawalsPostWithdrawals(self.extend(request, params))
3423
3423
  #
3424
3424
  # {
@@ -4762,7 +4762,7 @@ class gate(Exchange, ImplicitAPI):
4762
4762
  toId = self.convert_type_to_account(toAccount)
4763
4763
  truncated = self.currency_to_precision(code, amount)
4764
4764
  request = {
4765
- 'currency': currency['id'],
4765
+ 'currency': currency['id'], # todo: currencies have network-junctions
4766
4766
  'amount': truncated,
4767
4767
  }
4768
4768
  if not (fromId in self.options['accountsByType']):
@@ -4783,7 +4783,7 @@ class gate(Exchange, ImplicitAPI):
4783
4783
  request['currency_pair'] = market['id']
4784
4784
  params = self.omit(params, 'symbol')
4785
4785
  if (toId == 'futures') or (toId == 'delivery') or (fromId == 'futures') or (fromId == 'delivery'):
4786
- request['settle'] = currency['id']
4786
+ request['settle'] = currency['id'] # todo: currencies have network-junctions
4787
4787
  response = await self.privateWalletPostTransfers(self.extend(request, params))
4788
4788
  #
4789
4789
  # according to the docs(however actual response seems to be an empty string '')
@@ -5396,7 +5396,7 @@ class gate(Exchange, ImplicitAPI):
5396
5396
  await self.load_markets()
5397
5397
  currency = self.currency(code)
5398
5398
  request = {
5399
- 'currency': currency['id'].upper(),
5399
+ 'currency': currency['id'].upper(), # todo: currencies have network-junctions
5400
5400
  'amount': self.currency_to_precision(code, amount),
5401
5401
  }
5402
5402
  market = self.market(symbol)
@@ -5423,7 +5423,7 @@ class gate(Exchange, ImplicitAPI):
5423
5423
  await self.load_markets()
5424
5424
  currency = self.currency(code)
5425
5425
  request = {
5426
- 'currency': currency['id'].upper(),
5426
+ 'currency': currency['id'].upper(), # todo: currencies have network-junctions
5427
5427
  'amount': self.currency_to_precision(code, amount),
5428
5428
  }
5429
5429
  response = await self.privateMarginPostCrossRepayments(self.extend(request, params))
@@ -5460,7 +5460,7 @@ class gate(Exchange, ImplicitAPI):
5460
5460
  await self.load_markets()
5461
5461
  currency = self.currency(code)
5462
5462
  request = {
5463
- 'currency': currency['id'].upper(),
5463
+ 'currency': currency['id'].upper(), # todo: currencies have network-junctions
5464
5464
  'amount': self.currency_to_precision(code, amount),
5465
5465
  }
5466
5466
  response = None
@@ -5503,7 +5503,7 @@ class gate(Exchange, ImplicitAPI):
5503
5503
  await self.load_markets()
5504
5504
  currency = self.currency(code)
5505
5505
  request = {
5506
- 'currency': currency['id'].upper(),
5506
+ 'currency': currency['id'].upper(), # todo: currencies have network-junctions
5507
5507
  'amount': self.currency_to_precision(code, amount),
5508
5508
  }
5509
5509
  response = await self.privateMarginPostCrossLoans(self.extend(request, params))
@@ -5996,7 +5996,7 @@ class gate(Exchange, ImplicitAPI):
5996
5996
  if (type == 'spot') or (type == 'margin'):
5997
5997
  if code is not None:
5998
5998
  currency = self.currency(code)
5999
- request['currency'] = currency['id']
5999
+ request['currency'] = currency['id'] # todo: currencies have network-junctions
6000
6000
  if (type == 'swap') or (type == 'future'):
6001
6001
  defaultSettle = 'usdt' if (type == 'swap') else 'btc'
6002
6002
  settle = self.safe_string_lower(params, 'settle', defaultSettle)
@@ -6754,7 +6754,7 @@ class gate(Exchange, ImplicitAPI):
6754
6754
  await self.load_markets()
6755
6755
  currency = self.currency(code)
6756
6756
  request = {
6757
- 'underlying': currency['code'] + '_USDT',
6757
+ 'underlying': currency['code'] + '_USDT', # todo: currency['id'].upper() & network junctions
6758
6758
  }
6759
6759
  response = await self.publicOptionsGetContracts(self.extend(request, params))
6760
6760
  #
@@ -363,7 +363,8 @@ class krakenfutures(Exchange, ImplicitAPI):
363
363
  # swap == perpetual
364
364
  settle = None
365
365
  settleId = None
366
- amountPrecision = self.parse_number(self.parse_precision(self.safe_string(market, 'contractValueTradePrecision', '0')))
366
+ cvtp = self.safe_string(market, 'contractValueTradePrecision')
367
+ amountPrecision = self.parse_number(self.integer_precision_to_amount(cvtp))
367
368
  pricePrecision = self.safe_number(market, 'tickSize')
368
369
  contract = (swap or future or index)
369
370
  swapOrFutures = (swap or future)
@@ -3326,9 +3326,9 @@ class kucoin(Exchange, ImplicitAPI):
3326
3326
  async def fetch_balance(self, params={}) -> Balances:
3327
3327
  """
3328
3328
  query for balance and get the amount of funds available for trading or funds locked in orders
3329
- :see: https://docs.kucoin.com/#list-accounts
3330
3329
  :see: https://www.kucoin.com/docs/rest/account/basic-info/get-account-list-spot-margin-trade_hf
3331
- :see: https://docs.kucoin.com/#query-isolated-margin-account-info
3330
+ :see: https://www.kucoin.com/docs/rest/funding/funding-overview/get-account-detail-margin
3331
+ :see: https://www.kucoin.com/docs/rest/funding/funding-overview/get-account-detail-isolated-margin
3332
3332
  :param dict [params]: extra parameters specific to the exchange API endpoint
3333
3333
  :param dict [params.marginMode]: 'cross' or 'isolated', margin type for fetching margin balance
3334
3334
  :param dict [params.type]: extra parameters specific to the exchange API endpoint
@@ -3353,7 +3353,7 @@ class kucoin(Exchange, ImplicitAPI):
3353
3353
  response = None
3354
3354
  request = {}
3355
3355
  isolated = (marginMode == 'isolated') or (type == 'isolated')
3356
- cross = (marginMode == 'cross') or (type == 'cross')
3356
+ cross = (marginMode == 'cross') or (type == 'margin')
3357
3357
  if isolated:
3358
3358
  if currency is not None:
3359
3359
  request['balanceCurrency'] = currency['id']
@@ -3418,13 +3418,14 @@ class kucoin(Exchange, ImplicitAPI):
3418
3418
  # }
3419
3419
  # }
3420
3420
  #
3421
- data = self.safe_list(response, 'data', [])
3421
+ data = None
3422
3422
  result = {
3423
3423
  'info': response,
3424
3424
  'timestamp': None,
3425
3425
  'datetime': None,
3426
3426
  }
3427
3427
  if isolated:
3428
+ data = self.safe_dict(response, 'data', {})
3428
3429
  assets = self.safe_value(data, 'assets', data)
3429
3430
  for i in range(0, len(assets)):
3430
3431
  entry = assets[i]
@@ -3439,6 +3440,7 @@ class kucoin(Exchange, ImplicitAPI):
3439
3440
  subResult[quoteCode] = self.parse_balance_helper(quote)
3440
3441
  result[symbol] = self.safe_balance(subResult)
3441
3442
  elif cross:
3443
+ data = self.safe_dict(response, 'data', {})
3442
3444
  accounts = self.safe_list(data, 'accounts', [])
3443
3445
  for i in range(0, len(accounts)):
3444
3446
  balance = accounts[i]
@@ -3446,6 +3448,7 @@ class kucoin(Exchange, ImplicitAPI):
3446
3448
  codeInner = self.safe_currency_code(currencyId)
3447
3449
  result[codeInner] = self.parse_balance_helper(balance)
3448
3450
  else:
3451
+ data = self.safe_list(response, 'data', [])
3449
3452
  for i in range(0, len(data)):
3450
3453
  balance = data[i]
3451
3454
  balanceType = self.safe_string(balance, 'type')
@@ -4228,7 +4228,7 @@ class mexc(Exchange, ImplicitAPI):
4228
4228
  key = self.safe_string(keys, 0)
4229
4229
  result = self.safe_dict(addressStructures, key)
4230
4230
  if result is None:
4231
- raise InvalidAddress(self.id + ' fetchDepositAddress() cannot find a deposit address for ' + code + ', and network' + network + 'consider creating one using the MEXC platform')
4231
+ raise InvalidAddress(self.id + ' fetchDepositAddress() cannot find a deposit address for ' + code + ', and network' + network + 'consider creating one using .createDepositAddress() method or in MEXC website')
4232
4232
  return result
4233
4233
 
4234
4234
  async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.87'
7
+ __version__ = '4.2.88'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -4525,6 +4525,25 @@ class Exchange(object):
4525
4525
  parsedPrecision = parsedPrecision + '0'
4526
4526
  return parsedPrecision + '1'
4527
4527
 
4528
+ def integer_precision_to_amount(self, precision: Str):
4529
+ """
4530
+ * @ignore
4531
+ handles positive & negative numbers too. parsePrecision() does not handle negative numbers, but self method handles
4532
+ :param str precision: The number of digits to the right of the decimal
4533
+ :returns str: a string number equal to 1e-precision
4534
+ """
4535
+ if precision is None:
4536
+ return None
4537
+ if Precise.string_ge(precision, '0'):
4538
+ return self.parse_precision(precision)
4539
+ else:
4540
+ positivePrecisionString = Precise.string_abs(precision)
4541
+ positivePrecision = int(positivePrecisionString)
4542
+ parsedPrecision = '1'
4543
+ for i in range(0, positivePrecision - 1):
4544
+ parsedPrecision = parsedPrecision + '0'
4545
+ return parsedPrecision + '0'
4546
+
4528
4547
  def load_time_difference(self, params={}):
4529
4548
  serverTime = self.fetch_time(params)
4530
4549
  after = self.milliseconds()
@@ -4935,8 +4954,8 @@ class Exchange(object):
4935
4954
  entry = responseKeys[i]
4936
4955
  dictionary = entry if isArray else response[entry]
4937
4956
  currencyId = self.safe_string(dictionary, currencyIdKey) if isArray else entry
4938
- currency = self.safe_value(self.currencies_by_id, currencyId)
4939
- code = self.safe_string(currency, 'code', currencyId)
4957
+ currency = self.safe_currency(currencyId)
4958
+ code = self.safe_string(currency, 'code')
4940
4959
  if (codes is None) or (self.in_array(code, codes)):
4941
4960
  depositWithdrawFees[code] = self.parseDepositWithdrawFee(dictionary, currency)
4942
4961
  return depositWithdrawFees
ccxt/binance.py CHANGED
@@ -1882,7 +1882,7 @@ class binance(Exchange, ImplicitAPI):
1882
1882
  '-4140': BadRequest, # Invalid symbol status for opening position
1883
1883
  '-4141': OperationRejected, # Symbol is closed
1884
1884
  '-4144': BadSymbol, # Invalid pair
1885
- '-4164': OperationRejected, # Leverage reduction is not supported in Isolated Margin Mode with open positions
1885
+ '-4164': InvalidOrder, # {"code":-4164,"msg":"Order's notional must be no smaller than 20(unless you choose reduce only)."}
1886
1886
  '-4165': BadRequest, # Invalid time interval
1887
1887
  '-4167': BadRequest, # Unable to adjust to Multi-Assets mode with symbols of USDⓈ-M Futures under isolated-margin mode.
1888
1888
  '-4168': BadRequest, # Unable to adjust to isolated-margin mode under the Multi-Assets mode.
@@ -8499,7 +8499,7 @@ class binance(Exchange, ImplicitAPI):
8499
8499
  'previousFundingDatetime': None,
8500
8500
  }
8501
8501
 
8502
- def parse_account_positions(self, account):
8502
+ def parse_account_positions(self, account, filterClosed=False):
8503
8503
  positions = self.safe_list(account, 'positions')
8504
8504
  assets = self.safe_list(account, 'assets', [])
8505
8505
  balances = {}
@@ -8521,7 +8521,8 @@ class binance(Exchange, ImplicitAPI):
8521
8521
  code = market['quote'] if market['linear'] else market['base']
8522
8522
  maintenanceMargin = self.safe_string(position, 'maintMargin')
8523
8523
  # check for maintenance margin so empty positions are not returned
8524
- if (maintenanceMargin != '0') and (maintenanceMargin != '0.00000000'):
8524
+ isPositionOpen = (maintenanceMargin != '0') and (maintenanceMargin != '0.00000000')
8525
+ if not filterClosed or isPositionOpen:
8525
8526
  # sometimes not all the codes are correctly returned...
8526
8527
  if code in balances:
8527
8528
  parsed = self.parse_account_position(self.extend(position, {
@@ -9287,10 +9288,11 @@ class binance(Exchange, ImplicitAPI):
9287
9288
  :see: https://binance-docs.github.io/apidocs/delivery/en/#account-information-user_data
9288
9289
  :see: https://binance-docs.github.io/apidocs/pm/en/#get-um-account-detail-user_data
9289
9290
  :see: https://binance-docs.github.io/apidocs/pm/en/#get-cm-account-detail-user_data
9290
- :param str[]|None symbols: list of unified market symbols
9291
+ :param str[] [symbols]: list of unified market symbols
9291
9292
  :param dict [params]: extra parameters specific to the exchange API endpoint
9292
9293
  :param boolean [params.portfolioMargin]: set to True if you would like to fetch positions in a portfolio margin account
9293
9294
  :param str [params.subType]: "linear" or "inverse"
9295
+ :param boolean [params.filterClosed]: set to True if you would like to filter out closed positions, default is False
9294
9296
  :returns dict: data on account positions
9295
9297
  """
9296
9298
  if symbols is not None:
@@ -9318,7 +9320,9 @@ class binance(Exchange, ImplicitAPI):
9318
9320
  response = self.dapiPrivateGetAccount(params)
9319
9321
  else:
9320
9322
  raise NotSupported(self.id + ' fetchPositions() supports linear and inverse contracts only')
9321
- result = self.parse_account_positions(response)
9323
+ filterClosed = None
9324
+ filterClosed, params = self.handle_option_and_params(params, 'fetchAccountPositions', 'filterClosed', False)
9325
+ result = self.parse_account_positions(response, filterClosed)
9322
9326
  symbols = self.market_symbols(symbols)
9323
9327
  return self.filter_by_array_positions(result, 'symbol', symbols, False)
9324
9328
 
@@ -10286,7 +10290,7 @@ class binance(Exchange, ImplicitAPI):
10286
10290
  raise NotSupported(self.id + ' add / reduce margin only supported with type future or delivery')
10287
10291
  self.load_markets()
10288
10292
  market = self.market(symbol)
10289
- amount = self.cost_to_precision(symbol, amount)
10293
+ amount = self.amount_to_precision(symbol, amount)
10290
10294
  request = {
10291
10295
  'type': addOrReduce,
10292
10296
  'symbol': market['id'],
ccxt/bitget.py CHANGED
@@ -1316,6 +1316,7 @@ class bitget(Exchange, ImplicitAPI):
1316
1316
  'commonCurrencies': {
1317
1317
  'JADE': 'Jade Protocol',
1318
1318
  'DEGEN': 'DegenReborn',
1319
+ 'TONCOIN': 'TON',
1319
1320
  },
1320
1321
  'options': {
1321
1322
  'timeframes': {
@@ -1853,8 +1854,8 @@ class bitget(Exchange, ImplicitAPI):
1853
1854
  data = self.safe_value(response, 'data', [])
1854
1855
  for i in range(0, len(data)):
1855
1856
  entry = data[i]
1856
- id = self.safe_string(entry, 'coinId')
1857
- code = self.safe_currency_code(self.safe_string(entry, 'coin'))
1857
+ id = self.safe_string(entry, 'coin') # we don't use 'coinId' has no use. it is 'coin' field that needs to be used in currency related endpoints(deposit, withdraw, etc..)
1858
+ code = self.safe_currency_code(id)
1858
1859
  chains = self.safe_value(entry, 'chains', [])
1859
1860
  networks = {}
1860
1861
  deposit = False
@@ -1971,7 +1972,7 @@ class bitget(Exchange, ImplicitAPI):
1971
1972
  raise ArgumentsRequired(self.id + ' fetchMarketLeverageTiers() requires a code argument')
1972
1973
  params = self.omit(params, 'code')
1973
1974
  currency = self.currency(code)
1974
- request['coin'] = currency['code']
1975
+ request['coin'] = currency['id']
1975
1976
  response = self.privateMarginGetV2MarginCrossedTierData(self.extend(request, params))
1976
1977
  else:
1977
1978
  raise BadRequest(self.id + ' fetchMarketLeverageTiers() symbol does not support market ' + market['symbol'])
@@ -2118,7 +2119,7 @@ class bitget(Exchange, ImplicitAPI):
2118
2119
  if since is None:
2119
2120
  since = self.milliseconds() - 7776000000 # 90 days
2120
2121
  request = {
2121
- 'coin': currency['code'],
2122
+ 'coin': currency['id'],
2122
2123
  'startTime': since,
2123
2124
  'endTime': self.milliseconds(),
2124
2125
  }
@@ -2173,7 +2174,7 @@ class bitget(Exchange, ImplicitAPI):
2173
2174
  currency = self.currency(code)
2174
2175
  networkId = self.network_code_to_id(chain)
2175
2176
  request = {
2176
- 'coin': currency['code'],
2177
+ 'coin': currency['id'],
2177
2178
  'address': address,
2178
2179
  'chain': networkId,
2179
2180
  'size': amount,
@@ -2252,7 +2253,7 @@ class bitget(Exchange, ImplicitAPI):
2252
2253
  if since is None:
2253
2254
  since = self.milliseconds() - 7776000000 # 90 days
2254
2255
  request = {
2255
- 'coin': currency['code'],
2256
+ 'coin': currency['id'],
2256
2257
  'startTime': since,
2257
2258
  'endTime': self.milliseconds(),
2258
2259
  }
@@ -2390,7 +2391,7 @@ class bitget(Exchange, ImplicitAPI):
2390
2391
  networkId = self.network_code_to_id(networkCode, code)
2391
2392
  currency = self.currency(code)
2392
2393
  request = {
2393
- 'coin': currency['code'],
2394
+ 'coin': currency['id'],
2394
2395
  }
2395
2396
  if networkId is not None:
2396
2397
  request['chain'] = networkId
@@ -5492,7 +5493,7 @@ class bitget(Exchange, ImplicitAPI):
5492
5493
  request = {}
5493
5494
  if code is not None:
5494
5495
  currency = self.currency(code)
5495
- request['coin'] = currency['code']
5496
+ request['coin'] = currency['id']
5496
5497
  request, params = self.handle_until_option('endTime', request, params)
5497
5498
  if since is not None:
5498
5499
  request['startTime'] = since
@@ -6806,7 +6807,7 @@ class bitget(Exchange, ImplicitAPI):
6806
6807
  type = self.safe_string(accountsByType, fromAccount)
6807
6808
  currency = self.currency(code)
6808
6809
  request = {
6809
- 'coin': currency['code'],
6810
+ 'coin': currency['id'],
6810
6811
  'fromType': type,
6811
6812
  }
6812
6813
  if since is not None:
@@ -6861,7 +6862,7 @@ class bitget(Exchange, ImplicitAPI):
6861
6862
  'fromType': fromType,
6862
6863
  'toType': toType,
6863
6864
  'amount': amount,
6864
- 'coin': currency['code'],
6865
+ 'coin': currency['id'],
6865
6866
  }
6866
6867
  symbol = self.safe_string(params, 'symbol')
6867
6868
  params = self.omit(params, 'symbol')
@@ -7041,7 +7042,7 @@ class bitget(Exchange, ImplicitAPI):
7041
7042
  self.load_markets()
7042
7043
  currency = self.currency(code)
7043
7044
  request = {
7044
- 'coin': currency['code'],
7045
+ 'coin': currency['id'],
7045
7046
  'borrowAmount': self.currency_to_precision(code, amount),
7046
7047
  }
7047
7048
  response = self.privateMarginPostV2MarginCrossedAccountBorrow(self.extend(request, params))
@@ -7074,7 +7075,7 @@ class bitget(Exchange, ImplicitAPI):
7074
7075
  currency = self.currency(code)
7075
7076
  market = self.market(symbol)
7076
7077
  request = {
7077
- 'coin': currency['code'],
7078
+ 'coin': currency['id'],
7078
7079
  'borrowAmount': self.currency_to_precision(code, amount),
7079
7080
  'symbol': market['id'],
7080
7081
  }
@@ -7109,7 +7110,7 @@ class bitget(Exchange, ImplicitAPI):
7109
7110
  currency = self.currency(code)
7110
7111
  market = self.market(symbol)
7111
7112
  request = {
7112
- 'coin': currency['code'],
7113
+ 'coin': currency['id'],
7113
7114
  'repayAmount': self.currency_to_precision(code, amount),
7114
7115
  'symbol': market['id'],
7115
7116
  }
@@ -7143,7 +7144,7 @@ class bitget(Exchange, ImplicitAPI):
7143
7144
  self.load_markets()
7144
7145
  currency = self.currency(code)
7145
7146
  request = {
7146
- 'coin': currency['code'],
7147
+ 'coin': currency['id'],
7147
7148
  'repayAmount': self.currency_to_precision(code, amount),
7148
7149
  }
7149
7150
  response = self.privateMarginPostV2MarginCrossedAccountRepay(self.extend(request, params))
@@ -7489,7 +7490,7 @@ class bitget(Exchange, ImplicitAPI):
7489
7490
  self.load_markets()
7490
7491
  currency = self.currency(code)
7491
7492
  request = {
7492
- 'coin': currency['code'],
7493
+ 'coin': currency['id'],
7493
7494
  }
7494
7495
  response = self.privateMarginGetV2MarginCrossedInterestRateAndLimit(self.extend(request, params))
7495
7496
  #
@@ -7580,7 +7581,7 @@ class bitget(Exchange, ImplicitAPI):
7580
7581
  currency = None
7581
7582
  if code is not None:
7582
7583
  currency = self.currency(code)
7583
- request['coin'] = currency['code']
7584
+ request['coin'] = currency['id']
7584
7585
  if since is not None:
7585
7586
  request['startTime'] = since
7586
7587
  else:
ccxt/cryptocom.py CHANGED
@@ -2565,7 +2565,7 @@ class cryptocom(Exchange, ImplicitAPI):
2565
2565
  #
2566
2566
  result = self.safe_dict(response, 'result', {})
2567
2567
  data = self.safe_list(result, 'data', [])
2568
- return self.parse_position(data[0], market)
2568
+ return self.parse_position(self.safe_dict(data, 0), market)
2569
2569
 
2570
2570
  def fetch_positions(self, symbols: Strings = None, params={}):
2571
2571
  """
ccxt/gate.py CHANGED
@@ -1823,7 +1823,7 @@ class gate(Exchange, ImplicitAPI):
1823
1823
  self.load_markets()
1824
1824
  currency = self.currency(code)
1825
1825
  request = {
1826
- 'currency': currency['id'],
1826
+ 'currency': currency['id'], # todo: currencies have network-junctions
1827
1827
  }
1828
1828
  response = self.privateWalletGetDepositAddress(self.extend(request, params))
1829
1829
  addresses = self.safe_value(response, 'multichain_addresses')
@@ -1870,7 +1870,7 @@ class gate(Exchange, ImplicitAPI):
1870
1870
  rawNetwork = self.safe_string_upper(params, 'network')
1871
1871
  params = self.omit(params, 'network')
1872
1872
  request = {
1873
- 'currency': currency['id'],
1873
+ 'currency': currency['id'], # todo: currencies have network-junctions
1874
1874
  }
1875
1875
  response = self.privateWalletGetDepositAddress(self.extend(request, params))
1876
1876
  #
@@ -3345,7 +3345,7 @@ class gate(Exchange, ImplicitAPI):
3345
3345
  currency = None
3346
3346
  if code is not None:
3347
3347
  currency = self.currency(code)
3348
- request['currency'] = currency['id']
3348
+ request['currency'] = currency['id'] # todo: currencies have network-junctions
3349
3349
  if limit is not None:
3350
3350
  request['limit'] = limit
3351
3351
  if since is not None:
@@ -3377,7 +3377,7 @@ class gate(Exchange, ImplicitAPI):
3377
3377
  currency = None
3378
3378
  if code is not None:
3379
3379
  currency = self.currency(code)
3380
- request['currency'] = currency['id']
3380
+ request['currency'] = currency['id'] # todo: currencies have network-junctions
3381
3381
  if limit is not None:
3382
3382
  request['limit'] = limit
3383
3383
  if since is not None:
@@ -3404,7 +3404,7 @@ class gate(Exchange, ImplicitAPI):
3404
3404
  self.load_markets()
3405
3405
  currency = self.currency(code)
3406
3406
  request = {
3407
- 'currency': currency['id'],
3407
+ 'currency': currency['id'], # todo: currencies have network-junctions
3408
3408
  'address': address,
3409
3409
  'amount': self.currency_to_precision(code, amount),
3410
3410
  }
@@ -3417,7 +3417,7 @@ class gate(Exchange, ImplicitAPI):
3417
3417
  request['chain'] = network
3418
3418
  params = self.omit(params, 'network')
3419
3419
  else:
3420
- request['chain'] = currency['id']
3420
+ request['chain'] = currency['id'] # todo: currencies have network-junctions
3421
3421
  response = self.privateWithdrawalsPostWithdrawals(self.extend(request, params))
3422
3422
  #
3423
3423
  # {
@@ -4761,7 +4761,7 @@ class gate(Exchange, ImplicitAPI):
4761
4761
  toId = self.convert_type_to_account(toAccount)
4762
4762
  truncated = self.currency_to_precision(code, amount)
4763
4763
  request = {
4764
- 'currency': currency['id'],
4764
+ 'currency': currency['id'], # todo: currencies have network-junctions
4765
4765
  'amount': truncated,
4766
4766
  }
4767
4767
  if not (fromId in self.options['accountsByType']):
@@ -4782,7 +4782,7 @@ class gate(Exchange, ImplicitAPI):
4782
4782
  request['currency_pair'] = market['id']
4783
4783
  params = self.omit(params, 'symbol')
4784
4784
  if (toId == 'futures') or (toId == 'delivery') or (fromId == 'futures') or (fromId == 'delivery'):
4785
- request['settle'] = currency['id']
4785
+ request['settle'] = currency['id'] # todo: currencies have network-junctions
4786
4786
  response = self.privateWalletPostTransfers(self.extend(request, params))
4787
4787
  #
4788
4788
  # according to the docs(however actual response seems to be an empty string '')
@@ -5395,7 +5395,7 @@ class gate(Exchange, ImplicitAPI):
5395
5395
  self.load_markets()
5396
5396
  currency = self.currency(code)
5397
5397
  request = {
5398
- 'currency': currency['id'].upper(),
5398
+ 'currency': currency['id'].upper(), # todo: currencies have network-junctions
5399
5399
  'amount': self.currency_to_precision(code, amount),
5400
5400
  }
5401
5401
  market = self.market(symbol)
@@ -5422,7 +5422,7 @@ class gate(Exchange, ImplicitAPI):
5422
5422
  self.load_markets()
5423
5423
  currency = self.currency(code)
5424
5424
  request = {
5425
- 'currency': currency['id'].upper(),
5425
+ 'currency': currency['id'].upper(), # todo: currencies have network-junctions
5426
5426
  'amount': self.currency_to_precision(code, amount),
5427
5427
  }
5428
5428
  response = self.privateMarginPostCrossRepayments(self.extend(request, params))
@@ -5459,7 +5459,7 @@ class gate(Exchange, ImplicitAPI):
5459
5459
  self.load_markets()
5460
5460
  currency = self.currency(code)
5461
5461
  request = {
5462
- 'currency': currency['id'].upper(),
5462
+ 'currency': currency['id'].upper(), # todo: currencies have network-junctions
5463
5463
  'amount': self.currency_to_precision(code, amount),
5464
5464
  }
5465
5465
  response = None
@@ -5502,7 +5502,7 @@ class gate(Exchange, ImplicitAPI):
5502
5502
  self.load_markets()
5503
5503
  currency = self.currency(code)
5504
5504
  request = {
5505
- 'currency': currency['id'].upper(),
5505
+ 'currency': currency['id'].upper(), # todo: currencies have network-junctions
5506
5506
  'amount': self.currency_to_precision(code, amount),
5507
5507
  }
5508
5508
  response = self.privateMarginPostCrossLoans(self.extend(request, params))
@@ -5995,7 +5995,7 @@ class gate(Exchange, ImplicitAPI):
5995
5995
  if (type == 'spot') or (type == 'margin'):
5996
5996
  if code is not None:
5997
5997
  currency = self.currency(code)
5998
- request['currency'] = currency['id']
5998
+ request['currency'] = currency['id'] # todo: currencies have network-junctions
5999
5999
  if (type == 'swap') or (type == 'future'):
6000
6000
  defaultSettle = 'usdt' if (type == 'swap') else 'btc'
6001
6001
  settle = self.safe_string_lower(params, 'settle', defaultSettle)
@@ -6753,7 +6753,7 @@ class gate(Exchange, ImplicitAPI):
6753
6753
  self.load_markets()
6754
6754
  currency = self.currency(code)
6755
6755
  request = {
6756
- 'underlying': currency['code'] + '_USDT',
6756
+ 'underlying': currency['code'] + '_USDT', # todo: currency['id'].upper() & network junctions
6757
6757
  }
6758
6758
  response = self.publicOptionsGetContracts(self.extend(request, params))
6759
6759
  #
ccxt/krakenfutures.py CHANGED
@@ -363,7 +363,8 @@ class krakenfutures(Exchange, ImplicitAPI):
363
363
  # swap == perpetual
364
364
  settle = None
365
365
  settleId = None
366
- amountPrecision = self.parse_number(self.parse_precision(self.safe_string(market, 'contractValueTradePrecision', '0')))
366
+ cvtp = self.safe_string(market, 'contractValueTradePrecision')
367
+ amountPrecision = self.parse_number(self.integer_precision_to_amount(cvtp))
367
368
  pricePrecision = self.safe_number(market, 'tickSize')
368
369
  contract = (swap or future or index)
369
370
  swapOrFutures = (swap or future)
ccxt/kucoin.py CHANGED
@@ -3325,9 +3325,9 @@ class kucoin(Exchange, ImplicitAPI):
3325
3325
  def fetch_balance(self, params={}) -> Balances:
3326
3326
  """
3327
3327
  query for balance and get the amount of funds available for trading or funds locked in orders
3328
- :see: https://docs.kucoin.com/#list-accounts
3329
3328
  :see: https://www.kucoin.com/docs/rest/account/basic-info/get-account-list-spot-margin-trade_hf
3330
- :see: https://docs.kucoin.com/#query-isolated-margin-account-info
3329
+ :see: https://www.kucoin.com/docs/rest/funding/funding-overview/get-account-detail-margin
3330
+ :see: https://www.kucoin.com/docs/rest/funding/funding-overview/get-account-detail-isolated-margin
3331
3331
  :param dict [params]: extra parameters specific to the exchange API endpoint
3332
3332
  :param dict [params.marginMode]: 'cross' or 'isolated', margin type for fetching margin balance
3333
3333
  :param dict [params.type]: extra parameters specific to the exchange API endpoint
@@ -3352,7 +3352,7 @@ class kucoin(Exchange, ImplicitAPI):
3352
3352
  response = None
3353
3353
  request = {}
3354
3354
  isolated = (marginMode == 'isolated') or (type == 'isolated')
3355
- cross = (marginMode == 'cross') or (type == 'cross')
3355
+ cross = (marginMode == 'cross') or (type == 'margin')
3356
3356
  if isolated:
3357
3357
  if currency is not None:
3358
3358
  request['balanceCurrency'] = currency['id']
@@ -3417,13 +3417,14 @@ class kucoin(Exchange, ImplicitAPI):
3417
3417
  # }
3418
3418
  # }
3419
3419
  #
3420
- data = self.safe_list(response, 'data', [])
3420
+ data = None
3421
3421
  result = {
3422
3422
  'info': response,
3423
3423
  'timestamp': None,
3424
3424
  'datetime': None,
3425
3425
  }
3426
3426
  if isolated:
3427
+ data = self.safe_dict(response, 'data', {})
3427
3428
  assets = self.safe_value(data, 'assets', data)
3428
3429
  for i in range(0, len(assets)):
3429
3430
  entry = assets[i]
@@ -3438,6 +3439,7 @@ class kucoin(Exchange, ImplicitAPI):
3438
3439
  subResult[quoteCode] = self.parse_balance_helper(quote)
3439
3440
  result[symbol] = self.safe_balance(subResult)
3440
3441
  elif cross:
3442
+ data = self.safe_dict(response, 'data', {})
3441
3443
  accounts = self.safe_list(data, 'accounts', [])
3442
3444
  for i in range(0, len(accounts)):
3443
3445
  balance = accounts[i]
@@ -3445,6 +3447,7 @@ class kucoin(Exchange, ImplicitAPI):
3445
3447
  codeInner = self.safe_currency_code(currencyId)
3446
3448
  result[codeInner] = self.parse_balance_helper(balance)
3447
3449
  else:
3450
+ data = self.safe_list(response, 'data', [])
3448
3451
  for i in range(0, len(data)):
3449
3452
  balance = data[i]
3450
3453
  balanceType = self.safe_string(balance, 'type')
ccxt/mexc.py CHANGED
@@ -4228,7 +4228,7 @@ class mexc(Exchange, ImplicitAPI):
4228
4228
  key = self.safe_string(keys, 0)
4229
4229
  result = self.safe_dict(addressStructures, key)
4230
4230
  if result is None:
4231
- raise InvalidAddress(self.id + ' fetchDepositAddress() cannot find a deposit address for ' + code + ', and network' + network + 'consider creating one using the MEXC platform')
4231
+ raise InvalidAddress(self.id + ' fetchDepositAddress() cannot find a deposit address for ' + code + ', and network' + network + 'consider creating one using .createDepositAddress() method or in MEXC website')
4232
4232
  return result
4233
4233
 
4234
4234
  def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.87'
7
+ __version__ = '4.2.88'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.2.87
3
+ Version: 4.2.88
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
@@ -69,7 +69,6 @@ Current feature list:
69
69
 
70
70
 
71
71
  ## Sponsored Promotion
72
- [![bitget](https://github.com/ccxt/ccxt/assets/43336371/71359af3-c78f-4077-a64c-ac0bfe1fa01c)](https://www.bitget.com/events/competition/86c98f96df155e6bb397e866dcd86afc?channelCode=ccxt&vipCode=tg9j)
73
72
 
74
73
  ## See Also
75
74
 
@@ -102,7 +101,7 @@ Current feature list:
102
101
  | [![okx](https://user-images.githubusercontent.com/1294454/152485636-38b19e4a-bece-4dec-979a-5982859ffc04.jpg)](https://www.okx.com/join/CCXT2023) | okx | [OKX](https://www.okx.com/join/CCXT2023) | [![API Version 5](https://img.shields.io/badge/5-lightgray)](https://www.okx.com/docs-v5/en/) | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with OKX using CCXT's referral link for a 20% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d20%25&color=orange)](https://www.okx.com/join/CCXT2023) |
103
102
  | [![woo](https://user-images.githubusercontent.com/1294454/150730761-1a00e5e0-d28c-480f-9e65-089ce3e6ef3b.jpg)](https://x.woo.org/register?ref=YWOWC96B) | woo | [WOO X](https://x.woo.org/register?ref=YWOWC96B) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.woo.org/) | [![CCXT Certified](https://img.shields.io/badge/CCXT-Certified-green.svg)](https://github.com/ccxt/ccxt/wiki/Certification) | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) | [![Sign up with WOO X using CCXT's referral link for a 35% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d35%25&color=orange)](https://x.woo.org/register?ref=YWOWC96B) |
104
103
 
105
- ## Supported Cryptocurrency Exchange Markets
104
+ ## Supported Cryptocurrency Exchanges
106
105
 
107
106
  The CCXT library currently supports the following 97 cryptocurrency exchange markets and trading APIs:
108
107
 
@@ -262,13 +261,13 @@ console.log(version, Object.keys(exchanges));
262
261
 
263
262
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
264
263
 
265
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.87/dist/ccxt.browser.js
266
- * unpkg: https://unpkg.com/ccxt@4.2.87/dist/ccxt.browser.js
264
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.88/dist/ccxt.browser.js
265
+ * unpkg: https://unpkg.com/ccxt@4.2.88/dist/ccxt.browser.js
267
266
 
268
267
  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.
269
268
 
270
269
  ```HTML
271
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.87/dist/ccxt.browser.js"></script>
270
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.88/dist/ccxt.browser.js"></script>
272
271
  ```
273
272
 
274
273
  Creates a global `ccxt` object:
@@ -1,10 +1,10 @@
1
- ccxt/__init__.py,sha256=vo9ge9ab5tB0X-2V7CH30_jNijwuimdceGGxs2jX8fA,15656
1
+ ccxt/__init__.py,sha256=zWW1HsB9zW_WsZs0boJ4Bec8SChFiFb5NkbsbS08qgs,15656
2
2
  ccxt/ace.py,sha256=IsKHO7u3J8rJT9wCMdtwlmwPdtjnAwC9ZTMC0uNfs9A,41420
3
3
  ccxt/alpaca.py,sha256=6P2wAEGJQOjjoKQbzv1KvSuZvEZmOX987a1NqB7z9mk,46908
4
4
  ccxt/ascendex.py,sha256=1tvSlxB6kCxlpAilo5lsOYrtf_607IGCDwqlsGlSTgg,151137
5
5
  ccxt/bequant.py,sha256=RBiAmaTbL35DgiV3Hl6uchLUd78V0z1T9riTlNsrpdc,1174
6
6
  ccxt/bigone.py,sha256=IY9nFoxY9XhieTnaRBOXlFOyJvE8iBOdDpIZaiHQ1kU,92159
7
- ccxt/binance.py,sha256=cLfqWnY0SCs4uJo0p07bu57a0xa9mu7Ig1RGdSuIBOI,590985
7
+ ccxt/binance.py,sha256=tEvZ8doLPWGDU7esHObDCT0bfts-xNVDRHGgUB7Xv-U,591366
8
8
  ccxt/binancecoinm.py,sha256=pncdw6Xw2X1Po-vEvAB4nL37scoS_axGAVxetPy1YQs,1645
9
9
  ccxt/binanceus.py,sha256=hdcT4OnadcdFFFjF3GtM0nWv90jqojqwdVS3xWGuW40,9163
10
10
  ccxt/binanceusdm.py,sha256=KPQGlCalQ0eGlPCs2tSanOxaP8O0zFRQjGntA16Yprw,2480
@@ -17,7 +17,7 @@ ccxt/bitcoincom.py,sha256=PyWIl4nC4jp5Uba2lI1At0N_hhNyWD0DoZC_MSyL_s4,502
17
17
  ccxt/bitfinex.py,sha256=U4f8Oe5nxAatOpuUkJd5OPxglMMTO4wP9F-qpZ2PW_M,71500
18
18
  ccxt/bitfinex2.py,sha256=CZvg12UsV2SkqXYDRshct7QRTHqdPyhgWpU3-TzJSSs,158037
19
19
  ccxt/bitflyer.py,sha256=VjBZQbY-BB4MQ3h7u1K6yFRBGXn4hawBVWIAGc3uYEw,41279
20
- ccxt/bitget.py,sha256=I54VSr1WTJx7SfGXDFxY40x-9s7wHKOCkbf1gIgvXVU,407252
20
+ ccxt/bitget.py,sha256=z9iWClcp9-q2s7xq6LfRpJ9DvNQ006bWqv7DuRvDBzk,407361
21
21
  ccxt/bithumb.py,sha256=3as78FD3VF-dcTfXnUG0FBdh202TFGtmumit8ZPQI7w,45334
22
22
  ccxt/bitmart.py,sha256=va5p5p_GS_rgPyf44GIvcErdXdl7tFYpJJ062v-Nd-A,198947
23
23
  ccxt/bitmex.py,sha256=AVvk4b57uRQH7z7qAyXAoGBlHISCz3IwdV_-QVgG0HU,125327
@@ -48,7 +48,7 @@ ccxt/coinmetro.py,sha256=BDENHzBbAt0cCzu5Y0YX6Z_jtcXogWEzw3jmb9nMyLs,80383
48
48
  ccxt/coinone.py,sha256=ZhdWCm87QSpI7gJMa4e_5uS8fU7tm7U797ASKUHN4Uk,46719
49
49
  ccxt/coinsph.py,sha256=-6WEnLxfyMhvvMEnGcqfmcpXYggKBR-I1DKnJbcmpak,90274
50
50
  ccxt/coinspot.py,sha256=rtHhup6v6HbDCAVrZyVJJqOooJ_zoRWU0OqkEjLYL3E,23463
51
- ccxt/cryptocom.py,sha256=wFpUY3Si7iky7XErNKppOdoSolaMcC-cwtsJ5vnZTkE,128087
51
+ ccxt/cryptocom.py,sha256=mmOzjdDp_tFVJfgnFyfbjtyTtlalbJvr5JIennEgWTo,128103
52
52
  ccxt/currencycom.py,sha256=7HoKIs_S3JefwCQiVp6tzS-d9sAQdG8qb-P89Js0j6c,86705
53
53
  ccxt/delta.py,sha256=i2QMWS0PsVP9jjVHPZbBU7IQlkdsKPUb3LUksuecBWU,150373
54
54
  ccxt/deribit.py,sha256=zYQBv64tA5snW3q3xmjAFfdKqq6guJJTB1Z0dhl8-iY,159127
@@ -56,7 +56,7 @@ ccxt/digifinex.py,sha256=4sANd8_Fz2v97kzu71IuUGHBOrISziccAqcKNLk4nmQ,169545
56
56
  ccxt/exmo.py,sha256=0I80ZO7-GawTaraH2EQNUbxtQWB1Ds0uuBJdk_FL9Kg,114111
57
57
  ccxt/flowbtc.py,sha256=YPvm6tbsHJJUQBspFcHuVPQfVmiWzwnVvfzRqBdQX6U,1169
58
58
  ccxt/fmfwio.py,sha256=RbVLvzPwnqfDsE7Ea-N13ISCC82eJVPsXYjrleASmew,1236
59
- ccxt/gate.py,sha256=2DYsnVZ2nKZyUfkHgpN70O1SK9DA5pVt78QKuC4fFDE,314318
59
+ ccxt/gate.py,sha256=LWNEp9iWUWdkrrUheMF1NzopohLkOpje5x_pu6mqyHQ,314930
60
60
  ccxt/gateio.py,sha256=86AETJWODl_vA5VNeQRHZprmpNIY1HAxCddKZcnKSi8,445
61
61
  ccxt/gemini.py,sha256=B8_5McLOK6tqSgIUpNIhgc7kOSEHFzALniQKO1343vY,79456
62
62
  ccxt/hitbtc.py,sha256=3zGp4Zz6YMUJP7kXwEbHT3ccsD4_ApFc_4Q1UjX8glg,152585
@@ -70,8 +70,8 @@ ccxt/idex.py,sha256=ZZvZ6M2Nc21dvJ7s-wCDNykTYvIblP1bvs_TeYQvnvE,72755
70
70
  ccxt/independentreserve.py,sha256=EmmR6gJy6aoBJApG6M_A8Ink-90TghAaTDtaaILDzbs,31996
71
71
  ccxt/indodax.py,sha256=xC7of6o3UWGfy3U6SNFEK_SKlkrFbLjJGut2fZyC53E,51779
72
72
  ccxt/kraken.py,sha256=u_UKSp2fEfuKJWA6FxA5L7UWEGAHlWr_dP-1e6TcD_U,121967
73
- ccxt/krakenfutures.py,sha256=GJgw2CnZlNmTS4S5EIxCiwy6hAJ05r9P5nAUdYbHV04,115642
74
- ccxt/kucoin.py,sha256=EnrH51T4u0XnkFpjqwyS64aQV7IPpf7d5EEGfM0DLpU,213481
73
+ ccxt/krakenfutures.py,sha256=w3YaTs65H5mlodhRAcLsroCbzkRlb7XICkuq6bVPcWs,115673
74
+ ccxt/kucoin.py,sha256=bPN3cGL9B_mC8uOriVkiQ-rXLqwvKQxgH1bFd1F9kIQ,213696
75
75
  ccxt/kucoinfutures.py,sha256=LRv9jlG90jqPF6oJRgGVKC88jhCaBBoIRFrwkb7eKZA,116663
76
76
  ccxt/kuna.py,sha256=aYEucvgyCo9mzI-wVUiR84nCYoAGqDsIC50RN4yvV3g,95954
77
77
  ccxt/latoken.py,sha256=cYDzToJ0HUhUiN5Mr081ena03b4pYCve3M8IFZYa0-M,78584
@@ -79,7 +79,7 @@ ccxt/lbank.py,sha256=wTz2Hjtx1LQrF1ZmXwJaCbTHABayiqVLbUSA3uhKvCM,114982
79
79
  ccxt/luno.py,sha256=khH7_HPDbeAYf3Jx0LCPP6sZdOY5iAeLkot5RMqXWwE,45536
80
80
  ccxt/lykke.py,sha256=hueiiLEqMygSpDu4RgkWFNTpd9zTd-bYBWQkR_rxAKQ,50803
81
81
  ccxt/mercado.py,sha256=4UE6juAVhS73-b55YWGqQEZ04v3izmeAO7oZtu7_b_k,35183
82
- ccxt/mexc.py,sha256=zleJJMEJKCj_jvjLsRaJb1BfffwFpWXQd_7U35L_nvo,234299
82
+ ccxt/mexc.py,sha256=VTSCZVUnDMbOp6xu4b9OCEWYCvolbQtAEhrBQ4Ycoj0,234331
83
83
  ccxt/ndax.py,sha256=J2L0Y-26LJPWZPU52MWDU_oxVUwF219SAg6z6NoiDIg,108342
84
84
  ccxt/novadax.py,sha256=Y2n3RRTmr-HUKach_m1pv3yZdp2Zl0a1QdmSIrk-93Y,64105
85
85
  ccxt/oceanex.py,sha256=XAnfRtmMPldpG9bf3df9Q_-gq_ObP2ZzG9sch99XKyU,37832
@@ -207,13 +207,13 @@ ccxt/abstract/woo.py,sha256=E-QXVJKVI4EOW72NX6wv99px9EyitWtd9KWvXUc9Tyo,10216
207
207
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
208
208
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
209
209
  ccxt/abstract/zonda.py,sha256=aSfewvRojzmuymX6QbOnDR8v9VFqWTULMHX9Y7kKD1M,5820
210
- ccxt/async_support/__init__.py,sha256=-IynocNBGb_bzccQSjruA0g8JmLCDHu_dC66jUBTGeo,15409
210
+ ccxt/async_support/__init__.py,sha256=nfShAagjdXYq3fx4dcBHLCsmyT2z6Bqqm_vPk_ONZD8,15409
211
211
  ccxt/async_support/ace.py,sha256=IYTj0FJAAPvSrpgIpbzO6ftADPgLnQT1uk54MSSM7UA,41644
212
212
  ccxt/async_support/alpaca.py,sha256=Nsaff9RczBhiNF19RlqI6wggvEibV_2ICgB8H5Qiuck,47120
213
213
  ccxt/async_support/ascendex.py,sha256=6Urz_G0HkTowaypD-2_fhra013G1PsO8B5iWL4wYFLY,151925
214
214
  ccxt/async_support/bequant.py,sha256=1hTwHovo1bW1XTIc8ZKjvJ-Xg6LfmpGdzT7TepykaVM,1188
215
215
  ccxt/async_support/bigone.py,sha256=Ut_4zYmpAde6mn4KYPR9ho6N_WNKGwUegp0CEX9m6bI,92613
216
- ccxt/async_support/binance.py,sha256=jfWN-_X_XnTY0TGkdpTsueYBDEwHLBv_smLXQkAGRtE,593521
216
+ ccxt/async_support/binance.py,sha256=ZNS2ZX2x_EDl_JeF53jrRO-4BPrF0_CtO2ppbMDs3Lo,593902
217
217
  ccxt/async_support/binancecoinm.py,sha256=IY3RLZptQA2nmZaUYRGfTa5ZY4VMWBpFYfwHc8zTHw0,1683
218
218
  ccxt/async_support/binanceus.py,sha256=c-K3Tk7LaRJjmYdCx8vBOqsx01uXrtvt0PC2ekBiD0g,9177
219
219
  ccxt/async_support/binanceusdm.py,sha256=-1r4A4tmV2pCiLGO80hzq7MIIj4MTzOD7buZGv6JauA,2518
@@ -226,7 +226,7 @@ ccxt/async_support/bitcoincom.py,sha256=RiqwhK3RfxQ_PXTa860fphDCvwA8dalL-_rXlK85
226
226
  ccxt/async_support/bitfinex.py,sha256=PrQmqrwmrv_DCZ6QgrF7m4tyD8WglRKGXUBzaY9GkjE,71940
227
227
  ccxt/async_support/bitfinex2.py,sha256=yG0d55fhziX7b6FTn4XBsjW1YjQxahC8ggfq9FGMDm8,158771
228
228
  ccxt/async_support/bitflyer.py,sha256=sfvh-bsIh7jz3EEFPCjeYWWyUxLXHOuyd3kCB2HEY54,41587
229
- ccxt/async_support/bitget.py,sha256=USaY9lxAD6FRbzgCh_wlPiufEg0xQCIWS0rA7q6tPUE,408786
229
+ ccxt/async_support/bitget.py,sha256=7VK41Cy64wG6-0sgy49cmk0c8gOC33snvFiBYlCh_2k,408895
230
230
  ccxt/async_support/bithumb.py,sha256=wjVV8R94Of6fatNQAtpCeLuCkvpAbniLncRwh4KcJbs,45564
231
231
  ccxt/async_support/bitmart.py,sha256=h6N6cKAXtsHmWMvsWU_HGhiWAZBjVrFYjbfAg7cgUeI,199867
232
232
  ccxt/async_support/bitmex.py,sha256=NHm71vOprRDv54nwbgj87G_KKWAXqeWacZpnsVvxHac,125887
@@ -257,7 +257,7 @@ ccxt/async_support/coinmetro.py,sha256=1mNOihy1kpzz-jwMEYmF_NvqUWoz8wogrx1SHMd_W
257
257
  ccxt/async_support/coinone.py,sha256=NvAtYLboYVSW15yhFHDLZW3zKEzRWeRXZDgP0Kf9fzo,46961
258
258
  ccxt/async_support/coinsph.py,sha256=ah1P7Jr6DtPv2RQe0k0lNVAzDlbijMUxvJ0Okcq951Q,90708
259
259
  ccxt/async_support/coinspot.py,sha256=DqWK2WouFRRfchKlNFOAIhDcVK3pFfI-kHyg1BgH8P8,23615
260
- ccxt/async_support/cryptocom.py,sha256=mG5x0OYofew9W2fURpQw_vQEJc3tnCSSvPOjohdPP9E,128641
260
+ ccxt/async_support/cryptocom.py,sha256=wqY3_Qi4-UjulWGSjJpVcrcUTRXa7FmlAEXPHJP3ZDc,128657
261
261
  ccxt/async_support/currencycom.py,sha256=PY2dH-FEc4_NLwc41lK5y7zdHYdseTKGwOCGGTTztCo,87127
262
262
  ccxt/async_support/delta.py,sha256=wDCtuEa9XLJEG21UiyZCbU9lbXXdAeUohIQ_jloO0Kc,150981
263
263
  ccxt/async_support/deribit.py,sha256=E541ZvFFBSYaO_akT1MgDkV516YYdr4iIUWVpLo1Zbg,159897
@@ -265,7 +265,7 @@ ccxt/async_support/digifinex.py,sha256=nbDx3ynwpfcf31Rj7yi4oNHcuCrhFBlf1G7_ndrTY
265
265
  ccxt/async_support/exmo.py,sha256=eRygc3DHGUhEkCcdhMND4c08_oarXYYr63JphSHVpq8,114743
266
266
  ccxt/async_support/flowbtc.py,sha256=bCnvtcNnPxxaxqVjI1GGXKhIpz_1r4GIFWqqPokvCR0,1183
267
267
  ccxt/async_support/fmfwio.py,sha256=lzfSnPrB2ARcC3EIqAuBM4vyg6LJ6n8RE71Zvt3ez1s,1250
268
- ccxt/async_support/gate.py,sha256=NMPx1sGbp7vt7_xsxq5GB--kwo38z4r3YBEC2gikx30,315972
268
+ ccxt/async_support/gate.py,sha256=OSlylQ9z2Z5ssBSiJ0wGLX-Mcwd6r0WVXCiwDCBcON4,316584
269
269
  ccxt/async_support/gateio.py,sha256=6_t032F9p9x5KGTjtSuqGXITzFOx-XAQBYLpsuQjzxw,459
270
270
  ccxt/async_support/gemini.py,sha256=JwWrmpBfOOmj3z6FI05vRnqKaw2BudDDPiH9EKJAEpg,79969
271
271
  ccxt/async_support/hitbtc.py,sha256=yea-4EzKdhIu8mWHRCYIucsC3JIpb7gVQvCHpfn_eR4,153631
@@ -279,8 +279,8 @@ ccxt/async_support/idex.py,sha256=cECcQjOyPThcP0v7dMrsUbKYXiVr5linXnkUO4OiArM,73
279
279
  ccxt/async_support/independentreserve.py,sha256=7st7UBewv0j5ZJtThbm1sdyIU4b8eYgIa577pp8G30s,32256
280
280
  ccxt/async_support/indodax.py,sha256=A2-LUvN4BgGOu_IOnsCLjyBTQBXnxCNPJWLcuy2oyPQ,52087
281
281
  ccxt/async_support/kraken.py,sha256=iPhMDhF7ZpfZ04o3p6PIBK-rUxHJpyw0hzvAjm7dXng,122551
282
- ccxt/async_support/krakenfutures.py,sha256=l0miU_r2z98A-A1lkFyZ9E-RItOE1tM1BnbflEeiTrg,116112
283
- ccxt/async_support/kucoin.py,sha256=8yKq6amd-N0Ms-RVLPfypdri8FO1hPeQ6QPC7QHE33E,214535
282
+ ccxt/async_support/krakenfutures.py,sha256=LxUUDt8BH69IRbtFYCSsyKZhW_QHEvhqFnAbdYNmzsA,116143
283
+ ccxt/async_support/kucoin.py,sha256=XdQacAolaHilo87uCpSrWEE0We13g_grriuI7SzXoOI,214750
284
284
  ccxt/async_support/kucoinfutures.py,sha256=DFWz5xjGMbbQhM-buATMV6WPVWvFufd7h6789nrCSj8,117241
285
285
  ccxt/async_support/kuna.py,sha256=8bqVXt9ExmN7VRDYjvhyjNm88EzPvmwgTeXuqbMQQVQ,96370
286
286
  ccxt/async_support/latoken.py,sha256=kd7_aKlm4AbiuV3kv14w0eQKxJ2jGWz46gFkrO1YUXk,79060
@@ -288,7 +288,7 @@ ccxt/async_support/lbank.py,sha256=EDplXjuFE1b_R-f6_DlSLPrgUbqdOy-9yFd92OPLsM8,1
288
288
  ccxt/async_support/luno.py,sha256=1BXtV6PPSgEg1kMXPgWgwnPh0UFTyWPqpGpbwpRIIws,45874
289
289
  ccxt/async_support/lykke.py,sha256=Rifr7_QWTEQicQou-i8---xvudqjiwqPORkFrUVcPh4,51117
290
290
  ccxt/async_support/mercado.py,sha256=1iK75kOrUKB638xvgsxB2ELN0TB_d2mh10Nptz-8DjQ,35425
291
- ccxt/async_support/mexc.py,sha256=nePIyyYUiRooUn71VENkIjgGi8MviVn4fyRIhHlHrTw,235459
291
+ ccxt/async_support/mexc.py,sha256=dNSOhWZFqTHoGfx0yvGAfJ7Rfkbe9eGiVHzx-upMn8s,235491
292
292
  ccxt/async_support/ndax.py,sha256=WUNN4I8md8q2eWQu6T6e6nGvjyXguRmgy8-47L1W0Bk,108866
293
293
  ccxt/async_support/novadax.py,sha256=oUNfqlpIuKhOrYuu3WMwUW3hmH-cp52NXY1-5tuwAyM,64473
294
294
  ccxt/async_support/oceanex.py,sha256=ApoQrb9p7YIUUCHXMccZTsBcggf-0fdVeOhvxzyqLyA,38152
@@ -313,7 +313,7 @@ ccxt/async_support/yobit.py,sha256=wH9UBovJv56iJcWs0kGbvHkBydPGVWcI_-Y2_FsFfQs,5
313
313
  ccxt/async_support/zaif.py,sha256=PaHcaNijKkhocrw6DZoSBNUjBOLNlkUYtsJvPAqkx68,28134
314
314
  ccxt/async_support/zonda.py,sha256=0o0Q1rFuTbdhm8m_rlo8D1qLsgZhhBqnefsHi0rVA_A,80866
315
315
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
316
- ccxt/async_support/base/exchange.py,sha256=-SaUG3p8mlgMfchRJi4qiSqHC9wPzIJ3z3-fD-xdh0s,90374
316
+ ccxt/async_support/base/exchange.py,sha256=cwg5l2AJ63L1QDG0UNIyNLnZJSbka76fg3BzqVIioR0,90374
317
317
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
318
318
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
319
319
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=Ed1765emEde2Hj8Ys6f5EjS54ZI1wQ0qIhd04eB7yhU,5751
@@ -327,10 +327,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=Pxrq22nCODckJ6G1OXkYEmUunIu
327
327
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
328
328
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
329
329
  ccxt/base/errors.py,sha256=JBn3zTrtru7tLgyEi6MzKAUwiZe0fltQLYoJcsdP-AA,4099
330
- ccxt/base/exchange.py,sha256=4KFbPNHB55FvIoHOE79qgjWN1w8NMhmWRg5111MCDns,250304
330
+ ccxt/base/exchange.py,sha256=JiW_sjkWxTzY-M_-4BBqhSIFDRbb9Qp6SV0uMZPSi8s,251117
331
331
  ccxt/base/precise.py,sha256=_xfu54sV0vWNnOfGTKRFykeuWP8mn4K1m9lk1tcllX4,8565
332
332
  ccxt/base/types.py,sha256=BQvl53Qwu51LGUSINkLPv9RNokqoz53iyjCGMv2T6Gg,7070
333
- ccxt/pro/__init__.py,sha256=yGzFqVTOpz3gTfjvNiNtG0HVPwdHU-8lF3_CUAsxAMk,6999
333
+ ccxt/pro/__init__.py,sha256=0zoA4b4KRe2qiT1FWzr5dbkBgu82hs81o382196g6c0,6999
334
334
  ccxt/pro/alpaca.py,sha256=7ePyWli0949ti5UheIn553xmnFpedrNc2W5CKauSZio,27167
335
335
  ccxt/pro/ascendex.py,sha256=0RlrxSqh4-lW99T-Y8AxrU612Cpy03u2loVMeRUPXlg,35432
336
336
  ccxt/pro/bequant.py,sha256=5zbsP8BHQTUZ8ZNL6uaACxDbUClgkOV4SYfXT_LfQVg,1351
@@ -529,7 +529,7 @@ ccxt/test/base/test_ticker.py,sha256=cMTIMb1oySNORUCmqI5ZzMswlEyCF6gJMah3vfvo8wQ
529
529
  ccxt/test/base/test_trade.py,sha256=PMtmB8V38dpaP-eb8h488xYMlR6D69yCOhsA1RuWrUA,2336
530
530
  ccxt/test/base/test_trading_fee.py,sha256=2aDCNJtqBkTC_AieO0l1HYGq5hz5qkWlkWb9Nv_fcwk,1066
531
531
  ccxt/test/base/test_transaction.py,sha256=BTbB4UHHXkrvYgwbrhh867nVRlevmIkIrz1W_odlQJI,1434
532
- ccxt-4.2.87.dist-info/METADATA,sha256=w4veeoBVJyKn7T9r5JwjbR1ZqWZ924L_RXsuLW-cBME,110489
533
- ccxt-4.2.87.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
534
- ccxt-4.2.87.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
535
- ccxt-4.2.87.dist-info/RECORD,,
532
+ ccxt-4.2.88.dist-info/METADATA,sha256=nXQ_N7csKFzwn4B1uvZ8n_MEvEnssWzyFw3FSb-4Law,110281
533
+ ccxt-4.2.88.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
534
+ ccxt-4.2.88.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
535
+ ccxt-4.2.88.dist-info/RECORD,,
File without changes