ccxt 2.9.7__py2.py3-none-any.whl → 2.9.9__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__ = '2.9.7'
25
+ __version__ = '2.9.9'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '2.9.7'
7
+ __version__ = '2.9.9'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '2.9.7'
5
+ __version__ = '2.9.9'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -1500,6 +1500,8 @@ class Exchange(BaseExchange):
1500
1500
  self.status = self.extend(self.status, {
1501
1501
  'updated': time,
1502
1502
  })
1503
+ if not ('info' in self.status):
1504
+ self.status['info'] = None
1503
1505
  return self.status
1504
1506
 
1505
1507
  async def fetch_funding_fee(self, code, params={}):
@@ -1749,18 +1749,18 @@ class bitget(Exchange):
1749
1749
  # private
1750
1750
  #
1751
1751
  # {
1752
- # accountId: '6394957606',
1753
- # symbol: 'LTCUSDT_SPBL',
1754
- # orderId: '864752115272552448',
1755
- # fillId: '864752115685969921',
1752
+ # accountId: '4383649766',
1753
+ # symbol: 'ETHBTC_SPBL',
1754
+ # orderId: '1009402341131468800',
1755
+ # fillId: '1009402351489581068',
1756
1756
  # orderType: 'limit',
1757
- # side: 'buy',
1758
- # fillPrice: '127.92000000',
1759
- # fillQuantity: '0.10000000',
1760
- # fillTotalAmount: '12.79200000',
1761
- # feeCcy: 'LTC',
1762
- # fees: '0.00000000',
1763
- # cTime: '1641898891373'
1757
+ # side: 'sell',
1758
+ # fillPrice: '0.06997800',
1759
+ # fillQuantity: '0.04120000',
1760
+ # fillTotalAmount: '0.00288309',
1761
+ # feeCcy: 'BTC',
1762
+ # fees: '-0.00000288',
1763
+ # cTime: '1676386195060'
1764
1764
  # }
1765
1765
  #
1766
1766
  # {
@@ -1794,7 +1794,7 @@ class bitget(Exchange):
1794
1794
  fee = {
1795
1795
  'code': currencyCode, # kept here for backward-compatibility, but will be removed soon
1796
1796
  'currency': currencyCode,
1797
- 'cost': feeAmount,
1797
+ 'cost': Precise.string_neg(feeAmount),
1798
1798
  }
1799
1799
  datetime = self.iso8601(timestamp)
1800
1800
  return self.safe_trade({
@@ -387,41 +387,44 @@ class bithumb(Exchange):
387
387
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/en/latest/manual.html#ticker-structure>`
388
388
  """
389
389
  await self.load_markets()
390
- symbols = self.market_symbols(symbols)
391
- response = await self.publicGetTickerAll(params)
392
- #
393
- # {
394
- # "status":"0000",
395
- # "data":{
396
- # "BTC":{
397
- # "opening_price":"9045000",
398
- # "closing_price":"9132000",
399
- # "min_price":"8938000",
400
- # "max_price":"9168000",
401
- # "units_traded":"4619.79967497",
402
- # "acc_trade_value":"42021363832.5187",
403
- # "prev_closing_price":"9041000",
404
- # "units_traded_24H":"8793.5045804",
405
- # "acc_trade_value_24H":"78933458515.4962",
406
- # "fluctate_24H":"530000",
407
- # "fluctate_rate_24H":"6.16"
408
- # },
409
- # "date":"1587710878669"
410
- # }
411
- # }
412
- #
413
390
  result = {}
414
- data = self.safe_value(response, 'data', {})
415
- timestamp = self.safe_integer(data, 'date')
416
- tickers = self.omit(data, 'date')
417
- ids = list(tickers.keys())
418
- for i in range(0, len(ids)):
419
- id = ids[i]
420
- market = self.safe_market(id)
421
- symbol = market['symbol']
422
- ticker = tickers[id]
423
- isArray = isinstance(ticker, list)
424
- if not isArray:
391
+ quoteCurrencies = self.safe_value(self.options, 'quoteCurrencies', {})
392
+ quotes = list(quoteCurrencies.keys())
393
+ for i in range(0, len(quotes)):
394
+ quote = quotes[i]
395
+ method = 'publicGetTickerALL' + quote
396
+ response = await getattr(self, method)(params)
397
+ #
398
+ # {
399
+ # "status":"0000",
400
+ # "data":{
401
+ # "BTC":{
402
+ # "opening_price":"9045000",
403
+ # "closing_price":"9132000",
404
+ # "min_price":"8938000",
405
+ # "max_price":"9168000",
406
+ # "units_traded":"4619.79967497",
407
+ # "acc_trade_value":"42021363832.5187",
408
+ # "prev_closing_price":"9041000",
409
+ # "units_traded_24H":"8793.5045804",
410
+ # "acc_trade_value_24H":"78933458515.4962",
411
+ # "fluctate_24H":"530000",
412
+ # "fluctate_rate_24H":"6.16"
413
+ # },
414
+ # "date":"1587710878669"
415
+ # }
416
+ # }
417
+ #
418
+ data = self.safe_value(response, 'data', {})
419
+ timestamp = self.safe_integer(data, 'date')
420
+ tickers = self.omit(data, 'date')
421
+ currencyIds = list(tickers.keys())
422
+ for j in range(0, len(currencyIds)):
423
+ currencyId = currencyIds[j]
424
+ ticker = data[currencyId]
425
+ base = self.safe_currency_code(currencyId)
426
+ symbol = base + '/' + quote
427
+ market = self.safe_market(symbol)
425
428
  ticker['date'] = timestamp
426
429
  result[symbol] = self.parse_ticker(ticker, market)
427
430
  return self.filter_by_array(result, 'symbol', symbols)
@@ -6,6 +6,7 @@
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.base.errors import ExchangeError
8
8
  from ccxt.base.errors import AuthenticationError
9
+ from ccxt.base.errors import PermissionDenied
9
10
  from ccxt.base.errors import ArgumentsRequired
10
11
  from ccxt.base.errors import BadRequest
11
12
  from ccxt.base.errors import InsufficientFunds
@@ -228,10 +229,12 @@ class btcex(Exchange):
228
229
  '403': AuthenticationError, # ACCESS_DENIED_ERROR Access denied
229
230
  '1000': ExchangeNotAvailable, # NO_SERVICE No service found
230
231
  '1001': BadRequest, # BAD_REQUEST Bad requested
232
+ '1005': DDoSProtection, # {"code":1005,"message":"Operate too frequently"}
231
233
  '2000': AuthenticationError, # NEED_LOGIN Login is required
232
234
  '2001': AuthenticationError, # ACCOUNT_NOT_MATCH Account information does not match
233
235
  '2002': AuthenticationError, # ACCOUNT_NEED_ENABLE Account needs to be activated
234
236
  '2003': AuthenticationError, # ACCOUNT_NOT_AVAILABLE Account not available
237
+ '2010': PermissionDenied, # {"code":2010,"message":"Access denied","data":{}}
235
238
  '3000': AuthenticationError, # TEST user
236
239
  '3002': AuthenticationError, # NICKNAME_EXIST Nicknames exist
237
240
  '3003': AuthenticationError, # ACCOUNT_NOT_EXIST No account
@@ -296,6 +299,7 @@ class btcex(Exchange):
296
299
  '5013': InvalidOrder, # ORDER_PRICE_RANGE_IS_TOO_HIGH order price range is too high.
297
300
  '5014': InvalidOrder, # ORDER_PRICE_RANGE_IS_TOO_LOW Order price range is too low.
298
301
  '5109': InvalidOrder, # ORDER_PRICE_RANGE_IS_TOO_LOW Order price range is too low.
302
+ '5119': InvalidOrder, # {"code":5119,"message":"Cannot be less than the minimum order value:10USDT, instrument: GXE/USDT","data":{"coinType":"USDT","amount":"10","instrumentName":"GXE/USDT"}}
299
303
  '5135': InvalidOrder, # The quantity should be larger than: 0.01
300
304
  '5901': InvalidOrder, # TRANSFER_RESULT transfer out success.
301
305
  '5902': InvalidOrder, # ORDER_SUCCESS place order success.
@@ -1254,7 +1258,7 @@ class btcex(Exchange):
1254
1258
  'instrument_name': market['id'],
1255
1259
  'type': type,
1256
1260
  }
1257
- if side == 'sell':
1261
+ if side == 'sell' or type == 'limit':
1258
1262
  request['amount'] = self.amount_to_precision(symbol, amount)
1259
1263
  if type == 'limit':
1260
1264
  request['price'] = self.price_to_precision(symbol, price)
@@ -39,7 +39,7 @@ class gate(Exchange):
39
39
  'pro': True,
40
40
  'urls': {
41
41
  'logo': 'https://user-images.githubusercontent.com/1294454/31784029-0313c702-b509-11e7-9ccc-bc0da6a0e435.jpg',
42
- 'doc': 'https://www.gate.io/docs/apiv4/en/index.html',
42
+ 'doc': 'https://www.gate.io/docs/developers/apiv4/en/',
43
43
  'www': 'https://gate.io/',
44
44
  'api': {
45
45
  'public': {
@@ -699,6 +699,11 @@ class gate(Exchange):
699
699
  async def fetch_markets(self, params={}):
700
700
  """
701
701
  retrieves data on all markets for gate
702
+ see https://www.gate.io/docs/developers/apiv4/en/#list-all-currency-pairs-supported # spot
703
+ see https://www.gate.io/docs/developers/apiv4/en/#list-all-supported-currency-pairs-supported-in-margin-trading # margin
704
+ see https://www.gate.io/docs/developers/apiv4/en/#list-all-futures-contracts # swap
705
+ see https://www.gate.io/docs/developers/apiv4/en/#list-all-futures-contracts-2 # future
706
+ see https://www.gate.io/docs/developers/apiv4/en/#list-all-the-contracts-with-specified-underlying-and-expiration-time # option
702
707
  :param dict params: extra parameters specific to the exchange api endpoint
703
708
  :returns [dict]: an array of objects representing market data
704
709
  """
@@ -2303,10 +2308,14 @@ class gate(Exchange):
2303
2308
  async def fetch_ohlcv(self, symbol, timeframe='1m', since=None, limit=None, params={}):
2304
2309
  """
2305
2310
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
2311
+ see https://www.gate.io/docs/developers/apiv4/en/#market-candlesticks # spot
2312
+ see https://www.gate.io/docs/developers/apiv4/en/#get-futures-candlesticks # swap
2313
+ see https://www.gate.io/docs/developers/apiv4/en/#market-candlesticks # future
2314
+ see https://www.gate.io/docs/developers/apiv4/en/#get-options-candlesticks # option
2306
2315
  :param str symbol: unified symbol of the market to fetch OHLCV data for
2307
2316
  :param str timeframe: the length of time each candle represents
2308
2317
  :param int|None since: timestamp in ms of the earliest candle to fetch
2309
- :param int|None limit: the maximum amount of candles to fetch
2318
+ :param int|None limit: the maximum amount of candles to fetch, limit is conflicted with since and params["until"], If either since and params["until"] is specified, request will be rejected
2310
2319
  :param dict params: extra parameters specific to the gateio api endpoint
2311
2320
  :param str|None params['price']: "mark" or "index" for mark price and index price candles
2312
2321
  :param int|None params['until']: timestamp in ms of the latest candle to fetch
ccxt/async_support/okx.py CHANGED
@@ -3577,26 +3577,31 @@ class okx(Exchange):
3577
3577
  currency = self.currency(code)
3578
3578
  if (tag is not None) and (len(tag) > 0):
3579
3579
  address = address + ':' + tag
3580
- fee = self.safe_string(params, 'fee')
3581
- if fee is None:
3582
- raise ArgumentsRequired(self.id + " withdraw() requires a 'fee' string parameter, network transaction fee must be ≥ 0. Withdrawals to OKCoin or OKX are fee-free, please set '0'. Withdrawing to external digital asset address requires network transaction fee.")
3583
3580
  request = {
3584
3581
  'ccy': currency['id'],
3585
3582
  'toAddr': address,
3586
3583
  'dest': '4', # 2 = OKCoin International, 3 = OKX 4 = others
3587
3584
  'amt': self.number_to_string(amount),
3588
- 'fee': self.number_to_string(fee), # withdrawals to OKCoin or OKX are fee-free, please set 0
3589
3585
  }
3590
- if 'password' in params:
3591
- request['pwd'] = params['password']
3592
- elif 'pwd' in params:
3593
- request['pwd'] = params['pwd']
3594
3586
  networks = self.safe_value(self.options, 'networks', {})
3595
3587
  network = self.safe_string_upper(params, 'network') # self line allows the user to specify either ERC20 or ETH
3596
3588
  network = self.safe_string(networks, network, network) # handle ETH>ERC20 alias
3597
3589
  if network is not None:
3598
3590
  request['chain'] = currency['id'] + '-' + network
3599
3591
  params = self.omit(params, 'network')
3592
+ fee = self.safe_string(params, 'fee')
3593
+ if fee is None:
3594
+ currencies = await self.fetch_currencies()
3595
+ self.currencies = self.deep_extend(self.currencies, currencies)
3596
+ targetNetwork = self.safe_value(currency['networks'], self.network_id_to_code(network), {})
3597
+ fee = self.safe_string(targetNetwork, 'fee')
3598
+ if fee is None:
3599
+ raise ArgumentsRequired(self.id + " withdraw() requires a 'fee' string parameter, network transaction fee must be ≥ 0. Withdrawals to OKCoin or OKX are fee-free, please set '0'. Withdrawing to external digital asset address requires network transaction fee.")
3600
+ request['fee'] = self.number_to_string(fee) # withdrawals to OKCoin or OKX are fee-free, please set 0
3601
+ if 'password' in params:
3602
+ request['pwd'] = params['password']
3603
+ elif 'pwd' in params:
3604
+ request['pwd'] = params['pwd']
3600
3605
  query = self.omit(params, ['fee', 'password', 'pwd'])
3601
3606
  if not ('pwd' in request):
3602
3607
  raise ExchangeError(self.id + ' withdraw() requires a password parameter or a pwd parameter, it must be the funding password, not the API passphrase')
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '2.9.7'
7
+ __version__ = '2.9.9'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -3014,6 +3014,8 @@ class Exchange(object):
3014
3014
  self.status = self.extend(self.status, {
3015
3015
  'updated': time,
3016
3016
  })
3017
+ if not ('info' in self.status):
3018
+ self.status['info'] = None
3017
3019
  return self.status
3018
3020
 
3019
3021
  def fetch_funding_fee(self, code, params={}):
ccxt/bitget.py CHANGED
@@ -1747,18 +1747,18 @@ class bitget(Exchange):
1747
1747
  # private
1748
1748
  #
1749
1749
  # {
1750
- # accountId: '6394957606',
1751
- # symbol: 'LTCUSDT_SPBL',
1752
- # orderId: '864752115272552448',
1753
- # fillId: '864752115685969921',
1750
+ # accountId: '4383649766',
1751
+ # symbol: 'ETHBTC_SPBL',
1752
+ # orderId: '1009402341131468800',
1753
+ # fillId: '1009402351489581068',
1754
1754
  # orderType: 'limit',
1755
- # side: 'buy',
1756
- # fillPrice: '127.92000000',
1757
- # fillQuantity: '0.10000000',
1758
- # fillTotalAmount: '12.79200000',
1759
- # feeCcy: 'LTC',
1760
- # fees: '0.00000000',
1761
- # cTime: '1641898891373'
1755
+ # side: 'sell',
1756
+ # fillPrice: '0.06997800',
1757
+ # fillQuantity: '0.04120000',
1758
+ # fillTotalAmount: '0.00288309',
1759
+ # feeCcy: 'BTC',
1760
+ # fees: '-0.00000288',
1761
+ # cTime: '1676386195060'
1762
1762
  # }
1763
1763
  #
1764
1764
  # {
@@ -1792,7 +1792,7 @@ class bitget(Exchange):
1792
1792
  fee = {
1793
1793
  'code': currencyCode, # kept here for backward-compatibility, but will be removed soon
1794
1794
  'currency': currencyCode,
1795
- 'cost': feeAmount,
1795
+ 'cost': Precise.string_neg(feeAmount),
1796
1796
  }
1797
1797
  datetime = self.iso8601(timestamp)
1798
1798
  return self.safe_trade({
ccxt/bithumb.py CHANGED
@@ -387,41 +387,44 @@ class bithumb(Exchange):
387
387
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/en/latest/manual.html#ticker-structure>`
388
388
  """
389
389
  self.load_markets()
390
- symbols = self.market_symbols(symbols)
391
- response = self.publicGetTickerAll(params)
392
- #
393
- # {
394
- # "status":"0000",
395
- # "data":{
396
- # "BTC":{
397
- # "opening_price":"9045000",
398
- # "closing_price":"9132000",
399
- # "min_price":"8938000",
400
- # "max_price":"9168000",
401
- # "units_traded":"4619.79967497",
402
- # "acc_trade_value":"42021363832.5187",
403
- # "prev_closing_price":"9041000",
404
- # "units_traded_24H":"8793.5045804",
405
- # "acc_trade_value_24H":"78933458515.4962",
406
- # "fluctate_24H":"530000",
407
- # "fluctate_rate_24H":"6.16"
408
- # },
409
- # "date":"1587710878669"
410
- # }
411
- # }
412
- #
413
390
  result = {}
414
- data = self.safe_value(response, 'data', {})
415
- timestamp = self.safe_integer(data, 'date')
416
- tickers = self.omit(data, 'date')
417
- ids = list(tickers.keys())
418
- for i in range(0, len(ids)):
419
- id = ids[i]
420
- market = self.safe_market(id)
421
- symbol = market['symbol']
422
- ticker = tickers[id]
423
- isArray = isinstance(ticker, list)
424
- if not isArray:
391
+ quoteCurrencies = self.safe_value(self.options, 'quoteCurrencies', {})
392
+ quotes = list(quoteCurrencies.keys())
393
+ for i in range(0, len(quotes)):
394
+ quote = quotes[i]
395
+ method = 'publicGetTickerALL' + quote
396
+ response = getattr(self, method)(params)
397
+ #
398
+ # {
399
+ # "status":"0000",
400
+ # "data":{
401
+ # "BTC":{
402
+ # "opening_price":"9045000",
403
+ # "closing_price":"9132000",
404
+ # "min_price":"8938000",
405
+ # "max_price":"9168000",
406
+ # "units_traded":"4619.79967497",
407
+ # "acc_trade_value":"42021363832.5187",
408
+ # "prev_closing_price":"9041000",
409
+ # "units_traded_24H":"8793.5045804",
410
+ # "acc_trade_value_24H":"78933458515.4962",
411
+ # "fluctate_24H":"530000",
412
+ # "fluctate_rate_24H":"6.16"
413
+ # },
414
+ # "date":"1587710878669"
415
+ # }
416
+ # }
417
+ #
418
+ data = self.safe_value(response, 'data', {})
419
+ timestamp = self.safe_integer(data, 'date')
420
+ tickers = self.omit(data, 'date')
421
+ currencyIds = list(tickers.keys())
422
+ for j in range(0, len(currencyIds)):
423
+ currencyId = currencyIds[j]
424
+ ticker = data[currencyId]
425
+ base = self.safe_currency_code(currencyId)
426
+ symbol = base + '/' + quote
427
+ market = self.safe_market(symbol)
425
428
  ticker['date'] = timestamp
426
429
  result[symbol] = self.parse_ticker(ticker, market)
427
430
  return self.filter_by_array(result, 'symbol', symbols)
ccxt/btcex.py CHANGED
@@ -6,6 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.base.errors import ExchangeError
8
8
  from ccxt.base.errors import AuthenticationError
9
+ from ccxt.base.errors import PermissionDenied
9
10
  from ccxt.base.errors import ArgumentsRequired
10
11
  from ccxt.base.errors import BadRequest
11
12
  from ccxt.base.errors import InsufficientFunds
@@ -228,10 +229,12 @@ class btcex(Exchange):
228
229
  '403': AuthenticationError, # ACCESS_DENIED_ERROR Access denied
229
230
  '1000': ExchangeNotAvailable, # NO_SERVICE No service found
230
231
  '1001': BadRequest, # BAD_REQUEST Bad requested
232
+ '1005': DDoSProtection, # {"code":1005,"message":"Operate too frequently"}
231
233
  '2000': AuthenticationError, # NEED_LOGIN Login is required
232
234
  '2001': AuthenticationError, # ACCOUNT_NOT_MATCH Account information does not match
233
235
  '2002': AuthenticationError, # ACCOUNT_NEED_ENABLE Account needs to be activated
234
236
  '2003': AuthenticationError, # ACCOUNT_NOT_AVAILABLE Account not available
237
+ '2010': PermissionDenied, # {"code":2010,"message":"Access denied","data":{}}
235
238
  '3000': AuthenticationError, # TEST user
236
239
  '3002': AuthenticationError, # NICKNAME_EXIST Nicknames exist
237
240
  '3003': AuthenticationError, # ACCOUNT_NOT_EXIST No account
@@ -296,6 +299,7 @@ class btcex(Exchange):
296
299
  '5013': InvalidOrder, # ORDER_PRICE_RANGE_IS_TOO_HIGH order price range is too high.
297
300
  '5014': InvalidOrder, # ORDER_PRICE_RANGE_IS_TOO_LOW Order price range is too low.
298
301
  '5109': InvalidOrder, # ORDER_PRICE_RANGE_IS_TOO_LOW Order price range is too low.
302
+ '5119': InvalidOrder, # {"code":5119,"message":"Cannot be less than the minimum order value:10USDT, instrument: GXE/USDT","data":{"coinType":"USDT","amount":"10","instrumentName":"GXE/USDT"}}
299
303
  '5135': InvalidOrder, # The quantity should be larger than: 0.01
300
304
  '5901': InvalidOrder, # TRANSFER_RESULT transfer out success.
301
305
  '5902': InvalidOrder, # ORDER_SUCCESS place order success.
@@ -1254,7 +1258,7 @@ class btcex(Exchange):
1254
1258
  'instrument_name': market['id'],
1255
1259
  'type': type,
1256
1260
  }
1257
- if side == 'sell':
1261
+ if side == 'sell' or type == 'limit':
1258
1262
  request['amount'] = self.amount_to_precision(symbol, amount)
1259
1263
  if type == 'limit':
1260
1264
  request['price'] = self.price_to_precision(symbol, price)
ccxt/gate.py CHANGED
@@ -38,7 +38,7 @@ class gate(Exchange):
38
38
  'pro': True,
39
39
  'urls': {
40
40
  'logo': 'https://user-images.githubusercontent.com/1294454/31784029-0313c702-b509-11e7-9ccc-bc0da6a0e435.jpg',
41
- 'doc': 'https://www.gate.io/docs/apiv4/en/index.html',
41
+ 'doc': 'https://www.gate.io/docs/developers/apiv4/en/',
42
42
  'www': 'https://gate.io/',
43
43
  'api': {
44
44
  'public': {
@@ -698,6 +698,11 @@ class gate(Exchange):
698
698
  def fetch_markets(self, params={}):
699
699
  """
700
700
  retrieves data on all markets for gate
701
+ see https://www.gate.io/docs/developers/apiv4/en/#list-all-currency-pairs-supported # spot
702
+ see https://www.gate.io/docs/developers/apiv4/en/#list-all-supported-currency-pairs-supported-in-margin-trading # margin
703
+ see https://www.gate.io/docs/developers/apiv4/en/#list-all-futures-contracts # swap
704
+ see https://www.gate.io/docs/developers/apiv4/en/#list-all-futures-contracts-2 # future
705
+ see https://www.gate.io/docs/developers/apiv4/en/#list-all-the-contracts-with-specified-underlying-and-expiration-time # option
701
706
  :param dict params: extra parameters specific to the exchange api endpoint
702
707
  :returns [dict]: an array of objects representing market data
703
708
  """
@@ -2301,10 +2306,14 @@ class gate(Exchange):
2301
2306
  def fetch_ohlcv(self, symbol, timeframe='1m', since=None, limit=None, params={}):
2302
2307
  """
2303
2308
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
2309
+ see https://www.gate.io/docs/developers/apiv4/en/#market-candlesticks # spot
2310
+ see https://www.gate.io/docs/developers/apiv4/en/#get-futures-candlesticks # swap
2311
+ see https://www.gate.io/docs/developers/apiv4/en/#market-candlesticks # future
2312
+ see https://www.gate.io/docs/developers/apiv4/en/#get-options-candlesticks # option
2304
2313
  :param str symbol: unified symbol of the market to fetch OHLCV data for
2305
2314
  :param str timeframe: the length of time each candle represents
2306
2315
  :param int|None since: timestamp in ms of the earliest candle to fetch
2307
- :param int|None limit: the maximum amount of candles to fetch
2316
+ :param int|None limit: the maximum amount of candles to fetch, limit is conflicted with since and params["until"], If either since and params["until"] is specified, request will be rejected
2308
2317
  :param dict params: extra parameters specific to the gateio api endpoint
2309
2318
  :param str|None params['price']: "mark" or "index" for mark price and index price candles
2310
2319
  :param int|None params['until']: timestamp in ms of the latest candle to fetch
ccxt/okx.py CHANGED
@@ -3575,26 +3575,31 @@ class okx(Exchange):
3575
3575
  currency = self.currency(code)
3576
3576
  if (tag is not None) and (len(tag) > 0):
3577
3577
  address = address + ':' + tag
3578
- fee = self.safe_string(params, 'fee')
3579
- if fee is None:
3580
- raise ArgumentsRequired(self.id + " withdraw() requires a 'fee' string parameter, network transaction fee must be ≥ 0. Withdrawals to OKCoin or OKX are fee-free, please set '0'. Withdrawing to external digital asset address requires network transaction fee.")
3581
3578
  request = {
3582
3579
  'ccy': currency['id'],
3583
3580
  'toAddr': address,
3584
3581
  'dest': '4', # 2 = OKCoin International, 3 = OKX 4 = others
3585
3582
  'amt': self.number_to_string(amount),
3586
- 'fee': self.number_to_string(fee), # withdrawals to OKCoin or OKX are fee-free, please set 0
3587
3583
  }
3588
- if 'password' in params:
3589
- request['pwd'] = params['password']
3590
- elif 'pwd' in params:
3591
- request['pwd'] = params['pwd']
3592
3584
  networks = self.safe_value(self.options, 'networks', {})
3593
3585
  network = self.safe_string_upper(params, 'network') # self line allows the user to specify either ERC20 or ETH
3594
3586
  network = self.safe_string(networks, network, network) # handle ETH>ERC20 alias
3595
3587
  if network is not None:
3596
3588
  request['chain'] = currency['id'] + '-' + network
3597
3589
  params = self.omit(params, 'network')
3590
+ fee = self.safe_string(params, 'fee')
3591
+ if fee is None:
3592
+ currencies = self.fetch_currencies()
3593
+ self.currencies = self.deep_extend(self.currencies, currencies)
3594
+ targetNetwork = self.safe_value(currency['networks'], self.network_id_to_code(network), {})
3595
+ fee = self.safe_string(targetNetwork, 'fee')
3596
+ if fee is None:
3597
+ raise ArgumentsRequired(self.id + " withdraw() requires a 'fee' string parameter, network transaction fee must be ≥ 0. Withdrawals to OKCoin or OKX are fee-free, please set '0'. Withdrawing to external digital asset address requires network transaction fee.")
3598
+ request['fee'] = self.number_to_string(fee) # withdrawals to OKCoin or OKX are fee-free, please set 0
3599
+ if 'password' in params:
3600
+ request['pwd'] = params['password']
3601
+ elif 'pwd' in params:
3602
+ request['pwd'] = params['pwd']
3598
3603
  query = self.omit(params, ['fee', 'password', 'pwd'])
3599
3604
  if not ('pwd' in request):
3600
3605
  raise ExchangeError(self.id + ' withdraw() requires a password parameter or a pwd parameter, it must be the funding password, not the API passphrase')
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '2.9.7'
7
+ __version__ = '2.9.9'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/base/exchange.py CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '2.9.7'
5
+ __version__ = '2.9.9'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
ccxt/pro/huobi.py CHANGED
@@ -397,31 +397,35 @@ class huobi(Exchange, ccxt.async_support.huobi):
397
397
  client.reject(e, messageHash)
398
398
 
399
399
  async def watch_order_book_snapshot(self, client, message, subscription):
400
- symbol = self.safe_string(subscription, 'symbol')
401
- limit = self.safe_integer(subscription, 'limit')
402
- params = self.safe_value(subscription, 'params')
403
- attempts = self.safe_integer(subscription, 'numAttempts', 0)
404
400
  messageHash = self.safe_string(subscription, 'messageHash')
405
- market = self.market(symbol)
406
- url = self.get_url_by_market_type(market['type'], market['linear'])
407
- requestId = self.request_id()
408
- request = {
409
- 'req': messageHash,
410
- 'id': requestId,
411
- }
412
- # self is a temporary subscription by a specific requestId
413
- # it has a very short lifetime until the snapshot is received over ws
414
- snapshotSubscription = {
415
- 'id': requestId,
416
- 'messageHash': messageHash,
417
- 'symbol': symbol,
418
- 'limit': limit,
419
- 'params': params,
420
- 'numAttempts': attempts,
421
- 'method': self.handle_order_book_snapshot,
422
- }
423
- orderbook = await self.watch(url, requestId, request, requestId, snapshotSubscription)
424
- return orderbook.limit()
401
+ try:
402
+ symbol = self.safe_string(subscription, 'symbol')
403
+ limit = self.safe_integer(subscription, 'limit')
404
+ params = self.safe_value(subscription, 'params')
405
+ attempts = self.safe_integer(subscription, 'numAttempts', 0)
406
+ market = self.market(symbol)
407
+ url = self.get_url_by_market_type(market['type'], market['linear'])
408
+ requestId = self.request_id()
409
+ request = {
410
+ 'req': messageHash,
411
+ 'id': requestId,
412
+ }
413
+ # self is a temporary subscription by a specific requestId
414
+ # it has a very short lifetime until the snapshot is received over ws
415
+ snapshotSubscription = {
416
+ 'id': requestId,
417
+ 'messageHash': messageHash,
418
+ 'symbol': symbol,
419
+ 'limit': limit,
420
+ 'params': params,
421
+ 'numAttempts': attempts,
422
+ 'method': self.handle_order_book_snapshot,
423
+ }
424
+ orderbook = await self.watch(url, requestId, request, requestId, snapshotSubscription)
425
+ return orderbook.limit()
426
+ except Exception as e:
427
+ del client.subscriptions[messageHash]
428
+ client.reject(e, messageHash)
425
429
 
426
430
  def handle_delta(self, bookside, delta):
427
431
  price = self.safe_float(delta, 0)
ccxt/pro/huobijp.py CHANGED
@@ -321,30 +321,34 @@ class huobijp(Exchange, ccxt.async_support.huobijp):
321
321
  client.resolve(orderbook, messageHash)
322
322
 
323
323
  async def watch_order_book_snapshot(self, client, message, subscription):
324
- symbol = self.safe_string(subscription, 'symbol')
325
- limit = self.safe_integer(subscription, 'limit')
326
- params = self.safe_value(subscription, 'params')
327
324
  messageHash = self.safe_string(subscription, 'messageHash')
328
- api = self.safe_string(self.options, 'api', 'api')
329
- hostname = {'hostname': self.hostname}
330
- url = self.implode_params(self.urls['api']['ws'][api]['public'], hostname)
331
- requestId = self.request_id()
332
- request = {
333
- 'req': messageHash,
334
- 'id': requestId,
335
- }
336
- # self is a temporary subscription by a specific requestId
337
- # it has a very short lifetime until the snapshot is received over ws
338
- snapshotSubscription = {
339
- 'id': requestId,
340
- 'messageHash': messageHash,
341
- 'symbol': symbol,
342
- 'limit': limit,
343
- 'params': params,
344
- 'method': self.handle_order_book_snapshot,
345
- }
346
- orderbook = await self.watch(url, requestId, request, requestId, snapshotSubscription)
347
- return orderbook.limit()
325
+ try:
326
+ symbol = self.safe_string(subscription, 'symbol')
327
+ limit = self.safe_integer(subscription, 'limit')
328
+ params = self.safe_value(subscription, 'params')
329
+ api = self.safe_string(self.options, 'api', 'api')
330
+ hostname = {'hostname': self.hostname}
331
+ url = self.implode_params(self.urls['api']['ws'][api]['public'], hostname)
332
+ requestId = self.request_id()
333
+ request = {
334
+ 'req': messageHash,
335
+ 'id': requestId,
336
+ }
337
+ # self is a temporary subscription by a specific requestId
338
+ # it has a very short lifetime until the snapshot is received over ws
339
+ snapshotSubscription = {
340
+ 'id': requestId,
341
+ 'messageHash': messageHash,
342
+ 'symbol': symbol,
343
+ 'limit': limit,
344
+ 'params': params,
345
+ 'method': self.handle_order_book_snapshot,
346
+ }
347
+ orderbook = await self.watch(url, requestId, request, requestId, snapshotSubscription)
348
+ return orderbook.limit()
349
+ except Exception as e:
350
+ del client.subscriptions[messageHash]
351
+ client.reject(e, messageHash)
348
352
 
349
353
  def handle_delta(self, bookside, delta):
350
354
  price = self.safe_float(delta, 0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 2.9.7
3
+ Version: 2.9.9
4
4
  Summary: A JavaScript / Python / PHP cryptocurrency trading library with support for 130+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -89,7 +89,7 @@ Current feature list:
89
89
  | [![bitmart](https://user-images.githubusercontent.com/1294454/129991357-8f47464b-d0f4-41d6-8a82-34122f0d1398.jpg)](http://www.bitmart.com/?r=rQCFLh) | bitmart | [BitMart](http://www.bitmart.com/?r=rQCFLh) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://developer-pro.bitmart.com/) | [![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 BitMart using CCXT's referral link for a 30% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d30%25&color=orange)](http://www.bitmart.com/?r=rQCFLh) |
90
90
  | [![bitvavo](https://user-images.githubusercontent.com/1294454/169202626-bd130fc5-fcf9-41bb-8d97-6093225c73cd.jpg)](https://bitvavo.com/?a=24F34952F7) | bitvavo | [Bitvavo](https://bitvavo.com/?a=24F34952F7) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://docs.bitvavo.com/) | [![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) | |
91
91
  | [![bybit](https://user-images.githubusercontent.com/51840849/76547799-daff5b80-649e-11ea-87fb-3be9bac08954.jpg)](https://www.bybit.com/register?affiliate_id=35953) | bybit | [Bybit](https://www.bybit.com/register?affiliate_id=35953) | [![API Version 5](https://img.shields.io/badge/5-lightgray)](https://bybit-exchange.github.io/docs/inverse/) | [![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) | |
92
- | [![gate](https://user-images.githubusercontent.com/1294454/31784029-0313c702-b509-11e7-9ccc-bc0da6a0e435.jpg)](https://www.gate.io/ref/2436035) | gate | [Gate.io](https://www.gate.io/ref/2436035) | [![API Version 4](https://img.shields.io/badge/4-lightgray)](https://www.gate.io/docs/apiv4/en/index.html) | [![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 Gate.io using CCXT's referral link for a 20% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d20%25&color=orange)](https://www.gate.io/ref/2436035) |
92
+ | [![gate](https://user-images.githubusercontent.com/1294454/31784029-0313c702-b509-11e7-9ccc-bc0da6a0e435.jpg)](https://www.gate.io/ref/2436035) | gate | [Gate.io](https://www.gate.io/ref/2436035) | [![API Version 4](https://img.shields.io/badge/4-lightgray)](https://www.gate.io/docs/developers/apiv4/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 Gate.io using CCXT's referral link for a 20% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d20%25&color=orange)](https://www.gate.io/ref/2436035) |
93
93
  | [![huobi](https://user-images.githubusercontent.com/1294454/76137448-22748a80-604e-11ea-8069-6e389271911d.jpg)](https://www.huobi.com/en-us/v/register/double-invite/?inviter_id=11343840&invite_code=6rmm2223) | huobi | [Huobi](https://www.huobi.com/en-us/v/register/double-invite/?inviter_id=11343840&invite_code=6rmm2223) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://huobiapi.github.io/docs/spot/v1/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 Huobi using CCXT's referral link for a 15% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d15%25&color=orange)](https://www.huobi.com/en-us/v/register/double-invite/?inviter_id=11343840&invite_code=6rmm2223) |
94
94
  | [![idex](https://user-images.githubusercontent.com/51840849/94481303-2f222100-01e0-11eb-97dd-bc14c5943a86.jpg)](https://idex.io) | idex | [IDEX](https://idex.io) | [![API Version 3](https://img.shields.io/badge/3-lightgray)](https://docs.idex.io/) | [![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) | |
95
95
  | [![kucoin](https://user-images.githubusercontent.com/51840849/87295558-132aaf80-c50e-11ea-9801-a2fb0c57c799.jpg)](https://www.kucoin.com/ucenter/signup?rcode=E5wkqe) | kucoin | [KuCoin](https://www.kucoin.com/ucenter/signup?rcode=E5wkqe) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://docs.kucoin.com) | [![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) | |
@@ -160,7 +160,7 @@ The CCXT library currently supports the following 105 cryptocurrency exchange ma
160
160
  | [![exmo](https://user-images.githubusercontent.com/1294454/27766491-1b0ea956-5eda-11e7-9225-40d67b481b8d.jpg)](https://exmo.me/?ref=131685) | exmo | [EXMO](https://exmo.me/?ref=131685) | [![API Version 1.1](https://img.shields.io/badge/1.1-lightgray)](https://exmo.me/en/api_doc?ref=131685) | | |
161
161
  | [![flowbtc](https://user-images.githubusercontent.com/51840849/87443317-01c0d080-c5fe-11ea-95c2-9ebe1a8fafd9.jpg)](https://one.ndax.io/bfQiSL) | flowbtc | [flowBTC](https://one.ndax.io/bfQiSL) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://www.flowbtc.com.br/api.html) | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
162
162
  | [![fmfwio](https://user-images.githubusercontent.com/1294454/159177712-b685b40c-5269-4cea-ac83-f7894c49525d.jpg)](https://fmfw.io/referral/da948b21d6c92d69) | fmfwio | [FMFW.io](https://fmfw.io/referral/da948b21d6c92d69) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://api.fmfw.io/api/2/explore/) | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
163
- | [![gate](https://user-images.githubusercontent.com/1294454/31784029-0313c702-b509-11e7-9ccc-bc0da6a0e435.jpg)](https://www.gate.io/ref/2436035) | gate | [Gate.io](https://www.gate.io/ref/2436035) | [![API Version 4](https://img.shields.io/badge/4-lightgray)](https://www.gate.io/docs/apiv4/en/index.html) | [![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) |
163
+ | [![gate](https://user-images.githubusercontent.com/1294454/31784029-0313c702-b509-11e7-9ccc-bc0da6a0e435.jpg)](https://www.gate.io/ref/2436035) | gate | [Gate.io](https://www.gate.io/ref/2436035) | [![API Version 4](https://img.shields.io/badge/4-lightgray)](https://www.gate.io/docs/developers/apiv4/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) |
164
164
  | [![gemini](https://user-images.githubusercontent.com/1294454/27816857-ce7be644-6096-11e7-82d6-3c257263229c.jpg)](https://gemini.com/) | gemini | [Gemini](https://gemini.com/) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.gemini.com/rest-api) | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
165
165
  | [![hitbtc](https://user-images.githubusercontent.com/1294454/27766555-8eaec20e-5edc-11e7-9c5b-6dc69fc42f5e.jpg)](https://hitbtc.com/?ref_id=5a5d39a65d466) | hitbtc | [HitBTC](https://hitbtc.com/?ref_id=5a5d39a65d466) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://api.hitbtc.com/v2) | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
166
166
  | [![hitbtc3](https://user-images.githubusercontent.com/1294454/27766555-8eaec20e-5edc-11e7-9c5b-6dc69fc42f5e.jpg)](https://hitbtc.com/?ref_id=5a5d39a65d466) | hitbtc3 | [HitBTC](https://hitbtc.com/?ref_id=5a5d39a65d466) | [![API Version 3](https://img.shields.io/badge/3-lightgray)](https://api.hitbtc.com) | | |
@@ -259,13 +259,13 @@ console.log (ccxt.exchanges) // print all available exchanges
259
259
 
260
260
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
261
261
 
262
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@2.9.7/dist/ccxt.browser.js
263
- * unpkg: https://unpkg.com/ccxt@2.9.7/dist/ccxt.browser.js
262
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@2.9.9/dist/ccxt.browser.js
263
+ * unpkg: https://unpkg.com/ccxt@2.9.9/dist/ccxt.browser.js
264
264
 
265
265
  CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
266
266
 
267
267
  ```HTML
268
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@2.9.7/dist/ccxt.browser.js"></script>
268
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@2.9.9/dist/ccxt.browser.js"></script>
269
269
  ```
270
270
 
271
271
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=gUpgyrruBwuO1sZlO71Akd3ZTofF8iYt3xqqBtOVqMw,15912
1
+ ccxt/__init__.py,sha256=EsxMjnrSlpveBH_vBSbtmk0GUSC8utPz562MwZcSLwI,15912
2
2
  ccxt/ace.py,sha256=LHJs8ki3q_vhTf67M2dY5PhdhlNe3iYdWpI8Ac2rtB8,41009
3
3
  ccxt/alpaca.py,sha256=dd8lDHGg24qRhOyfvXgyjiLZ6YgnJ5ODpW4t4GFR8d8,32910
4
4
  ccxt/ascendex.py,sha256=lmBXXBJxSnfQP_Yl2e8djgx1v1aKPdMEFHNRXKv_f1o,125846
@@ -17,8 +17,8 @@ ccxt/bitfinex.py,sha256=tjxxr7W64b10YkQSk32-znXQbQ20rUpK0WrL4BmgS8I,68969
17
17
  ccxt/bitfinex2.py,sha256=gX36B6gY8zhDV_NL99aGyegpTFS429Sv_LBhn_oh6Jk,111167
18
18
  ccxt/bitflyer.py,sha256=5yZf04cQqQGAjk4Yabyn4Hg8iq61tnd1cmvLC_G6XOE,37335
19
19
  ccxt/bitforex.py,sha256=3mY0W3r2guT_b8qUxDCi_UBSrfLKwzO2jZ4C193_mRo,27957
20
- ccxt/bitget.py,sha256=l6HFnTPsHNEBGSsBMqskRCa2iSCnuIB2EWZF73dAe2M,198348
21
- ccxt/bithumb.py,sha256=8PM0WAEXmzIPA6-wHdSzscnWEAqygj2Uw9Mb8nX07VY,41907
20
+ ccxt/bitget.py,sha256=pGmrhXhbE0VH1EVmnwR3BX1pzQrHnEnWNUE6aPE0B8U,198368
21
+ ccxt/bithumb.py,sha256=I9GpVTcvA5mV7LIKOgqDDncUul108wCTCADlY1NpQi4,42254
22
22
  ccxt/bitmart.py,sha256=f7k6gVbq0p7ZC_7Hk0hUgCgEZTuCjykYWWPewk-nldA,129463
23
23
  ccxt/bitmex.py,sha256=wEh80OgAG8mQKssDXE4G_xVDdwnJfIGuWGv9JEawxJM,118244
24
24
  ccxt/bitopro.py,sha256=rMHo98gPT42GnxSrE1JQDFQSp04tGu_L02LcqHWInhI,62873
@@ -34,7 +34,7 @@ ccxt/bl3p.py,sha256=acdOKkTdRhw-xZCxetX_m_yFQZGK4o154np9TcIv9E4,16070
34
34
  ccxt/blockchaincom.py,sha256=IcWTOgO3kCltoMPdBj_ZcKOCGaHUDlbo7NE9MJWj5Eo,46632
35
35
  ccxt/btcalpha.py,sha256=Qtu0ZBYCsJfZPp6fyCGuesq4-YeHFP-XfyuHlGwTNlA,34666
36
36
  ccxt/btcbox.py,sha256=0URf87IdA9Pr84WyTdozuvkG-LM6S_5gE0nmK8Soy08,22169
37
- ccxt/btcex.py,sha256=HbjIFK6QD-uLYmQgD7izF-a7_71MEB-98Qu1MwjPVEw,109580
37
+ ccxt/btcex.py,sha256=juePyEUEB_XQHEjObpfekSQXp7LO69mG2e-ME0S5DHY,110055
38
38
  ccxt/btcmarkets.py,sha256=trlczer8FfF-G8goHx7JGL69t4dKEicqN1s3vTPkLNc,48035
39
39
  ccxt/btctradeua.py,sha256=eyflzEU3iWPLTnc2Rlpwztj3mrhfl4CeMB4kDpvCnfk,21661
40
40
  ccxt/btcturk.py,sha256=nCpy58mPkvJexbFgYpBVTK42r0KbBPzMVYDR4LQMujY,34977
@@ -58,7 +58,7 @@ ccxt/digifinex.py,sha256=LBx3ocJrcfGFjp-R0oPr1q_9ZVuxeKvVJqrW3QNv5Qo,151213
58
58
  ccxt/exmo.py,sha256=GS5h7TgVAMp_qGIx-OTvmbEcsDse9DasclVb1HtwMHo,87997
59
59
  ccxt/flowbtc.py,sha256=YPvm6tbsHJJUQBspFcHuVPQfVmiWzwnVvfzRqBdQX6U,1169
60
60
  ccxt/fmfwio.py,sha256=9yqAG-NvgAny6NE08VOh_FQe_RylCaD5uF0d5t_0f44,1180
61
- ccxt/gate.py,sha256=UbVdjAojTxehZkZNOOd3LZgwFj2LGd2iqwjEdBTqHnY,217481
61
+ ccxt/gate.py,sha256=rptiRa6SW3ogqpf6J5h13p_MwFyYD9FJpNDnyZP9B5g,218659
62
62
  ccxt/gateio.py,sha256=GgoKg6c0l1Wndp_GRw76jmW-HvKE5Gr7FvyTVdPmHJU,387
63
63
  ccxt/gemini.py,sha256=j3_9NMjmHFXcODAGQA0sSjsc0Qu2roycW-R8c2-ZXNc,68600
64
64
  ccxt/hitbtc.py,sha256=Rf2CUROSy8fyV9HBFToJrlUY3rGXCHe34_sBmSYVJFQ,61602
@@ -90,7 +90,7 @@ ccxt/oceanex.py,sha256=WMk7FhhrdVmRtBLGzod04qIHOsdvbxfuYqVLIXxxSLc,36733
90
90
  ccxt/okcoin.py,sha256=JLud4dZXKJ2aOXxCM-HQ778WnBYafu6ESfifOKrlBMo,177429
91
91
  ccxt/okex.py,sha256=yVJP17cwsKQy1wuLljWL9dTiPQIP6UdMj7AnMSV2PL8,378
92
92
  ccxt/okex5.py,sha256=O7oiOpzvw_K7bO3evsceKI-zItrXr5StA07DGMt2Hoo,384
93
- ccxt/okx.py,sha256=43umPIFTQbWm-Dm4pplclxsmtzx88tS1U0p0ZsoUtgo,259305
93
+ ccxt/okx.py,sha256=BBYeeqhB-l_IQj7M3fshQX9B5Rj7qTJYdFRSK8F77nw,259632
94
94
  ccxt/paymium.py,sha256=tFKD930DyU2dhQBCpQKbPIoh2cdxSTflfRW-xEGRrBE,22543
95
95
  ccxt/phemex.py,sha256=jgjtgNjYT_3i8acScrkaStCKrF33Kvoa5YvIN2WmEv8,182787
96
96
  ccxt/poloniex.py,sha256=dBA23y-Bstpi5CVlXtCrgbM1BWsROm6ZP5kLH-Uaf-Q,83276
@@ -110,7 +110,7 @@ ccxt/yobit.py,sha256=XSwUxMPj7615KMSJ0uO_6r_XC86PVI9JmoFW7Sa5rhQ,50480
110
110
  ccxt/zaif.py,sha256=amUZYqnOc_YQHoEHYmXQDAuprZX9IiLwIVQELrM4EdY,27619
111
111
  ccxt/zb.py,sha256=ET77-_n6472ce0w2rEvmm9yaxTaH3fsXHoVn58i-tEA,183164
112
112
  ccxt/zonda.py,sha256=BgryogRDDWndzXIhzUCVmDp-Z-4NStgUQ52KveQ3F_k,72727
113
- ccxt/async_support/__init__.py,sha256=9UU62Vohri9uALa0PILTc3-ZMhHlDdDnZSuQ-R52vpk,15745
113
+ ccxt/async_support/__init__.py,sha256=SYzqUkfg6wD4NEKTZL3S9g0u6cCbAdV3nQSBbR7M_vE,15745
114
114
  ccxt/async_support/ace.py,sha256=KBkF9jOtfuexziucqdz9hVQ8EQDYEaHAnF7qpb3sUT8,41239
115
115
  ccxt/async_support/alpaca.py,sha256=4vMmD34LgVuwoWN4AK_2Wt12dL5KA3uwGJKQuzG6sAg,33056
116
116
  ccxt/async_support/ascendex.py,sha256=epuquvLlW0vwcjs46tlMTuRf2kAP3rqzCqUMg9IDppw,126460
@@ -129,8 +129,8 @@ ccxt/async_support/bitfinex.py,sha256=x0CdZB3ygOoaFPungaI8bOH6QoNOG116UIsHUG-T7w
129
129
  ccxt/async_support/bitfinex2.py,sha256=lJoVtHMOEliF8cVvAw8uEx4Z6Aj8O4TRhBE1lDZQ5WE,111643
130
130
  ccxt/async_support/bitflyer.py,sha256=_5E8RTxzK-Cw1VUP_8wiwHegltIzVCKIQyPCvlEi9jc,37643
131
131
  ccxt/async_support/bitforex.py,sha256=YiF2LdoCa6Hsrzz-aQGppTKxuw1EUEuE6FoZ2iJqD94,28163
132
- ccxt/async_support/bitget.py,sha256=KgVCKLeW8WXdb7WR1thiDay8f_0_a-UU_ExAy8yG44k,199184
133
- ccxt/async_support/bithumb.py,sha256=NOoyIQAoY0vUrStSb_7XcVFT5NutskT2ciAYu88AW5M,42125
132
+ ccxt/async_support/bitget.py,sha256=h38SCFGrkdsXwWkTJDRCMmnRVrXS90E9WhGJgfc2sTY,199204
133
+ ccxt/async_support/bithumb.py,sha256=Pc0N0QMcuuKcqAK4tyCkVyCFExghoOicPldJY6tT6Sg,42472
134
134
  ccxt/async_support/bitmart.py,sha256=saATo-m7e4WVVZJoRP1wlKdsMwDbXTdRVcy-Il5096w,130101
135
135
  ccxt/async_support/bitmex.py,sha256=SFOTkVUO61cfQSEnnKystwIULFvZ6MUb6LyyjcZ7j0I,118708
136
136
  ccxt/async_support/bitopro.py,sha256=EJOBphHIPKS91D4dY8-w69r3vWCatUFndBE1X8t3fSw,63241
@@ -146,7 +146,7 @@ ccxt/async_support/bl3p.py,sha256=Lsargo-0A-EryC9tu9O59uxcds-p31aGIKBE575Psmk,16
146
146
  ccxt/async_support/blockchaincom.py,sha256=BfeCR1h9KURIW9vEjiawXDDrHBe-t72XJ5ymcwsXKL4,47060
147
147
  ccxt/async_support/btcalpha.py,sha256=M7EGVVsdAHPXE7u8--RM2UQ3m9G134MvLdi8HIDDGq4,34944
148
148
  ccxt/async_support/btcbox.py,sha256=ej6RzOaIfNbfJ71RyaeBQenz2OUcaW5VzdmpqhJ0TIE,22363
149
- ccxt/async_support/btcex.py,sha256=rstr4ZXdz46PUOmBdaIz_ct2P2bKivPZgvkOYG8s0gk,110206
149
+ ccxt/async_support/btcex.py,sha256=l-lEw-EQInMN6EGKkVkyqyOsNFPPW1odOTjfLZ60WwA,110681
150
150
  ccxt/async_support/btcmarkets.py,sha256=mqB-YZnh_ZRK9PwpvAcp579Cj6Ul_A3d3AIEOtGmFjQ,48385
151
151
  ccxt/async_support/btctradeua.py,sha256=B5OlisST-2mpE_r8svLfxqj4LWZ1EMyaAMcOb971cg0,21807
152
152
  ccxt/async_support/btcturk.py,sha256=jhTw3LqZNdkfnBcF-3nJubvMKdr_nICJ_-u2qFy9UyM,35195
@@ -170,7 +170,7 @@ ccxt/async_support/digifinex.py,sha256=mwWtWNiYPYvbtlT2Vw0IxhvYaajI3lKdhWV3-a_84
170
170
  ccxt/async_support/exmo.py,sha256=A_9XE1aA2Ch2yMtyJGctVnCrsTCXYAeUsB8eNJXrN_g,88539
171
171
  ccxt/async_support/flowbtc.py,sha256=bCnvtcNnPxxaxqVjI1GGXKhIpz_1r4GIFWqqPokvCR0,1183
172
172
  ccxt/async_support/fmfwio.py,sha256=8ag6QCIc8UV5eE3BpSc5mFP2nuJR2Wu2wGyOGKFej2g,1194
173
- ccxt/async_support/gate.py,sha256=wpXot7fOpDGPdB0PPnrf0PflbZZ5VhyllI9yArub8cg,218335
173
+ ccxt/async_support/gate.py,sha256=PyzbsNpBrs6-90hj8W__3VIAJZN-AOPY3rkKp6tw17E,219513
174
174
  ccxt/async_support/gateio.py,sha256=89g56dHNlw5e8yaAbwnoxoxufj9JP1ksiz9dgyP8VuQ,401
175
175
  ccxt/async_support/gemini.py,sha256=wGZfJYRBHjil5ag5xO6_1y2m6EMDD0cbee7q3on0OKU,69076
176
176
  ccxt/async_support/hitbtc.py,sha256=gO4SYBdjSFXZoLX0dkCFzSgPMc7vrLunQRvlzqK4lco,62036
@@ -202,7 +202,7 @@ ccxt/async_support/oceanex.py,sha256=J3DbqR42xMvrDk9GMAP9ngYqLV_VsDz0IESJE3S0iNo
202
202
  ccxt/async_support/okcoin.py,sha256=861qonrLRM8QnDgglCEk8h75gQMxxIuLtiBIkPXn_tA,177893
203
203
  ccxt/async_support/okex.py,sha256=6pyaxRyqPd4-BF_7xAGE965VD233eihKZBq6l3KgZtM,392
204
204
  ccxt/async_support/okex5.py,sha256=A3NMLSKaCaMcZptkv3WsLju3xSLAnTAo8-NMueRfH5E,398
205
- ccxt/async_support/okx.py,sha256=PxUzgUzXEgFvRr8wfHUNGMP5tAOYL31wVg7D7LHhrPI,260327
205
+ ccxt/async_support/okx.py,sha256=2zmtStg4eQTnKesSmM27SBatKd7jHpgMQs14UdQQcmE,260660
206
206
  ccxt/async_support/paymium.py,sha256=jr7ezlYsxIRh-pT7Eu0N3NsS9-hv845oGQoHyrhKS7A,22731
207
207
  ccxt/async_support/phemex.py,sha256=QRUMAQmzgsz7bgFTEatJKiuTEuU8ymY234N0IOdK2XA,183323
208
208
  ccxt/async_support/poloniex.py,sha256=NnZzjR1aJ5gmZMEDhlYIfTfS5jV04IQjMsJcGUraDv0,83776
@@ -223,14 +223,14 @@ ccxt/async_support/zaif.py,sha256=pU8VIbfzoal-aYYOwXjCJom1wv39QQHp2QWVmf7v5uI,27
223
223
  ccxt/async_support/zb.py,sha256=f91YoThqWGOyYl_ywW2x6pw_LQABGS8_4DczWAQKLpU,183868
224
224
  ccxt/async_support/zonda.py,sha256=9pqglR6VBN-iqEYj7CBIZC-96tl05WFrkLf_5csxPVk,73017
225
225
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
226
- ccxt/async_support/base/exchange.py,sha256=qYRgVlgf-5NIE9ALsOU8pNhGUWrV0-F6spJeUkdkx10,108018
226
+ ccxt/async_support/base/exchange.py,sha256=I6VBnPvjTQ_QJcy16Db8jRvvr1FEuOF-soZ8eTzEs2Y,108097
227
227
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
228
228
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
229
229
  ccxt/base/decimal_to_precision.py,sha256=FG3IBmZKwWPg7Kj2mgCX7txELUEhfgfmnxrbKwVVtok,6531
230
230
  ccxt/base/errors.py,sha256=-LVeTNyXvu3QEgb-p-KzMpcBgzHlvFTwDzmZK7Gfc14,3401
231
- ccxt/base/exchange.py,sha256=yKBWxHRrBo3_zRNSPgenOR9shh4PF9XHk_BuUGHinqg,163470
231
+ ccxt/base/exchange.py,sha256=uNhb-ApI9e1tVYRdEpstS1Xh78O7kstgm4cN4rr0zHU,163549
232
232
  ccxt/base/precise.py,sha256=_xfu54sV0vWNnOfGTKRFykeuWP8mn4K1m9lk1tcllX4,8565
233
- ccxt/pro/__init__.py,sha256=I-9b68J4M516pejm9p_WnLUbpge4HbrsQ3eYbsKV31o,5946
233
+ ccxt/pro/__init__.py,sha256=11yhyUIBbi2pN1ATXUX2NOkFQQb-o1q2z2AMztFSr_0,5946
234
234
  ccxt/pro/alpaca.py,sha256=7o59h7qBbF9U1_jVBFVlGvstywQOh_dkfV4yqXuspgo,26426
235
235
  ccxt/pro/ascendex.py,sha256=UikwO6-yiSfIV-OImOOIZ2xO_zanAB49VDQsoDN6Q5M,34311
236
236
  ccxt/pro/bequant.py,sha256=qz8JjnpkAQY_CFiFSKGqrjjgZ2167_TBKjSJOb9NeDw,1081
@@ -264,8 +264,8 @@ ccxt/pro/gateio.py,sha256=_uBWXYQbmsHRivKnZOJDmxJ9tWLO_0HAxmOjAEUy9nE,391
264
264
  ccxt/pro/gemini.py,sha256=lYy57_MclS6WM2wfSUgsrP5Dn9p_ryC_IP4HA8fDAko,24937
265
265
  ccxt/pro/hitbtc.py,sha256=VCBZ6Mj-EavScBP7KRcSjMS0OZoRwFR5Goydgpa6qgw,15011
266
266
  ccxt/pro/hollaex.py,sha256=x58RgiJEMq3m0Y-WCwSZW7B-ADBQRFMAjMHFbJLpZp8,21559
267
- ccxt/pro/huobi.py,sha256=oIctnPs_eQ8tSmVF8xXNRiI8KEPRxyHT5pXw7pewA7k,84955
268
- ccxt/pro/huobijp.py,sha256=aOqSAN-ZehqPnWgZiTd2BBthvQET41VsecfHkVimEBo,22256
267
+ ccxt/pro/huobi.py,sha256=fgmvEjqp1nA-9krGdwB29rGCOuiCHiaHPh7fnEGEXQk,85187
268
+ ccxt/pro/huobijp.py,sha256=eD7yfA3wyR2Rf_kkeQN-cZMtz8tmbnLy-UktCvH-vck,22484
269
269
  ccxt/pro/huobipro.py,sha256=JqLbm74WLluxAjWDAGGwY4bx8_ShCwOOqQ0476LfnHs,400
270
270
  ccxt/pro/idex.py,sha256=E6o-vtvsbi6ja4egTxe6QBARNTD5npx_4eqEGkkfqN0,27750
271
271
  ccxt/pro/independentreserve.py,sha256=n0u0Fxfo21keguFqxf1ikqSLsrLWFEJ0c0kM7RXOfAM,10940
@@ -289,7 +289,7 @@ ccxt/pro/base/__init__.py,sha256=XscxcHui5I8za8dAzz0O3J-UeyxGkUEXlErAaBWHCjY,184
289
289
  ccxt/pro/base/aiohttp_client.py,sha256=wd0ae_KYgQ3gqYgj7uYeJcDPfJWzxMKUQsxs8ZZcTr4,4961
290
290
  ccxt/pro/base/cache.py,sha256=r9l1tEvR3sfN4Joqj6bPBRS0Xrg7mjAFjTDW4QBMozY,6085
291
291
  ccxt/pro/base/client.py,sha256=XvQt-puPiGBXYw1s9nFXj_xXRNkDxc8hF5kvQBVwBnk,7270
292
- ccxt/pro/base/exchange.py,sha256=-_LI8kzBqaqTOmztcFWIOmeeF76xQcICCpTtvRR0Jm0,8212
292
+ ccxt/pro/base/exchange.py,sha256=OlPgFPNw_iDOvpbi8T-lnromq_lhv7NSUHfjo2YLlrE,8212
293
293
  ccxt/pro/base/fast_client.py,sha256=NCAHUS35OzhsPve2owVLzM9BmM7cTsYcNFEJBw1UESU,3245
294
294
  ccxt/pro/base/functions.py,sha256=vf2FUrlCak5Tf5a6-vbTtmtzHzbXi0nECRygTmNhxFw,1495
295
295
  ccxt/pro/base/future.py,sha256=hcvcH5rUP4Jn7qbQwx19P4ItM1DWZU2vvRS8Ob6MIDU,249
@@ -326,7 +326,7 @@ ccxt/test/test_sync.py,sha256=omZA0xK_2nl58Gwoz65Oi4xRN4uLyuZ0AWZwf2Eqa9w,22795
326
326
  ccxt/test/test_throttle.py,sha256=GvLQWtA4fAk_yJrxeisek-wAz7eJdHj0DDKR4_V1beg,3123
327
327
  ccxt/test/test_trade.py,sha256=-pw3gxe26wozFeN_Vy4zWNUQr0fSXOg3FRu-gVvOrqE,3243
328
328
  ccxt/test/test_transaction.py,sha256=IlyTFDWDwGUGzk94yx6vLaJy9zyCRlhEVigXE6hDd40,1514
329
- ccxt-2.9.7.dist-info/METADATA,sha256=k_2WdAhCDRhroE0aWvNMS26VoRvQrQLEkpy2hWFnQJQ,110825
330
- ccxt-2.9.7.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
331
- ccxt-2.9.7.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
332
- ccxt-2.9.7.dist-info/RECORD,,
329
+ ccxt-2.9.9.dist-info/METADATA,sha256=2-klFi1hlyOPzqH4JM50fO_4nfOJ_Evdxm_Cz4Cv_g0,110825
330
+ ccxt-2.9.9.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
331
+ ccxt-2.9.9.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
332
+ ccxt-2.9.9.dist-info/RECORD,,
File without changes