ccxt 4.2.78__py2.py3-none-any.whl → 4.2.79__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ccxt/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.2.78'
25
+ __version__ = '4.2.79'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
ccxt/abstract/bingx.py CHANGED
@@ -32,6 +32,7 @@ class ImplicitAPI:
32
32
  swap_v1_private_get_trade_batchcancelreplace = swapV1PrivateGetTradeBatchCancelReplace = Entry('trade/batchCancelReplace', ['swap', 'v1', 'private'], 'GET', {'cost': 1})
33
33
  swap_v1_private_post_trade_cancelreplace = swapV1PrivatePostTradeCancelReplace = Entry('trade/cancelReplace', ['swap', 'v1', 'private'], 'POST', {'cost': 1})
34
34
  swap_v1_private_post_positionside_dual = swapV1PrivatePostPositionSideDual = Entry('positionSide/dual', ['swap', 'v1', 'private'], 'POST', {'cost': 1})
35
+ swap_v1_private_post_trade_closeposition = swapV1PrivatePostTradeClosePosition = Entry('trade/closePosition', ['swap', 'v1', 'private'], 'POST', {'cost': 1})
35
36
  swap_v2_public_get_server_time = swapV2PublicGetServerTime = Entry('server/time', ['swap', 'v2', 'public'], 'GET', {'cost': 3})
36
37
  swap_v2_public_get_quote_contracts = swapV2PublicGetQuoteContracts = Entry('quote/contracts', ['swap', 'v2', 'public'], 'GET', {'cost': 1})
37
38
  swap_v2_public_get_quote_price = swapV2PublicGetQuotePrice = Entry('quote/price', ['swap', 'v2', 'public'], 'GET', {'cost': 1})
ccxt/abstract/gate.py CHANGED
@@ -91,6 +91,7 @@ class ImplicitAPI:
91
91
  private_unified_get_loan_records = privateUnifiedGetLoanRecords = Entry('loan_records', ['private', 'unified'], 'GET', {'cost': 1.3333333333333333})
92
92
  private_unified_get_interest_records = privateUnifiedGetInterestRecords = Entry('interest_records', ['private', 'unified'], 'GET', {'cost': 1.3333333333333333})
93
93
  private_unified_get_estimate_rate = privateUnifiedGetEstimateRate = Entry('estimate_rate', ['private', 'unified'], 'GET', {'cost': 1.3333333333333333})
94
+ private_unified_get_currency_discount_tiers = privateUnifiedGetCurrencyDiscountTiers = Entry('currency_discount_tiers', ['private', 'unified'], 'GET', {'cost': 1.3333333333333333})
94
95
  private_unified_post_account_mode = privateUnifiedPostAccountMode = Entry('account_mode', ['private', 'unified'], 'POST', {'cost': 1.3333333333333333})
95
96
  private_unified_post_loans = privateUnifiedPostLoans = Entry('loans', ['private', 'unified'], 'POST', {'cost': 13.333333333333334})
96
97
  private_spot_get_fee = privateSpotGetFee = Entry('fee', ['private', 'spot'], 'GET', {'cost': 1})
ccxt/abstract/gateio.py CHANGED
@@ -91,6 +91,7 @@ class ImplicitAPI:
91
91
  private_unified_get_loan_records = privateUnifiedGetLoanRecords = Entry('loan_records', ['private', 'unified'], 'GET', {'cost': 1.3333333333333333})
92
92
  private_unified_get_interest_records = privateUnifiedGetInterestRecords = Entry('interest_records', ['private', 'unified'], 'GET', {'cost': 1.3333333333333333})
93
93
  private_unified_get_estimate_rate = privateUnifiedGetEstimateRate = Entry('estimate_rate', ['private', 'unified'], 'GET', {'cost': 1.3333333333333333})
94
+ private_unified_get_currency_discount_tiers = privateUnifiedGetCurrencyDiscountTiers = Entry('currency_discount_tiers', ['private', 'unified'], 'GET', {'cost': 1.3333333333333333})
94
95
  private_unified_post_account_mode = privateUnifiedPostAccountMode = Entry('account_mode', ['private', 'unified'], 'POST', {'cost': 1.3333333333333333})
95
96
  private_unified_post_loans = privateUnifiedPostLoans = Entry('loans', ['private', 'unified'], 'POST', {'cost': 13.333333333333334})
96
97
  private_spot_get_fee = privateSpotGetFee = Entry('fee', ['private', 'spot'], 'GET', {'cost': 1})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.78'
7
+ __version__ = '4.2.79'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.2.78'
5
+ __version__ = '4.2.79'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -34,7 +34,7 @@ def iso8601(timestamp=None):
34
34
  if int(timestamp) < 0:
35
35
  return None
36
36
  try:
37
- utc = datetime.datetime.utcfromtimestamp(timestamp // 1000)
37
+ utc = datetime.datetime.fromtimestamp(timestamp // 1000, datetime.timezone.utc)
38
38
  return utc.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-6] + "{:03d}".format(int(timestamp) % 1000) + 'Z'
39
39
  except (TypeError, OverflowError, OSError):
40
40
  return None
@@ -196,6 +196,7 @@ class bingx(Exchange, ImplicitAPI):
196
196
  'post': {
197
197
  'trade/cancelReplace': 1,
198
198
  'positionSide/dual': 1,
199
+ 'trade/closePosition': 1,
199
200
  },
200
201
  },
201
202
  },
@@ -2032,6 +2033,8 @@ class bingx(Exchange, ImplicitAPI):
2032
2033
  'SELL': 'sell',
2033
2034
  'SHORT': 'sell',
2034
2035
  'LONG': 'buy',
2036
+ 'ask': 'sell',
2037
+ 'bid': 'buy',
2035
2038
  }
2036
2039
  return self.safe_string(sides, side, side)
2037
2040
 
@@ -3656,14 +3659,43 @@ class bingx(Exchange, ImplicitAPI):
3656
3659
  :param str symbol: Unified CCXT market symbol
3657
3660
  :param str [side]: not used by bingx
3658
3661
  :param dict [params]: extra parameters specific to the bingx api endpoint
3662
+ :param str|None [params.positionId]: it is recommended to hasattr(self, fill) parameter when closing a position
3659
3663
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
3660
3664
  """
3661
3665
  await self.load_markets()
3662
- market = self.market(symbol)
3663
- request: dict = {
3664
- 'symbol': market['id'],
3665
- }
3666
- response = await self.swapV2PrivatePostTradeCloseAllPositions(self.extend(request, params))
3666
+ positionId = self.safe_string(params, 'positionId')
3667
+ params = self.omit(params, 'positionId')
3668
+ response = None
3669
+ if positionId is not None:
3670
+ request: dict = {
3671
+ 'positionId': positionId,
3672
+ }
3673
+ response = await self.swapV1PrivatePostTradeClosePosition(self.extend(request, params))
3674
+ else:
3675
+ market = self.market(symbol)
3676
+ request: dict = {
3677
+ 'symbol': market['id'],
3678
+ }
3679
+ response = await self.swapV2PrivatePostTradeCloseAllPositions(self.extend(request, params))
3680
+ #
3681
+ # swapV1PrivatePostTradeClosePosition
3682
+ #
3683
+ # {
3684
+ # "code": 0,
3685
+ # "msg": "",
3686
+ # "timestamp": 1710992264190,
3687
+ # "data": {
3688
+ # "orderId": 1770656007907930112,
3689
+ # "positionId": "1751667128353910784",
3690
+ # "symbol": "LTC-USDT",
3691
+ # "side": "Ask",
3692
+ # "type": "MARKET",
3693
+ # "positionSide": "Long",
3694
+ # "origQty": "0.2"
3695
+ # }
3696
+ # }
3697
+ #
3698
+ # swapV2PrivatePostTradeCloseAllPositions
3667
3699
  #
3668
3700
  # {
3669
3701
  # "code": 0,
@@ -1082,16 +1082,17 @@ class bitstamp(Exchange, ImplicitAPI):
1082
1082
  'timestamp': None,
1083
1083
  'datetime': None,
1084
1084
  }
1085
- codes = list(self.currencies.keys())
1086
- for i in range(0, len(codes)):
1087
- code = codes[i]
1088
- currency = self.currency(code)
1089
- currencyId = currency['id']
1085
+ if response is None:
1086
+ response = []
1087
+ for i in range(0, len(response)):
1088
+ currencyBalance = response[i]
1089
+ currencyId = self.safe_string(currencyBalance, 'currency')
1090
+ currencyCode = self.safe_currency_code(currencyId)
1090
1091
  account = self.account()
1091
- account['free'] = self.safe_string(response, currencyId + '_available')
1092
- account['used'] = self.safe_string(response, currencyId + '_reserved')
1093
- account['total'] = self.safe_string(response, currencyId + '_balance')
1094
- result[code] = account
1092
+ account['free'] = self.safe_string(currencyBalance, 'available')
1093
+ account['used'] = self.safe_string(currencyBalance, 'reserved')
1094
+ account['total'] = self.safe_string(currencyBalance, 'total')
1095
+ result[currencyCode] = account
1095
1096
  return self.safe_balance(result)
1096
1097
 
1097
1098
  async def fetch_balance(self, params={}) -> Balances:
@@ -1102,24 +1103,17 @@ class bitstamp(Exchange, ImplicitAPI):
1102
1103
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
1103
1104
  """
1104
1105
  await self.load_markets()
1105
- response = await self.privatePostBalance(params)
1106
+ response = await self.privatePostAccountBalances(params)
1106
1107
  #
1107
- # {
1108
- # "aave_available": "0.00000000",
1109
- # "aave_balance": "0.00000000",
1110
- # "aave_reserved": "0.00000000",
1111
- # "aave_withdrawal_fee": "0.07000000",
1112
- # "aavebtc_fee": "0.000",
1113
- # "aaveeur_fee": "0.000",
1114
- # "aaveusd_fee": "0.000",
1115
- # "bat_available": "0.00000000",
1116
- # "bat_balance": "0.00000000",
1117
- # "bat_reserved": "0.00000000",
1118
- # "bat_withdrawal_fee": "5.00000000",
1119
- # "batbtc_fee": "0.000",
1120
- # "bateur_fee": "0.000",
1121
- # "batusd_fee": "0.000",
1122
- # }
1108
+ # [
1109
+ # {
1110
+ # "currency": "usdt",
1111
+ # "total": "7.00000",
1112
+ # "available": "7.00000",
1113
+ # "reserved": "0.00000"
1114
+ # },
1115
+ # ...
1116
+ # ]
1123
1117
  #
1124
1118
  return self.parse_balance(response)
1125
1119
 
@@ -85,6 +85,7 @@ class bybit(Exchange, ImplicitAPI):
85
85
  'fetchDeposits': True,
86
86
  'fetchDepositWithdrawFee': 'emulated',
87
87
  'fetchDepositWithdrawFees': True,
88
+ 'fetchFundingHistory': True,
88
89
  'fetchFundingRate': True, # emulated in exchange
89
90
  'fetchFundingRateHistory': True,
90
91
  'fetchFundingRates': True,
@@ -7540,6 +7541,97 @@ class bybit(Exchange, ImplicitAPI):
7540
7541
  })
7541
7542
  return tiers
7542
7543
 
7544
+ async def fetch_funding_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
7545
+ """
7546
+ fetch the history of funding payments paid and received on self account
7547
+ :see: https://bybit-exchange.github.io/docs/api-explorer/v5/position/execution
7548
+ :param str [symbol]: unified market symbol
7549
+ :param int [since]: the earliest time in ms to fetch funding history for
7550
+ :param int [limit]: the maximum number of funding history structures to retrieve
7551
+ :param dict [params]: extra parameters specific to the exchange API endpoint
7552
+ :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
7553
+ :returns dict: a `funding history structure <https://docs.ccxt.com/#/?id=funding-history-structure>`
7554
+ """
7555
+ await self.load_markets()
7556
+ paginate = False
7557
+ paginate, params = self.handle_option_and_params(params, 'fetchFundingHistory', 'paginate')
7558
+ if paginate:
7559
+ return await self.fetch_paginated_call_cursor('fetchFundingHistory', symbol, since, limit, params, 'nextPageCursor', 'cursor', None, 100)
7560
+ request = {
7561
+ 'execType': 'Funding',
7562
+ }
7563
+ market: Market = None
7564
+ if symbol is not None:
7565
+ market = self.market(symbol)
7566
+ request['symbol'] = market['id']
7567
+ type = None
7568
+ type, params = self.get_bybit_type('fetchFundingHistory', market, params)
7569
+ request['category'] = type
7570
+ if symbol is not None:
7571
+ request['symbol'] = market['id']
7572
+ if since is not None:
7573
+ request['startTime'] = since
7574
+ if limit is not None:
7575
+ request['size'] = limit
7576
+ else:
7577
+ request['size'] = 100
7578
+ request, params = self.handle_until_option('endTime', request, params)
7579
+ response = await self.privateGetV5ExecutionList(self.extend(request, params))
7580
+ fundings = self.add_pagination_cursor_to_result(response)
7581
+ return self.parse_incomes(fundings, market, since, limit)
7582
+
7583
+ def parse_income(self, income, market: Market = None):
7584
+ #
7585
+ # {
7586
+ # "symbol": "XMRUSDT",
7587
+ # "orderType": "UNKNOWN",
7588
+ # "underlyingPrice": "",
7589
+ # "orderLinkId": "",
7590
+ # "orderId": "a11e5fe2-1dbf-4bab-a9b2-af80a14efc5d",
7591
+ # "stopOrderType": "UNKNOWN",
7592
+ # "execTime": "1710950400000",
7593
+ # "feeCurrency": "",
7594
+ # "createType": "",
7595
+ # "feeRate": "-0.000761",
7596
+ # "tradeIv": "",
7597
+ # "blockTradeId": "",
7598
+ # "markPrice": "136.79",
7599
+ # "execPrice": "137.11",
7600
+ # "markIv": "",
7601
+ # "orderQty": "0",
7602
+ # "orderPrice": "0",
7603
+ # "execValue": "134.3678",
7604
+ # "closedSize": "0",
7605
+ # "execType": "Funding",
7606
+ # "seq": "28097658790",
7607
+ # "side": "Sell",
7608
+ # "indexPrice": "",
7609
+ # "leavesQty": "0",
7610
+ # "isMaker": False,
7611
+ # "execFee": "-0.10232512",
7612
+ # "execId": "8d1ef156-4ec6-4445-9a6c-1c0c24dbd046",
7613
+ # "marketUnit": "",
7614
+ # "execQty": "0.98",
7615
+ # "nextPageCursor": "5774437%3A0%2C5771289%3A0"
7616
+ # }
7617
+ #
7618
+ marketId = self.safe_string(income, 'symbol')
7619
+ market = self.safe_market(marketId, market, None, 'contract')
7620
+ code = 'USDT'
7621
+ if market['inverse']:
7622
+ code = market['quote']
7623
+ timestamp = self.safe_integer(income, 'execTime')
7624
+ return {
7625
+ 'info': income,
7626
+ 'symbol': self.safe_symbol(marketId, market, '-', 'swap'),
7627
+ 'code': code,
7628
+ 'timestamp': timestamp,
7629
+ 'datetime': self.iso8601(timestamp),
7630
+ 'id': self.safe_string(income, 'execId'),
7631
+ 'amount': self.safe_number(income, 'execQty'),
7632
+ 'rate': self.safe_number(income, 'feeRate'),
7633
+ }
7634
+
7543
7635
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
7544
7636
  url = self.implode_hostname(self.urls['api'][api]) + '/' + path
7545
7637
  if api == 'public':
@@ -126,10 +126,10 @@ class coinbaseinternational(Exchange, ImplicitAPI):
126
126
  },
127
127
  'www': 'https://international.coinbase.com',
128
128
  'doc': [
129
- 'https://docs.cloud.coinbaseinternational.com/intx/docs',
129
+ 'https://docs.cloud.coinbase.com/intx/docs',
130
130
  ],
131
131
  'fees': [
132
- 'https://help.coinbaseinternational.com/en/international-exchange/trading-deposits-withdrawals/international-exchange-fees',
132
+ 'https://help.coinbase.com/en/international-exchange/trading-deposits-withdrawals/international-exchange-fees',
133
133
  ],
134
134
  'referral': '',
135
135
  },
@@ -329,6 +329,7 @@ class gate(Exchange, ImplicitAPI):
329
329
  'loan_records': 20 / 15,
330
330
  'interest_records': 20 / 15,
331
331
  'estimate_rate': 20 / 15,
332
+ 'currency_discount_tiers': 20 / 15,
332
333
  },
333
334
  'post': {
334
335
  'account_mode': 20 / 15,
@@ -3959,7 +3960,8 @@ class gate(Exchange, ImplicitAPI):
3959
3960
  'account': account,
3960
3961
  }
3961
3962
  if amount is not None:
3962
- request['amount'] = self.amount_to_precision(symbol, amount)
3963
+ amountKey = 'amount' if (market['spot']) else 'size'
3964
+ request[amountKey] = self.amount_to_precision(symbol, amount)
3963
3965
  if price is not None:
3964
3966
  request['price'] = self.price_to_precision(symbol, price)
3965
3967
  response = None
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.78'
7
+ __version__ = '4.2.79'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -1171,7 +1171,7 @@ class Exchange(object):
1171
1171
  return None
1172
1172
 
1173
1173
  try:
1174
- utc = datetime.datetime.utcfromtimestamp(timestamp // 1000)
1174
+ utc = datetime.datetime.fromtimestamp(timestamp // 1000, datetime.timezone.utc)
1175
1175
  return utc.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-6] + "{:03d}".format(int(timestamp) % 1000) + 'Z'
1176
1176
  except (TypeError, OverflowError, OSError):
1177
1177
  return None
@@ -1187,13 +1187,13 @@ class Exchange(object):
1187
1187
 
1188
1188
  @staticmethod
1189
1189
  def dmy(timestamp, infix='-'):
1190
- utc_datetime = datetime.datetime.utcfromtimestamp(int(round(timestamp / 1000)))
1190
+ utc_datetime = datetime.datetime.fromtimestamp(int(round(timestamp / 1000)), datetime.timezone.utc)
1191
1191
  return utc_datetime.strftime('%m' + infix + '%d' + infix + '%Y')
1192
1192
 
1193
1193
  @staticmethod
1194
1194
  def ymd(timestamp, infix='-', fullYear=True):
1195
1195
  year_format = '%Y' if fullYear else '%y'
1196
- utc_datetime = datetime.datetime.utcfromtimestamp(int(round(timestamp / 1000)))
1196
+ utc_datetime = datetime.datetime.fromtimestamp(int(round(timestamp / 1000)), datetime.timezone.utc)
1197
1197
  return utc_datetime.strftime(year_format + infix + '%m' + infix + '%d')
1198
1198
 
1199
1199
  @staticmethod
@@ -1206,7 +1206,7 @@ class Exchange(object):
1206
1206
 
1207
1207
  @staticmethod
1208
1208
  def ymdhms(timestamp, infix=' '):
1209
- utc_datetime = datetime.datetime.utcfromtimestamp(int(round(timestamp / 1000)))
1209
+ utc_datetime = datetime.datetime.fromtimestamp(int(round(timestamp / 1000)), datetime.timezone.utc)
1210
1210
  return utc_datetime.strftime('%Y-%m-%d' + infix + '%H:%M:%S')
1211
1211
 
1212
1212
  @staticmethod
ccxt/bingx.py CHANGED
@@ -195,6 +195,7 @@ class bingx(Exchange, ImplicitAPI):
195
195
  'post': {
196
196
  'trade/cancelReplace': 1,
197
197
  'positionSide/dual': 1,
198
+ 'trade/closePosition': 1,
198
199
  },
199
200
  },
200
201
  },
@@ -2031,6 +2032,8 @@ class bingx(Exchange, ImplicitAPI):
2031
2032
  'SELL': 'sell',
2032
2033
  'SHORT': 'sell',
2033
2034
  'LONG': 'buy',
2035
+ 'ask': 'sell',
2036
+ 'bid': 'buy',
2034
2037
  }
2035
2038
  return self.safe_string(sides, side, side)
2036
2039
 
@@ -3655,14 +3658,43 @@ class bingx(Exchange, ImplicitAPI):
3655
3658
  :param str symbol: Unified CCXT market symbol
3656
3659
  :param str [side]: not used by bingx
3657
3660
  :param dict [params]: extra parameters specific to the bingx api endpoint
3661
+ :param str|None [params.positionId]: it is recommended to hasattr(self, fill) parameter when closing a position
3658
3662
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
3659
3663
  """
3660
3664
  self.load_markets()
3661
- market = self.market(symbol)
3662
- request: dict = {
3663
- 'symbol': market['id'],
3664
- }
3665
- response = self.swapV2PrivatePostTradeCloseAllPositions(self.extend(request, params))
3665
+ positionId = self.safe_string(params, 'positionId')
3666
+ params = self.omit(params, 'positionId')
3667
+ response = None
3668
+ if positionId is not None:
3669
+ request: dict = {
3670
+ 'positionId': positionId,
3671
+ }
3672
+ response = self.swapV1PrivatePostTradeClosePosition(self.extend(request, params))
3673
+ else:
3674
+ market = self.market(symbol)
3675
+ request: dict = {
3676
+ 'symbol': market['id'],
3677
+ }
3678
+ response = self.swapV2PrivatePostTradeCloseAllPositions(self.extend(request, params))
3679
+ #
3680
+ # swapV1PrivatePostTradeClosePosition
3681
+ #
3682
+ # {
3683
+ # "code": 0,
3684
+ # "msg": "",
3685
+ # "timestamp": 1710992264190,
3686
+ # "data": {
3687
+ # "orderId": 1770656007907930112,
3688
+ # "positionId": "1751667128353910784",
3689
+ # "symbol": "LTC-USDT",
3690
+ # "side": "Ask",
3691
+ # "type": "MARKET",
3692
+ # "positionSide": "Long",
3693
+ # "origQty": "0.2"
3694
+ # }
3695
+ # }
3696
+ #
3697
+ # swapV2PrivatePostTradeCloseAllPositions
3666
3698
  #
3667
3699
  # {
3668
3700
  # "code": 0,
ccxt/bitstamp.py CHANGED
@@ -1082,16 +1082,17 @@ class bitstamp(Exchange, ImplicitAPI):
1082
1082
  'timestamp': None,
1083
1083
  'datetime': None,
1084
1084
  }
1085
- codes = list(self.currencies.keys())
1086
- for i in range(0, len(codes)):
1087
- code = codes[i]
1088
- currency = self.currency(code)
1089
- currencyId = currency['id']
1085
+ if response is None:
1086
+ response = []
1087
+ for i in range(0, len(response)):
1088
+ currencyBalance = response[i]
1089
+ currencyId = self.safe_string(currencyBalance, 'currency')
1090
+ currencyCode = self.safe_currency_code(currencyId)
1090
1091
  account = self.account()
1091
- account['free'] = self.safe_string(response, currencyId + '_available')
1092
- account['used'] = self.safe_string(response, currencyId + '_reserved')
1093
- account['total'] = self.safe_string(response, currencyId + '_balance')
1094
- result[code] = account
1092
+ account['free'] = self.safe_string(currencyBalance, 'available')
1093
+ account['used'] = self.safe_string(currencyBalance, 'reserved')
1094
+ account['total'] = self.safe_string(currencyBalance, 'total')
1095
+ result[currencyCode] = account
1095
1096
  return self.safe_balance(result)
1096
1097
 
1097
1098
  def fetch_balance(self, params={}) -> Balances:
@@ -1102,24 +1103,17 @@ class bitstamp(Exchange, ImplicitAPI):
1102
1103
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
1103
1104
  """
1104
1105
  self.load_markets()
1105
- response = self.privatePostBalance(params)
1106
+ response = self.privatePostAccountBalances(params)
1106
1107
  #
1107
- # {
1108
- # "aave_available": "0.00000000",
1109
- # "aave_balance": "0.00000000",
1110
- # "aave_reserved": "0.00000000",
1111
- # "aave_withdrawal_fee": "0.07000000",
1112
- # "aavebtc_fee": "0.000",
1113
- # "aaveeur_fee": "0.000",
1114
- # "aaveusd_fee": "0.000",
1115
- # "bat_available": "0.00000000",
1116
- # "bat_balance": "0.00000000",
1117
- # "bat_reserved": "0.00000000",
1118
- # "bat_withdrawal_fee": "5.00000000",
1119
- # "batbtc_fee": "0.000",
1120
- # "bateur_fee": "0.000",
1121
- # "batusd_fee": "0.000",
1122
- # }
1108
+ # [
1109
+ # {
1110
+ # "currency": "usdt",
1111
+ # "total": "7.00000",
1112
+ # "available": "7.00000",
1113
+ # "reserved": "0.00000"
1114
+ # },
1115
+ # ...
1116
+ # ]
1123
1117
  #
1124
1118
  return self.parse_balance(response)
1125
1119
 
ccxt/bybit.py CHANGED
@@ -84,6 +84,7 @@ class bybit(Exchange, ImplicitAPI):
84
84
  'fetchDeposits': True,
85
85
  'fetchDepositWithdrawFee': 'emulated',
86
86
  'fetchDepositWithdrawFees': True,
87
+ 'fetchFundingHistory': True,
87
88
  'fetchFundingRate': True, # emulated in exchange
88
89
  'fetchFundingRateHistory': True,
89
90
  'fetchFundingRates': True,
@@ -7539,6 +7540,97 @@ class bybit(Exchange, ImplicitAPI):
7539
7540
  })
7540
7541
  return tiers
7541
7542
 
7543
+ def fetch_funding_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
7544
+ """
7545
+ fetch the history of funding payments paid and received on self account
7546
+ :see: https://bybit-exchange.github.io/docs/api-explorer/v5/position/execution
7547
+ :param str [symbol]: unified market symbol
7548
+ :param int [since]: the earliest time in ms to fetch funding history for
7549
+ :param int [limit]: the maximum number of funding history structures to retrieve
7550
+ :param dict [params]: extra parameters specific to the exchange API endpoint
7551
+ :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
7552
+ :returns dict: a `funding history structure <https://docs.ccxt.com/#/?id=funding-history-structure>`
7553
+ """
7554
+ self.load_markets()
7555
+ paginate = False
7556
+ paginate, params = self.handle_option_and_params(params, 'fetchFundingHistory', 'paginate')
7557
+ if paginate:
7558
+ return self.fetch_paginated_call_cursor('fetchFundingHistory', symbol, since, limit, params, 'nextPageCursor', 'cursor', None, 100)
7559
+ request = {
7560
+ 'execType': 'Funding',
7561
+ }
7562
+ market: Market = None
7563
+ if symbol is not None:
7564
+ market = self.market(symbol)
7565
+ request['symbol'] = market['id']
7566
+ type = None
7567
+ type, params = self.get_bybit_type('fetchFundingHistory', market, params)
7568
+ request['category'] = type
7569
+ if symbol is not None:
7570
+ request['symbol'] = market['id']
7571
+ if since is not None:
7572
+ request['startTime'] = since
7573
+ if limit is not None:
7574
+ request['size'] = limit
7575
+ else:
7576
+ request['size'] = 100
7577
+ request, params = self.handle_until_option('endTime', request, params)
7578
+ response = self.privateGetV5ExecutionList(self.extend(request, params))
7579
+ fundings = self.add_pagination_cursor_to_result(response)
7580
+ return self.parse_incomes(fundings, market, since, limit)
7581
+
7582
+ def parse_income(self, income, market: Market = None):
7583
+ #
7584
+ # {
7585
+ # "symbol": "XMRUSDT",
7586
+ # "orderType": "UNKNOWN",
7587
+ # "underlyingPrice": "",
7588
+ # "orderLinkId": "",
7589
+ # "orderId": "a11e5fe2-1dbf-4bab-a9b2-af80a14efc5d",
7590
+ # "stopOrderType": "UNKNOWN",
7591
+ # "execTime": "1710950400000",
7592
+ # "feeCurrency": "",
7593
+ # "createType": "",
7594
+ # "feeRate": "-0.000761",
7595
+ # "tradeIv": "",
7596
+ # "blockTradeId": "",
7597
+ # "markPrice": "136.79",
7598
+ # "execPrice": "137.11",
7599
+ # "markIv": "",
7600
+ # "orderQty": "0",
7601
+ # "orderPrice": "0",
7602
+ # "execValue": "134.3678",
7603
+ # "closedSize": "0",
7604
+ # "execType": "Funding",
7605
+ # "seq": "28097658790",
7606
+ # "side": "Sell",
7607
+ # "indexPrice": "",
7608
+ # "leavesQty": "0",
7609
+ # "isMaker": False,
7610
+ # "execFee": "-0.10232512",
7611
+ # "execId": "8d1ef156-4ec6-4445-9a6c-1c0c24dbd046",
7612
+ # "marketUnit": "",
7613
+ # "execQty": "0.98",
7614
+ # "nextPageCursor": "5774437%3A0%2C5771289%3A0"
7615
+ # }
7616
+ #
7617
+ marketId = self.safe_string(income, 'symbol')
7618
+ market = self.safe_market(marketId, market, None, 'contract')
7619
+ code = 'USDT'
7620
+ if market['inverse']:
7621
+ code = market['quote']
7622
+ timestamp = self.safe_integer(income, 'execTime')
7623
+ return {
7624
+ 'info': income,
7625
+ 'symbol': self.safe_symbol(marketId, market, '-', 'swap'),
7626
+ 'code': code,
7627
+ 'timestamp': timestamp,
7628
+ 'datetime': self.iso8601(timestamp),
7629
+ 'id': self.safe_string(income, 'execId'),
7630
+ 'amount': self.safe_number(income, 'execQty'),
7631
+ 'rate': self.safe_number(income, 'feeRate'),
7632
+ }
7633
+
7542
7634
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
7543
7635
  url = self.implode_hostname(self.urls['api'][api]) + '/' + path
7544
7636
  if api == 'public':
@@ -126,10 +126,10 @@ class coinbaseinternational(Exchange, ImplicitAPI):
126
126
  },
127
127
  'www': 'https://international.coinbase.com',
128
128
  'doc': [
129
- 'https://docs.cloud.coinbaseinternational.com/intx/docs',
129
+ 'https://docs.cloud.coinbase.com/intx/docs',
130
130
  ],
131
131
  'fees': [
132
- 'https://help.coinbaseinternational.com/en/international-exchange/trading-deposits-withdrawals/international-exchange-fees',
132
+ 'https://help.coinbase.com/en/international-exchange/trading-deposits-withdrawals/international-exchange-fees',
133
133
  ],
134
134
  'referral': '',
135
135
  },
ccxt/gate.py CHANGED
@@ -328,6 +328,7 @@ class gate(Exchange, ImplicitAPI):
328
328
  'loan_records': 20 / 15,
329
329
  'interest_records': 20 / 15,
330
330
  'estimate_rate': 20 / 15,
331
+ 'currency_discount_tiers': 20 / 15,
331
332
  },
332
333
  'post': {
333
334
  'account_mode': 20 / 15,
@@ -3958,7 +3959,8 @@ class gate(Exchange, ImplicitAPI):
3958
3959
  'account': account,
3959
3960
  }
3960
3961
  if amount is not None:
3961
- request['amount'] = self.amount_to_precision(symbol, amount)
3962
+ amountKey = 'amount' if (market['spot']) else 'size'
3963
+ request[amountKey] = self.amount_to_precision(symbol, amount)
3962
3964
  if price is not None:
3963
3965
  request['price'] = self.price_to_precision(symbol, price)
3964
3966
  response = None
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.78'
7
+ __version__ = '4.2.79'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/alpaca.py CHANGED
@@ -562,7 +562,7 @@ class alpaca(ccxt.async_support.alpaca):
562
562
  },
563
563
  }
564
564
  self.watch(url, messageHash, request, messageHash, future)
565
- return future
565
+ return await future
566
566
 
567
567
  def handle_error_message(self, client: Client, message):
568
568
  #
ccxt/pro/bitfinex2.py CHANGED
@@ -812,7 +812,7 @@ class bitfinex2(ccxt.async_support.bitfinex2):
812
812
  }
813
813
  message = self.extend(request, params)
814
814
  self.watch(url, messageHash, message, messageHash)
815
- return future
815
+ return await future
816
816
 
817
817
  def handle_authentication_message(self, client: Client, message):
818
818
  messageHash = 'authenticated'
ccxt/pro/bitget.py CHANGED
@@ -1523,7 +1523,7 @@ class bitget(ccxt.async_support.bitget):
1523
1523
  }
1524
1524
  message = self.extend(request, params)
1525
1525
  self.watch(url, messageHash, message, messageHash)
1526
- return future
1526
+ return await future
1527
1527
 
1528
1528
  async def watch_private(self, messageHash, subscriptionHash, args, params={}):
1529
1529
  await self.authenticate()
ccxt/pro/bitmart.py CHANGED
@@ -1312,7 +1312,7 @@ class bitmart(ccxt.async_support.bitmart):
1312
1312
  }
1313
1313
  message = self.extend(request, params)
1314
1314
  self.watch(url, messageHash, message, messageHash)
1315
- return future
1315
+ return await future
1316
1316
 
1317
1317
  def handle_subscription_status(self, client: Client, message):
1318
1318
  #
ccxt/pro/bitmex.py CHANGED
@@ -599,7 +599,7 @@ class bitmex(ccxt.async_support.bitmex):
599
599
  }
600
600
  message = self.extend(request, params)
601
601
  self.watch(url, messageHash, message, messageHash)
602
- return future
602
+ return await future
603
603
 
604
604
  def handle_authentication_message(self, client: Client, message):
605
605
  authenticated = self.safe_bool(message, 'success', False)
ccxt/pro/blockchaincom.py CHANGED
@@ -735,4 +735,4 @@ class blockchaincom(ccxt.async_support.blockchaincom):
735
735
  'token': self.secret,
736
736
  }
737
737
  return self.watch(url, messageHash, self.extend(request, params), messageHash)
738
- return future
738
+ return await future
ccxt/pro/bybit.py CHANGED
@@ -974,8 +974,21 @@ class bybit(ccxt.async_support.bybit):
974
974
  for i in range(0, len(rawPositions)):
975
975
  rawPosition = rawPositions[i]
976
976
  position = self.parse_position(rawPosition)
977
+ side = self.safe_string(position, 'side')
978
+ # hacky solution to handle closing positions
979
+ # without crashing, we should handle self properly later
977
980
  newPositions.append(position)
978
- cache.append(position)
981
+ if side is None or side == '':
982
+ # closing update, adding both sides to "reset" both sides
983
+ # since we don't know which side is being closed
984
+ position['side'] = 'long'
985
+ cache.append(position)
986
+ position['side'] = 'short'
987
+ cache.append(position)
988
+ position['side'] = None
989
+ else:
990
+ # regular update
991
+ cache.append(position)
979
992
  messageHashes = self.find_message_hashes(client, 'positions::')
980
993
  for i in range(0, len(messageHashes)):
981
994
  messageHash = messageHashes[i]
ccxt/pro/cex.py CHANGED
@@ -157,16 +157,20 @@ class cex(ccxt.async_support.cex):
157
157
  # {
158
158
  # "e": "history",
159
159
  # "data": [
160
- # "sell:1665467367741:3888551:19058.8:14541219",
161
- # "buy:1665467367741:1059339:19071.5:14541218",
160
+ # 'buy:1710255706095:444444:71222.2:14892622'
161
+ # 'sell:1710255658251:42530:71300:14892621'
162
+ # 'buy:1710252424241:87913:72800:14892620'
163
+ # ... timestamp descending
162
164
  # ]
163
165
  # }
164
166
  #
165
- data = self.safe_value(message, 'data', [])
167
+ data = self.safe_list(message, 'data', [])
166
168
  limit = self.safe_integer(self.options, 'tradesLimit', 1000)
167
169
  stored = ArrayCache(limit)
168
- for i in range(0, len(data)):
169
- rawTrade = data[i]
170
+ dataLength = len(data)
171
+ for i in range(0, dataLength):
172
+ index = dataLength - 1 - i
173
+ rawTrade = data[index]
170
174
  parsed = self.parse_ws_old_trade(rawTrade)
171
175
  stored.append(parsed)
172
176
  messageHash = 'trades'
ccxt/pro/cryptocom.py CHANGED
@@ -931,7 +931,7 @@ class cryptocom(ccxt.async_support.cryptocom):
931
931
  }
932
932
  message = self.extend(request, params)
933
933
  self.watch(url, messageHash, message, messageHash)
934
- return future
934
+ return await future
935
935
 
936
936
  def handle_ping(self, client: Client, message):
937
937
  self.spawn(self.pong, client, message)
ccxt/pro/hitbtc.py CHANGED
@@ -119,7 +119,7 @@ class hitbtc(ccxt.async_support.hitbtc):
119
119
  # }
120
120
  # }
121
121
  #
122
- return future
122
+ return await future
123
123
 
124
124
  async def subscribe_public(self, name: str, messageHashPrefix: str, symbols: Strings = None, params={}):
125
125
  """
ccxt/pro/htx.py CHANGED
@@ -2205,4 +2205,4 @@ class htx(ccxt.async_support.htx):
2205
2205
  'params': params,
2206
2206
  }
2207
2207
  self.watch(url, messageHash, request, messageHash, subscription)
2208
- return future
2208
+ return await future
ccxt/pro/okcoin.py CHANGED
@@ -452,7 +452,7 @@ class okcoin(ccxt.async_support.okcoin):
452
452
  ],
453
453
  }
454
454
  self.spawn(self.watch, url, messageHash, request, messageHash, future)
455
- return future
455
+ return await future
456
456
 
457
457
  async def watch_balance(self, params={}) -> Balances:
458
458
  """
ccxt/pro/onetrading.py CHANGED
@@ -1272,4 +1272,4 @@ class onetrading(ccxt.async_support.onetrading):
1272
1272
  'api_token': self.apiKey,
1273
1273
  }
1274
1274
  self.watch(url, messageHash, self.extend(request, params), messageHash)
1275
- return future
1275
+ return await future
ccxt/pro/woo.py CHANGED
@@ -89,6 +89,13 @@ class woo(ccxt.async_support.woo):
89
89
  return await self.watch(url, messageHash, request, messageHash, subscribe)
90
90
 
91
91
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
92
+ """
93
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
94
+ :param str symbol: unified symbol of the market to fetch the order book for
95
+ :param int [limit]: the maximum amount of order book entries to return.
96
+ :param dict [params]: extra parameters specific to the exchange API endpoint
97
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
98
+ """
92
99
  await self.load_markets()
93
100
  name = 'orderbook'
94
101
  market = self.market(symbol)
@@ -137,9 +144,16 @@ class woo(ccxt.async_support.woo):
137
144
  client.resolve(orderbook, topic)
138
145
 
139
146
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
147
+ """
148
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
149
+ :param str symbol: unified symbol of the market to fetch the ticker for
150
+ :param dict [params]: extra parameters specific to the exchange API endpoint
151
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
152
+ """
140
153
  await self.load_markets()
141
154
  name = 'ticker'
142
155
  market = self.market(symbol)
156
+ symbol = market['symbol']
143
157
  topic = market['id'] + '@' + name
144
158
  request = {
145
159
  'event': 'subscribe',
@@ -214,7 +228,14 @@ class woo(ccxt.async_support.woo):
214
228
  return message
215
229
 
216
230
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
231
+ """
232
+ n watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
233
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
234
+ :param dict [params]: extra parameters specific to the exchange API endpoint
235
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
236
+ """
217
237
  await self.load_markets()
238
+ symbols = self.market_symbols(symbols)
218
239
  name = 'tickers'
219
240
  topic = name
220
241
  request = {
@@ -329,8 +350,17 @@ class woo(ccxt.async_support.woo):
329
350
  client.resolve(stored, topic)
330
351
 
331
352
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
353
+ """
354
+ watches information on multiple trades made in a market
355
+ :param str symbol: unified market symbol of the market trades were made in
356
+ :param int [since]: the earliest time in ms to fetch trades for
357
+ :param int [limit]: the maximum number of trade structures to retrieve
358
+ :param dict [params]: extra parameters specific to the exchange API endpoint
359
+ :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
360
+ """
332
361
  await self.load_markets()
333
362
  market = self.market(symbol)
363
+ symbol = market['symbol']
334
364
  topic = market['id'] + '@trade'
335
365
  request = {
336
366
  'event': 'subscribe',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.2.78
3
+ Version: 4.2.79
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
@@ -91,7 +91,7 @@ Current feature list:
91
91
  | [![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) |
92
92
  | [![bitmex](https://github.com/ccxt/ccxt/assets/43336371/cea9cfe5-c57e-4b84-b2ac-77b960b04445)](https://www.bitmex.com/app/register/NZTR1q) | bitmex | [BitMEX](https://www.bitmex.com/app/register/NZTR1q) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://www.bitmex.com/app/apiOverview) | [![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 BitMEX using CCXT's referral link for a 10% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d10%25&color=orange)](https://www.bitmex.com/app/register/NZTR1q) |
93
93
  | [![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) | |
94
- | [![coinbaseinternational](https://github.com/ccxt/ccxt/assets/43336371/866ae638-6ab5-4ebf-ab2c-cdcce9545625)](https://international.coinbase.com) | coinbaseinternational | [Coinbase International](https://international.coinbase.com) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.cloud.coinbaseinternational.com/intx/docs) | [![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) | |
94
+ | [![coinbaseinternational](https://github.com/ccxt/ccxt/assets/43336371/866ae638-6ab5-4ebf-ab2c-cdcce9545625)](https://international.coinbase.com) | coinbaseinternational | [Coinbase International](https://international.coinbase.com) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.cloud.coinbase.com/intx/docs) | [![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
  | [![coinex](https://user-images.githubusercontent.com/51840849/87182089-1e05fa00-c2ec-11ea-8da9-cc73b45abbbc.jpg)](https://www.coinex.com/register?refer_code=yw5fz) | coinex | [CoinEx](https://www.coinex.com/register?refer_code=yw5fz) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://viabtc.github.io/coinex_api_en_doc) | [![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) | |
96
96
  | [![cryptocom](https://user-images.githubusercontent.com/1294454/147792121-38ed5e36-c229-48d6-b49a-48d05fc19ed4.jpeg)](https://crypto.com/exch/kdacthrnxt) | cryptocom | [Crypto.com](https://crypto.com/exch/kdacthrnxt) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://exchange-docs.crypto.com/exchange/v1/rest-ws/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 Crypto.com using CCXT's referral link for a 15% discount!](https://img.shields.io/static/v1?label=Fee&message=%2d15%25&color=orange)](https://crypto.com/exch/kdacthrnxt) |
97
97
  | [![gate](https://user-images.githubusercontent.com/1294454/31784029-0313c702-b509-11e7-9ccc-bc0da6a0e435.jpg)](https://www.gate.io/signup/2436035) | gate | [Gate.io](https://www.gate.io/signup/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/signup/2436035) |
@@ -144,7 +144,7 @@ The CCXT library currently supports the following 97 cryptocurrency exchange mar
144
144
  | [![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) |
145
145
  | [![cex](https://user-images.githubusercontent.com/1294454/27766442-8ddc33b0-5ed8-11e7-8b98-f786aef0f3c9.jpg)](https://cex.io/r/0/up105393824/0/) | cex | [CEX.IO](https://cex.io/r/0/up105393824/0/) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://cex.io/cex-api) | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
146
146
  | [![coinbase](https://user-images.githubusercontent.com/1294454/40811661-b6eceae2-653a-11e8-829e-10bfadb078cf.jpg)](https://www.coinbase.com/join/58cbe25a355148797479dbd2) | coinbase | [Coinbase](https://www.coinbase.com/join/58cbe25a355148797479dbd2) | [![API Version 2](https://img.shields.io/badge/2-lightgray)](https://developers.coinbase.com/api/v2) | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
147
- | [![coinbaseinternational](https://github.com/ccxt/ccxt/assets/43336371/866ae638-6ab5-4ebf-ab2c-cdcce9545625)](https://international.coinbase.com) | coinbaseinternational | [Coinbase International](https://international.coinbase.com) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.cloud.coinbaseinternational.com/intx/docs) | [![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) |
147
+ | [![coinbaseinternational](https://github.com/ccxt/ccxt/assets/43336371/866ae638-6ab5-4ebf-ab2c-cdcce9545625)](https://international.coinbase.com) | coinbaseinternational | [Coinbase International](https://international.coinbase.com) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://docs.cloud.coinbase.com/intx/docs) | [![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) |
148
148
  | [![coinbasepro](https://user-images.githubusercontent.com/1294454/41764625-63b7ffde-760a-11e8-996d-a6328fa9347a.jpg)](https://pro.coinbase.com/) | coinbasepro | [Coinbase Pro](https://pro.coinbase.com/) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://docs.pro.coinbase.com) | | [![CCXT Pro](https://img.shields.io/badge/CCXT-Pro-black)](https://ccxt.pro) |
149
149
  | [![coincheck](https://user-images.githubusercontent.com/51840849/87182088-1d6d6380-c2ec-11ea-9c64-8ab9f9b289f5.jpg)](https://coincheck.com) | coincheck | [coincheck](https://coincheck.com) | [![API Version *](https://img.shields.io/badge/*-lightgray)](https://coincheck.com/documents/exchange/api) | | |
150
150
  | [![coinex](https://user-images.githubusercontent.com/51840849/87182089-1e05fa00-c2ec-11ea-8da9-cc73b45abbbc.jpg)](https://www.coinex.com/register?refer_code=yw5fz) | coinex | [CoinEx](https://www.coinex.com/register?refer_code=yw5fz) | [![API Version 1](https://img.shields.io/badge/1-lightgray)](https://viabtc.github.io/coinex_api_en_doc) | [![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) |
@@ -262,13 +262,13 @@ console.log(version, Object.keys(exchanges));
262
262
 
263
263
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
264
264
 
265
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.78/dist/ccxt.browser.js
266
- * unpkg: https://unpkg.com/ccxt@4.2.78/dist/ccxt.browser.js
265
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.79/dist/ccxt.browser.js
266
+ * unpkg: https://unpkg.com/ccxt@4.2.79/dist/ccxt.browser.js
267
267
 
268
268
  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
269
 
270
270
  ```HTML
271
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.78/dist/ccxt.browser.js"></script>
271
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.79/dist/ccxt.browser.js"></script>
272
272
  ```
273
273
 
274
274
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=y4W03J40zKa9uvn3_o9vyD4zY09wKMo-AiUlwAQe3RU,15656
1
+ ccxt/__init__.py,sha256=m9zKT0fml9swQHeS76Mh5TPpHEnOQjqfl9AFo7K82bo,15656
2
2
  ccxt/ace.py,sha256=nK9SbduDWoKzecwoSK9VYwReNMscvJ_JWo5IZvFbcQo,41409
3
3
  ccxt/alpaca.py,sha256=dCp9cDDKAqaaOroIPfv3sMBsMcUM7TsSKNSYZ3LLTQg,46892
4
4
  ccxt/ascendex.py,sha256=Ma2iM3L3kyXf6d_iqushKWfN1BtunXcrDe-_BENaw5U,150809
@@ -8,7 +8,7 @@ ccxt/binance.py,sha256=m-vmsN22thfQBn-bEXQ3r7c7EY3Ij1X8dVk3ohTHzh4,587268
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
11
- ccxt/bingx.py,sha256=n67r4w4yNxDB_OVYI9VN2OycxLl1JCjc_L73kpiQzLA,174311
11
+ ccxt/bingx.py,sha256=fVlEny_Gcz9sVSKT-GJ3FH6Rzq6BajveZ31t9s223oI,175539
12
12
  ccxt/bit2c.py,sha256=epVo367uZJvnnsnMageM0LqQ8IJPAvoSk2Reiv5ZZMw,36874
13
13
  ccxt/bitbank.py,sha256=1fi-afyTp4eDIlXBObwUBe2VJC_0o7f-WWVEimCpwIA,41672
14
14
  ccxt/bitbay.py,sha256=xAIjzGRDVGwoy-Gygd99H0YN4wiaz_0lR0Z14oxaaxc,478
@@ -25,7 +25,7 @@ ccxt/bitopro.py,sha256=HOLhSS50ITBr0UIWeON3KCt6i2QZ0M-zDhNj8B7MMHU,68081
25
25
  ccxt/bitpanda.py,sha256=aiwPkx9lKbVzt4ggoYdq_mIbMGtg5ZtGl2yRHO5xyz8,471
26
26
  ccxt/bitrue.py,sha256=F9PUD-Bp1HD_VG2BCX0tRp96lNch3hg3Gy8iuUmU3eU,135824
27
27
  ccxt/bitso.py,sha256=J_pd9byYxQAAKEpFVQYFbswMUeWKvvfj-7Y6UjOZk_0,70690
28
- ccxt/bitstamp.py,sha256=RMvh4eBa1efOu4P--vHGTm8mw6Se_w4upqrSsBB6LrE,91867
28
+ ccxt/bitstamp.py,sha256=69oVQdm3vR9KjJAcxntQ24u4HFrWIHphEjOWLovJmdQ,91526
29
29
  ccxt/bitteam.py,sha256=7p-66IqLY-SVNAD_SWVx2DKfQrqsusB-mcumpT2qK0c,101797
30
30
  ccxt/bitvavo.py,sha256=KLmOFy83UYriNSlL3sH3rDJJ-jBA-kJOSyQByfLa0l8,91292
31
31
  ccxt/bl3p.py,sha256=54SIWGTawER1HUnAA4eqT9YKGvU-eh1x9uOlhGcV9kM,20305
@@ -35,10 +35,10 @@ ccxt/btcalpha.py,sha256=W8vwhmpLK72hiMJtEfpxHeNeWF6pX9Dvod3lhNvdNps,36534
35
35
  ccxt/btcbox.py,sha256=XBgl9nPQUr0eL_El9-K4AuFODEXbesU6F0euVbvUs04,23341
36
36
  ccxt/btcmarkets.py,sha256=YEmwNq-K-YAgLqNKagyQYKKqIJzpSCKzxXyUxDKSx8I,51302
37
37
  ccxt/btcturk.py,sha256=9ogBoc1AHHvl0sosm-q0rdHvOmE9zFNCdSTcSHl7VSI,36417
38
- ccxt/bybit.py,sha256=sBVx2VBRIjYnsVZV2roSJUKZQ3O3yRFiLz6buBLlyFo,388246
38
+ ccxt/bybit.py,sha256=rDKzRdrZ1pi3QOYOncY2C64gvpLCXNRaLbZo1Rb9DM8,392371
39
39
  ccxt/cex.py,sha256=1lEHtvkhsokdUwcMsA9K1tOJtzdnjf5ovYOmWQGL8-8,69583
40
40
  ccxt/coinbase.py,sha256=oze3sKjBPuVqv2I1pbmGkPbiI9en-Uc2qqV1IuAYtf8,177031
41
- ccxt/coinbaseinternational.py,sha256=bVx0U7Ax59Zf9sJVROMGIm6A6kqvctsmWB-D-4qIAI4,87059
41
+ ccxt/coinbaseinternational.py,sha256=8Ejile-YQdH8YQvz48p_93A3NXZw_bI7-DhHV-Aqkag,87033
42
42
  ccxt/coinbasepro.py,sha256=mRQ712rI3afRWhf3q4-yKne6-6rKOp_y8Lh88xxFCfA,78307
43
43
  ccxt/coincheck.py,sha256=BU--zJ5KWZarI0gbaEsM3Rf9FHU10TK0Sk_bNUHRy14,35489
44
44
  ccxt/coinex.py,sha256=e3HyM4NnJuHwYW0o9lHbcFPcujNxsxLhYkFdDMJuZzE,229834
@@ -56,7 +56,7 @@ ccxt/digifinex.py,sha256=v5Kk702BABJj-ilooFZBSWYPW_IYLXnF1dy-ODzbQGs,169358
56
56
  ccxt/exmo.py,sha256=ln3Sd9brSMAIxtAqMOyD-Rq5h4TPeYAMAlNpXTAijvE,114222
57
57
  ccxt/flowbtc.py,sha256=YPvm6tbsHJJUQBspFcHuVPQfVmiWzwnVvfzRqBdQX6U,1169
58
58
  ccxt/fmfwio.py,sha256=RbVLvzPwnqfDsE7Ea-N13ISCC82eJVPsXYjrleASmew,1236
59
- ccxt/gate.py,sha256=EZs-VqLLUsdywQyJRiJYNJI1992qh-nTJMcvJRkXmWY,306156
59
+ ccxt/gate.py,sha256=Ht6-lWEvR8qictfi8fK188rU1dLrX1qA3X_W2pVQS_4,306286
60
60
  ccxt/gateio.py,sha256=86AETJWODl_vA5VNeQRHZprmpNIY1HAxCddKZcnKSi8,445
61
61
  ccxt/gemini.py,sha256=SWw8Rm19sB48DoQbrSnK6gLQDLS4ZD2gviR60kpuA8k,79373
62
62
  ccxt/hitbtc.py,sha256=sjDwsBjyuVRp-0bbPgdhQWmMX3p1-BIH22Rh7rrqWmE,151471
@@ -113,7 +113,7 @@ ccxt/abstract/binance.py,sha256=xcOsgFyL1HxiB6oz1OQkRfVR-laN9QCHcczDVQkFgE4,9175
113
113
  ccxt/abstract/binancecoinm.py,sha256=xcOsgFyL1HxiB6oz1OQkRfVR-laN9QCHcczDVQkFgE4,91751
114
114
  ccxt/abstract/binanceus.py,sha256=UShVJ4bg3pEa1ixv6274b0ccTR6Ez354BPXNN--a7ks,98471
115
115
  ccxt/abstract/binanceusdm.py,sha256=xcOsgFyL1HxiB6oz1OQkRfVR-laN9QCHcczDVQkFgE4,91751
116
- ccxt/abstract/bingx.py,sha256=403zJmYW2l6Ht_upkcjFrBfEfRh51_3rSx1qjLteL-w,15379
116
+ ccxt/abstract/bingx.py,sha256=lUPvY2d0DKPkDRndqjG4LhZzf99s1px-ZhVB-yToQG0,15541
117
117
  ccxt/abstract/bit2c.py,sha256=np6i756kSB5dO3Nj6POLKxkWkpYcsGg-4LS8BwPrizI,2830
118
118
  ccxt/abstract/bitbank.py,sha256=hrHsD7Uvtyy2o2lzCHau3-eNq16pnZ3-YDQ6Tq_sxYU,2735
119
119
  ccxt/abstract/bitbay.py,sha256=aSfewvRojzmuymX6QbOnDR8v9VFqWTULMHX9Y7kKD1M,5820
@@ -160,8 +160,8 @@ ccxt/abstract/deribit.py,sha256=rS_982u8dOVsh2vGSB5TO7K8Tye0Alq-Rg9fYZwz8hg,1549
160
160
  ccxt/abstract/digifinex.py,sha256=1JzOaqvLTgBuooJSVJ70riBgODfzZwxHwTmYHe_AnqU,11452
161
161
  ccxt/abstract/exmo.py,sha256=yq9zis5G9Qjsecs-YSHAghDjad6y52jFteWSBJZFg8o,6177
162
162
  ccxt/abstract/fmfwio.py,sha256=OTBtNu3DQeAqAC_Lbi0NePUs-ZQQllcLrVDI2G04nwQ,15601
163
- ccxt/abstract/gate.py,sha256=mPbf1vaw2NCn2D3YSGRD2LEexzfMBGRSygK5aimrc3s,41809
164
- ccxt/abstract/gateio.py,sha256=mPbf1vaw2NCn2D3YSGRD2LEexzfMBGRSygK5aimrc3s,41809
163
+ ccxt/abstract/gate.py,sha256=IbxOrYOb0dwsh4itELNcJXaF0jrwyPRcC3VX-BYmMjA,41994
164
+ ccxt/abstract/gateio.py,sha256=IbxOrYOb0dwsh4itELNcJXaF0jrwyPRcC3VX-BYmMjA,41994
165
165
  ccxt/abstract/gemini.py,sha256=6TyBUDw-e4b02J5ToCX0eaXQfF0Knvkf7ToLcseqcIY,6915
166
166
  ccxt/abstract/hitbtc.py,sha256=OTBtNu3DQeAqAC_Lbi0NePUs-ZQQllcLrVDI2G04nwQ,15601
167
167
  ccxt/abstract/hitbtc3.py,sha256=OTBtNu3DQeAqAC_Lbi0NePUs-ZQQllcLrVDI2G04nwQ,15601
@@ -207,7 +207,7 @@ 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=iBZJTUhr6B2TPlF5GwF4vL7jkpW32yv5cc20mRHbV7o,15409
210
+ ccxt/async_support/__init__.py,sha256=CXNvWSJP1d-HcBYQb2oHfe30wbp3hAMhPlMMFJgUfvc,15409
211
211
  ccxt/async_support/ace.py,sha256=MGP2VoA2plRgcW8ZBBXAAUg0NSOXlWtwbzYr00DFMaI,41633
212
212
  ccxt/async_support/alpaca.py,sha256=-vgtpCEqQWs-k7tA0PObflNKa7pM1HqQYYOMnCS9r24,47104
213
213
  ccxt/async_support/ascendex.py,sha256=K_mqPMdT9Q1oS8CRtoVYjlN4rbp86glU4sPQGFi4W6U,151597
@@ -217,7 +217,7 @@ ccxt/async_support/binance.py,sha256=WoxKOisddS6RxtlxQ8pHAblfysnBDJfzohZ9XW4s9Ws
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
220
- ccxt/async_support/bingx.py,sha256=ujWZwSqyxGjLZ41t5j4p7AW75jZP2yg7s1YPd56gtJQ,175275
220
+ ccxt/async_support/bingx.py,sha256=3O4_0PMcVJ5rbgKvXwfEJNttaqz7mjcZBp4XcbtFFtU,176509
221
221
  ccxt/async_support/bit2c.py,sha256=TkS8TCf3VsHox-FpsmUDr6wxkh9F5gajxc3LZhR_N3U,37086
222
222
  ccxt/async_support/bitbank.py,sha256=nB2UHbbMaCye74PJq3SmXHePz2roDmJ-c0mf8eHMw3o,41932
223
223
  ccxt/async_support/bitbay.py,sha256=jcaEXi2IhYTva8ezO_SfJhwxEZk7HST4J3NaxD16BQA,492
@@ -234,7 +234,7 @@ ccxt/async_support/bitopro.py,sha256=rITEIfcRAsTq7myJ7Nm-4hY26q6dyvtHXP56cZ2MD7M
234
234
  ccxt/async_support/bitpanda.py,sha256=2k3URBWrpnh2xHa7JiYenI7_4MW5UeOPGzetlmRkR4U,485
235
235
  ccxt/async_support/bitrue.py,sha256=WZFRGIhf-Bmm0uteDDw-G9LJr6sUVbAIr-_vAvPnuOg,136482
236
236
  ccxt/async_support/bitso.py,sha256=MdGEPa3N4Wuqx1_BZm9MWjyRi4CzDSGyoW41h1fLDqs,71076
237
- ccxt/async_support/bitstamp.py,sha256=BTwB7N87iTABsyeb0s6FerjqgaP5wPivAGbLw-CYqD8,92367
237
+ ccxt/async_support/bitstamp.py,sha256=IDGAsbqo9CTL-hw9W5aBU91njk9F3XuJ5RpRCckLGC0,92026
238
238
  ccxt/async_support/bitteam.py,sha256=Qiwoy3vH_ijxyGB5r4ssicm-nwzg3Yzbh_lgwIKeRSI,102129
239
239
  ccxt/async_support/bitvavo.py,sha256=yacwZgudfO-g07hbxTyUF-NXlNxXGS_EB7-84LvAFXI,91726
240
240
  ccxt/async_support/bl3p.py,sha256=tpxwMyk-FRdrGZew4TG7_kn57E0bb8YgnsyYPEPFSBI,20433
@@ -244,10 +244,10 @@ ccxt/async_support/btcalpha.py,sha256=HWMJJ7XvZJKE_2-c0ReQQlKO2piZWDpu1q3QukvmLu
244
244
  ccxt/async_support/btcbox.py,sha256=pT_fg3eVRk4Qi2ymTyxozHBz4FZs0KcCrU3fmZ2L_r4,23535
245
245
  ccxt/async_support/btcmarkets.py,sha256=fo-pKVLZLrtviYJCNDBCqYkK-1V5_1zqZtMMJuYIrEY,51652
246
246
  ccxt/async_support/btcturk.py,sha256=srhsQoz0K0R0lCM6eNiP6tyMBrOxNlBxnhcr1B2sHpY,36635
247
- ccxt/async_support/bybit.py,sha256=aipLUIAZ9CdJ4FEcr-xWqRPbYJCet-TqosaJT_4rYd4,389930
247
+ ccxt/async_support/bybit.py,sha256=7uP43b3jlVWn1fWqZDl3j_AW_jmKiv-tCn9ojP2ayok,394079
248
248
  ccxt/async_support/cex.py,sha256=CaauzTM2uCeOKKiR1XkkrIOsEzRiDuEw0dsPJAjzmVc,69933
249
249
  ccxt/async_support/coinbase.py,sha256=1LCO0zixD5EbQh3qTUEXlvyzr3VwwJ8Ax9Mw-qA64EU,177988
250
- ccxt/async_support/coinbaseinternational.py,sha256=rGSismVYdqsdHWCt14P1MaqpxefESVpAXqdiHdeChdc,87613
250
+ ccxt/async_support/coinbaseinternational.py,sha256=lfkw-ZPfs66UbIyDOtUIOli1K2tvCc30WccO74JBgW4,87587
251
251
  ccxt/async_support/coinbasepro.py,sha256=cashnVjK9ZFpBZaVXCxZQwoewldftfNZe2-A9eTy-34,78813
252
252
  ccxt/async_support/coincheck.py,sha256=dg-gpeqKM_pvwsLwBPkzDtgCx5CLKPo5ld83DHRTMJ0,35695
253
253
  ccxt/async_support/coinex.py,sha256=Lf-ngYFRrBaZdfJE1kXaYrJf6O9V7BPNZUQuBS-62yg,231074
@@ -265,7 +265,7 @@ ccxt/async_support/digifinex.py,sha256=1NWewU2Uzm3ILr2kSlPvpfo0xIcQYE-sOx7YTlqhx
265
265
  ccxt/async_support/exmo.py,sha256=fOIqQBiFW6U9hoct1K-vTZZ2vVi37SPcQ3Z5_WJxk6Q,114854
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=8G9KjZan5cxz5qANEp_uYESlNv7WREjcllj3a-9gY9M,307774
268
+ ccxt/async_support/gate.py,sha256=IS4FmY04n1pUNPWNB5jfJts8xMBXh-kYuYWOT-UJN4I,307904
269
269
  ccxt/async_support/gateio.py,sha256=6_t032F9p9x5KGTjtSuqGXITzFOx-XAQBYLpsuQjzxw,459
270
270
  ccxt/async_support/gemini.py,sha256=PPnLwDTyKdQS7LborOZlVymqPNzYqKnj9yC988zDqxU,79886
271
271
  ccxt/async_support/hitbtc.py,sha256=W5zLBFQlglCZVrQ0WBbbATD12aOODoowxcT2hMa2k1o,152517
@@ -313,25 +313,25 @@ ccxt/async_support/yobit.py,sha256=ZyQx9X9CE7cn5d3XB0sdieQyrgNLlFDe6LoVP8ckmzg,5
313
313
  ccxt/async_support/zaif.py,sha256=bbY7Sjnc8LsOcqwhipxx2AVOWBz-N7jjiftmksTOtTM,28119
314
314
  ccxt/async_support/zonda.py,sha256=5msJR5KAMz4MiUBJ_4QvQ8uRQWAYj5uf9AdsDyyRgtE,80766
315
315
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
316
- ccxt/async_support/base/exchange.py,sha256=mUPELYl867ZcfmS-o1SBz8BhoxknxkGwGFsXBv7-MDw,91281
316
+ ccxt/async_support/base/exchange.py,sha256=Zp7joIotvxYLKh1anZ9vC5pHPrPJADwE_DU280ElOtM,91281
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
320
320
  ccxt/async_support/base/ws/cache.py,sha256=yObqIOHFEXfmxO1NeA6gf0Sb7zfEDVWBeB501FInuxY,8100
321
321
  ccxt/async_support/base/ws/client.py,sha256=jTFg8KHw9_2vD9kJp1Pykw2KGXisFgGnRFir0V7bp_g,7289
322
322
  ccxt/async_support/base/ws/fast_client.py,sha256=r5Ej3hjCY5k-e4D2gXbo5TE2EXCItVg8fJ8i3O3djsQ,3864
323
- ccxt/async_support/base/ws/functions.py,sha256=1ajdQBGdX3XdRnCpHsNMJpGUjs7VeyN5Ctuff0IxQEM,1479
323
+ ccxt/async_support/base/ws/functions.py,sha256=qwvEnjtINWL5ZU-dbbeIunjyBxzFqbGWHfVhxqAcKug,1499
324
324
  ccxt/async_support/base/ws/future.py,sha256=Ls4nOPAFpVs-3avD202xKKLNUpGc7VDtAzM7kx1xNaE,2067
325
325
  ccxt/async_support/base/ws/order_book.py,sha256=uBUaIHhzMRykpmo4BCsdJ-t_HozS6VxhEs8x-Kbj-NI,2894
326
326
  ccxt/async_support/base/ws/order_book_side.py,sha256=Pxrq22nCODckJ6G1OXkYEmUunIuybSz6sh9MsDB1WMY,6478
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=M9GXUp6HVQ2Ca6E0OkI2AynoBxBxhGhf40Tpt8VXO5E,248272
330
+ ccxt/base/exchange.py,sha256=YCrSSN0PI8YcsMtlkFQab6oPyApdUzmYJnvD67fqldg,248352
331
331
  ccxt/base/precise.py,sha256=_xfu54sV0vWNnOfGTKRFykeuWP8mn4K1m9lk1tcllX4,8565
332
332
  ccxt/base/types.py,sha256=Pd0jZXOo29pfZ4VK4E5rfsUf1JPf336OGXLPlf6Qe_w,6404
333
- ccxt/pro/__init__.py,sha256=3U0ehO0tgoKpKzq9hyV3WdyFv8eIaR_lXpyd0gJ9z2o,6897
334
- ccxt/pro/alpaca.py,sha256=ABL5GvXMmcSC7LaYRtUqS3tgsLpCBf1IChgC5f2aA2E,27161
333
+ ccxt/pro/__init__.py,sha256=Kj0yTWpcUqlVI1ZqsoM1xJurX0vr23PiNhaCqDthoWo,6897
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
337
337
  ccxt/pro/binance.py,sha256=E-MOsVPrMElgYy909I5vukpjrBikQ_jlaH59QxdVRPo,134029
@@ -341,34 +341,34 @@ ccxt/pro/binanceusdm.py,sha256=S0eT662O2ReplsihWk42nhJWqw1XsODpeDQa9eFVVt8,1357
341
341
  ccxt/pro/bingx.py,sha256=DX-_TEWhTSi__zP865UUM0DqnEO9VO6KHysLiVr2JpE,42110
342
342
  ccxt/pro/bitcoincom.py,sha256=zAX6hiz4hS6Un8dSGp88rpnvItxQHfNmsfF0IZ2xIVA,1181
343
343
  ccxt/pro/bitfinex.py,sha256=VdvMikgWO7htYSAEKmGkDBYISWCJon1bnkv3JkV4nv0,24826
344
- ccxt/pro/bitfinex2.py,sha256=ZsTOByJT8hMiqRR01V06Wz1UEDlIXE_jlEV4BTgD_Q4,42738
345
- ccxt/pro/bitget.py,sha256=dI3EIz5Er7pDcyRUmh3u6uk0d2POmbkJ8VSfSjfx5Aw,71718
346
- ccxt/pro/bitmart.py,sha256=KM5cWVivFilZ1GIJ35YrATMPKLBP5pJbGwnyrg0OaJI,62376
347
- ccxt/pro/bitmex.py,sha256=_9jaNOPuOTNIWvaStriOLrN3kJ0MSQ4EgAH6NBXDKtk,67887
344
+ ccxt/pro/bitfinex2.py,sha256=zIFXJNjzHSUxbKm8DUAstcoDTg9IZ3LoF5uJYL0H7lg,42744
345
+ ccxt/pro/bitget.py,sha256=LMWTlRkNiwFxyT3f05ikaX3oSvR5JOJSAveETtZntko,71724
346
+ ccxt/pro/bitmart.py,sha256=KF45-NuljFoQKbDRYfWDQEZ9FTkfahVxOQKbuCSvhfw,62382
347
+ ccxt/pro/bitmex.py,sha256=DAk_cbsDGWw8aTijphqtyqXNVNXRVpXCoyb_1zZPk-8,67893
348
348
  ccxt/pro/bitopro.py,sha256=QtM5bK7IY8Lh-p5Y8AJPPNF7YcKstzgegA_JgbZe-kc,18669
349
349
  ccxt/pro/bitpanda.py,sha256=ELrhfFKN9YJJdmm9wBf-vpk6WsXGWGf-SyJdqm-E_Lg,415
350
350
  ccxt/pro/bitrue.py,sha256=gPN1lVaDZ4IBYGhaS-1WCkcNQ5__RMbtn2dC2sKZUI4,16448
351
351
  ccxt/pro/bitstamp.py,sha256=LLxCbMr3VIpqqH5iHvJHPuLdWB3RwAkO6khgsE608Sk,20886
352
352
  ccxt/pro/bitvavo.py,sha256=Rwai6JYdGMUZ0KWtU11E_yIg8DfIq8tTXNjBZp6CPCU,56115
353
- ccxt/pro/blockchaincom.py,sha256=k0BU61r5oEOZWJRRN0dH_C-hU_J_Gd79tOgjIA0wE1w,29554
354
- ccxt/pro/bybit.py,sha256=RnY31cx8Y5EQCXSEs4t0CJxoR6nO5setU59x5FVpH7Q,74404
355
- ccxt/pro/cex.py,sha256=jOHEQO-9s_Ab4O5d4W2_wpltqH-tAKHavw1Qn4tyZdo,57719
353
+ ccxt/pro/blockchaincom.py,sha256=VnhlyghlkfO0CUTXUwRP5Y26oWr2WIPgTIgR9lecmf0,29560
354
+ ccxt/pro/bybit.py,sha256=YXy2FhUjDwJGSti_V5Gu4Kr0-Yd5sc0vmP1YtUNuZAc,75024
355
+ ccxt/pro/cex.py,sha256=JoPNhEQkJwdFT3v9G6EQUsRXLhyhg9pGhbi-01hwtAM,57892
356
356
  ccxt/pro/coinbase.py,sha256=BJ9VHYqiZqhgRqY23r6gW5TXoGiKrdC1b-IWaNEeDtQ,22578
357
357
  ccxt/pro/coinbaseinternational.py,sha256=5okDkILOBOIbLZfk7tMeQpFaOZXdYRewIiK5y66EmU0,25428
358
358
  ccxt/pro/coinbasepro.py,sha256=GTrYwUuwhOFJ4cMLFEHUVqNPpaJgzZewLfpQND6A7ks,38945
359
359
  ccxt/pro/coincheck.py,sha256=MKAPHJeVifQaCKPla-7RY86TIWyDGe4nvjRhNmi617w,7789
360
360
  ccxt/pro/coinex.py,sha256=7-G98GDtB83npQu0uYDQ7x49uIh9luTf4_EpHrwuyMU,45042
361
361
  ccxt/pro/coinone.py,sha256=d0s11hTNFVFZiBD3jWWu6iRseyVsHR6dO-njqqZ2WyU,15652
362
- ccxt/pro/cryptocom.py,sha256=MN02w0wF61FwausNYODv_28gJL5SQvH3-d2WB-dqkq8,42637
362
+ ccxt/pro/cryptocom.py,sha256=MridvQCEbhqxeQC-5D5nkYi5IsrttZiCVLoZKKdV3vs,42643
363
363
  ccxt/pro/currencycom.py,sha256=U3H_inb0V39LYRwlKdVXTeA_akiG1437jZZ-dsejX0k,22355
364
364
  ccxt/pro/deribit.py,sha256=IutkVY1AzcTszpbbhNV1dLF3DUr3zGXxyHhWQVJ96m0,41035
365
365
  ccxt/pro/exmo.py,sha256=gLCAObkmAyL_4BTRnftfDTejsW3-isi18ppKIipidyo,24527
366
366
  ccxt/pro/gate.py,sha256=ZxG65LlbK4zk9PO6g_Tt1lZ1KN_gEmL0K8wOLU5M7wU,52489
367
367
  ccxt/pro/gateio.py,sha256=_uBWXYQbmsHRivKnZOJDmxJ9tWLO_0HAxmOjAEUy9nE,391
368
368
  ccxt/pro/gemini.py,sha256=VZERPN0NgdkmnDavU-9J-bp06peQVrTjelkljADMlVo,36591
369
- ccxt/pro/hitbtc.py,sha256=1uu5JA1c053CScs52fEeZDJ5X0N5-SBjxH0gFmYik-I,56279
369
+ ccxt/pro/hitbtc.py,sha256=ASHxLlG2qSdRJP0ilP3YfQ4Axh6xzglnuQc01sF_tss,56285
370
370
  ccxt/pro/hollaex.py,sha256=xkvPQ2h6t-Jvt1WsQC_ahKAaA6wYMvx03fnc0zqqOIg,21957
371
- ccxt/pro/htx.py,sha256=WBz8R4_n5ZJ0pEp27Ndf2WmqpD4ax2GJiM36bqEewTk,95773
371
+ ccxt/pro/htx.py,sha256=_nIGpiNlgFXnzo2v4pnuLVI4_gZON41eeB1W0p3d_OY,95779
372
372
  ccxt/pro/huobi.py,sha256=rKZVgYqEr-MmZzTqAk4FoJt8qWFjCi_FY0ci_mWZrL0,385
373
373
  ccxt/pro/huobijp.py,sha256=fcC66ECLwrR9LN_AYZZltoE_w9EltT5DcXimPOHKJk0,23174
374
374
  ccxt/pro/hyperliquid.py,sha256=vDNXMOFdFFy0vCAhkgeItdeNMcPz3hC6UH3TGKbSvbs,20613
@@ -382,9 +382,9 @@ ccxt/pro/lbank.py,sha256=KBeJf2fucVkXZ6wKhfkBLw3RJewrxrj7cPa8XPxxV7U,35100
382
382
  ccxt/pro/luno.py,sha256=2Y-8IQrrmwX8Y1lLWVDtrFjZD3t3qtMZJQ_JjNwj65s,12348
383
383
  ccxt/pro/mexc.py,sha256=Sgvl5dhKz8LxcQkdnbIWwiKI3zmjZu2o8ZG2fO6Gr2U,42551
384
384
  ccxt/pro/ndax.py,sha256=Yrdy4UxjrDwO7gNMmSy09Wj6kHnRx1n0DTWmfirMEj8,22643
385
- ccxt/pro/okcoin.py,sha256=a8Bg0aD2dI2hYiLumRmmwlFOLOgn8ZY6-RGyhTfBAEk,30379
385
+ ccxt/pro/okcoin.py,sha256=Mb8Zq47uO7pmXxv51swuGogo-D503GI_caRxQQt0R0I,30385
386
386
  ccxt/pro/okx.py,sha256=g56ZFnH8ApuL1Kgh427G_3kqhwD4SthWmkrhqMIe7ZA,68286
387
- ccxt/pro/onetrading.py,sha256=GWp0UeRzlD64KL6hDx-tBaY7rIZ4sTGf89SrjcRBp9o,54628
387
+ ccxt/pro/onetrading.py,sha256=9-WTi6ZNjsG7TJ6CA6pGpnm_6Jg2gg21ny4GZypjr6s,54634
388
388
  ccxt/pro/p2b.py,sha256=afEcnqnXmAbKJGPlHHqDSw6Lpu13ON1FG7E1SSnfvRA,17320
389
389
  ccxt/pro/phemex.py,sha256=RpHaVQ2qnrtMO41I_-AwOW3qTkPqKB6sFL70nH01gnc,60674
390
390
  ccxt/pro/poloniex.py,sha256=5-v7AgCp7sVlpkbGhG_Dfo5uWPrCti7jzCtdRwZTGVk,51236
@@ -393,7 +393,7 @@ ccxt/pro/probit.py,sha256=RLTnROQUmX31XQ3ymIZkiDkop3eiSVK70Yw81yDcde4,22822
393
393
  ccxt/pro/upbit.py,sha256=CSqwaNCxECo9FI7aq_7ege0c8IjWEmsoPZL06Kw9KDo,9654
394
394
  ccxt/pro/wazirx.py,sha256=UVZa0W3hMBwRAaDw5zboSa0wGzp-jS66xIp9fhmIYk4,30004
395
395
  ccxt/pro/whitebit.py,sha256=MFRca7ONUUsfgNI-45DwngRc6TxCM4Fqe5DBi-COBjg,35021
396
- ccxt/pro/woo.py,sha256=5b3EgoNWJ_RUdPeRwOnCuE5DXw2hjo2kgdFB7QNdntA,35035
396
+ ccxt/pro/woo.py,sha256=lUgPQXNY74k8U9qbNniaKULVLlBEs-DFEAJq5k9z10I,37024
397
397
  ccxt/static_dependencies/__init__.py,sha256=GpOAh5lJ5Kyk1K1lWf9DzDZeZ-prHXXK38dVpW5GPfc,84
398
398
  ccxt/static_dependencies/ecdsa/__init__.py,sha256=Xaj0G79BLtBt2YZcOOMV8qOlQZ7fIJznNiHhiEEZfQA,594
399
399
  ccxt/static_dependencies/ecdsa/_version.py,sha256=eMIr0XQiX8_th_x4iAd0JFcYKLowY9dYz33-vKVFIPI,18461
@@ -528,7 +528,7 @@ ccxt/test/base/test_ticker.py,sha256=cmYHv5ZtbAq27y4LGDcGzaro-qkSNJWme5rLHOEdA4U
528
528
  ccxt/test/base/test_trade.py,sha256=PMtmB8V38dpaP-eb8h488xYMlR6D69yCOhsA1RuWrUA,2336
529
529
  ccxt/test/base/test_trading_fee.py,sha256=2aDCNJtqBkTC_AieO0l1HYGq5hz5qkWlkWb9Nv_fcwk,1066
530
530
  ccxt/test/base/test_transaction.py,sha256=BTbB4UHHXkrvYgwbrhh867nVRlevmIkIrz1W_odlQJI,1434
531
- ccxt-4.2.78.dist-info/METADATA,sha256=btc22yOezu76Fg7dqHdo-pVzDMVlqeuYSIGBHnGIJNM,110489
532
- ccxt-4.2.78.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
533
- ccxt-4.2.78.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
534
- ccxt-4.2.78.dist-info/RECORD,,
531
+ ccxt-4.2.79.dist-info/METADATA,sha256=PxRMFicWTVd0lv-5SYR39H6POR3mTpeVWPzT-7PAjw4,110489
532
+ ccxt-4.2.79.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
533
+ ccxt-4.2.79.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
534
+ ccxt-4.2.79.dist-info/RECORD,,
File without changes