ccxt 4.3.68__py2.py3-none-any.whl → 4.3.70__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (68) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/coinbaseinternational.py +1 -1
  3. ccxt/async_support/__init__.py +1 -1
  4. ccxt/async_support/base/exchange.py +1 -1
  5. ccxt/async_support/binance.py +2 -2
  6. ccxt/async_support/bingx.py +129 -73
  7. ccxt/async_support/bitget.py +2 -2
  8. ccxt/async_support/bitmart.py +2 -2
  9. ccxt/async_support/bitrue.py +2 -2
  10. ccxt/async_support/blofin.py +63 -6
  11. ccxt/async_support/btcbox.py +1 -1
  12. ccxt/async_support/bybit.py +3 -3
  13. ccxt/async_support/coinbaseinternational.py +227 -3
  14. ccxt/async_support/coinex.py +2 -2
  15. ccxt/async_support/coinlist.py +2 -2
  16. ccxt/async_support/cryptocom.py +12 -1
  17. ccxt/async_support/deribit.py +2 -2
  18. ccxt/async_support/digifinex.py +2 -2
  19. ccxt/async_support/hyperliquid.py +0 -2
  20. ccxt/async_support/kucoin.py +11 -5
  21. ccxt/async_support/latoken.py +2 -2
  22. ccxt/async_support/mexc.py +2 -2
  23. ccxt/async_support/okx.py +2 -2
  24. ccxt/async_support/oxfun.py +1 -1
  25. ccxt/async_support/phemex.py +2 -2
  26. ccxt/async_support/poloniex.py +34 -33
  27. ccxt/async_support/poloniexfutures.py +26 -26
  28. ccxt/async_support/woo.py +2 -2
  29. ccxt/base/exchange.py +334 -117
  30. ccxt/base/types.py +21 -3
  31. ccxt/binance.py +2 -2
  32. ccxt/bingx.py +129 -73
  33. ccxt/bitget.py +2 -2
  34. ccxt/bitmart.py +2 -2
  35. ccxt/bitrue.py +2 -2
  36. ccxt/blofin.py +63 -6
  37. ccxt/btcbox.py +1 -1
  38. ccxt/bybit.py +3 -3
  39. ccxt/coinbaseinternational.py +227 -3
  40. ccxt/coinex.py +2 -2
  41. ccxt/coinlist.py +2 -2
  42. ccxt/cryptocom.py +12 -1
  43. ccxt/deribit.py +2 -2
  44. ccxt/digifinex.py +2 -2
  45. ccxt/hyperliquid.py +0 -2
  46. ccxt/kucoin.py +11 -5
  47. ccxt/latoken.py +2 -2
  48. ccxt/mexc.py +2 -2
  49. ccxt/okx.py +2 -2
  50. ccxt/oxfun.py +1 -1
  51. ccxt/phemex.py +2 -2
  52. ccxt/poloniex.py +34 -33
  53. ccxt/poloniexfutures.py +26 -26
  54. ccxt/pro/__init__.py +3 -1
  55. ccxt/pro/blofin.py +608 -0
  56. ccxt/pro/coinbaseinternational.py +142 -11
  57. ccxt/pro/cryptocom.py +4 -1
  58. ccxt/pro/hitbtc.py +20 -8
  59. ccxt/pro/okx.py +6 -0
  60. ccxt/pro/poloniex.py +45 -23
  61. ccxt/pro/poloniexfutures.py +5 -5
  62. ccxt/pro/woo.py +5 -4
  63. ccxt/woo.py +2 -2
  64. {ccxt-4.3.68.dist-info → ccxt-4.3.70.dist-info}/METADATA +7 -7
  65. {ccxt-4.3.68.dist-info → ccxt-4.3.70.dist-info}/RECORD +68 -67
  66. {ccxt-4.3.68.dist-info → ccxt-4.3.70.dist-info}/LICENSE.txt +0 -0
  67. {ccxt-4.3.68.dist-info → ccxt-4.3.70.dist-info}/WHEEL +0 -0
  68. {ccxt-4.3.68.dist-info → ccxt-4.3.70.dist-info}/top_level.txt +0 -0
ccxt/bingx.py CHANGED
@@ -7,7 +7,7 @@ from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.bingx import ImplicitAPI
8
8
  import hashlib
9
9
  import numbers
10
- from ccxt.base.types import Balances, Currencies, Currency, Int, Leverage, MarginMode, MarginModification, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry, TransferEntries
10
+ from ccxt.base.types import Balances, Currencies, Currency, Int, Leverage, MarginMode, MarginModification, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
13
  from ccxt.base.errors import AuthenticationError
@@ -1110,7 +1110,27 @@ class bingx(Exchange, ImplicitAPI):
1110
1110
  # "s": "BTC-USDT"
1111
1111
  # }
1112
1112
  #
1113
- time = self.safe_integer_n(trade, ['time', 'filledTm', 'T'])
1113
+ # inverse swap fetchMyTrades
1114
+ #
1115
+ # {
1116
+ # "orderId": "1817441228670648320",
1117
+ # "symbol": "SOL-USD",
1118
+ # "type": "MARKET",
1119
+ # "side": "BUY",
1120
+ # "positionSide": "LONG",
1121
+ # "tradeId": "97244554",
1122
+ # "volume": "2",
1123
+ # "tradePrice": "182.652",
1124
+ # "amount": "20.00000000",
1125
+ # "realizedPnl": "0.00000000",
1126
+ # "commission": "-0.00005475",
1127
+ # "currency": "SOL",
1128
+ # "buyer": True,
1129
+ # "maker": False,
1130
+ # "tradeTime": 1722146730000
1131
+ # }
1132
+ #
1133
+ time = self.safe_integer_n(trade, ['time', 'filledTm', 'T', 'tradeTime'])
1114
1134
  datetimeId = self.safe_string(trade, 'filledTm')
1115
1135
  if datetimeId is not None:
1116
1136
  time = self.parse8601(datetimeId)
@@ -1121,8 +1141,8 @@ class bingx(Exchange, ImplicitAPI):
1121
1141
  currencyId = self.safe_string_n(trade, ['currency', 'N', 'commissionAsset'])
1122
1142
  currencyCode = self.safe_currency_code(currencyId)
1123
1143
  m = self.safe_bool(trade, 'm')
1124
- marketId = self.safe_string(trade, 's')
1125
- isBuyerMaker = self.safe_bool_2(trade, 'buyerMaker', 'isBuyerMaker')
1144
+ marketId = self.safe_string_2(trade, 's', 'symbol')
1145
+ isBuyerMaker = self.safe_bool_n(trade, ['buyerMaker', 'isBuyerMaker', 'maker'])
1126
1146
  takeOrMaker = None
1127
1147
  if (isBuyerMaker is not None) or (m is not None):
1128
1148
  takeOrMaker = 'maker' if (isBuyerMaker or m) else 'taker'
@@ -1153,7 +1173,7 @@ class bingx(Exchange, ImplicitAPI):
1153
1173
  'type': self.safe_string_lower(trade, 'o'),
1154
1174
  'side': self.parse_order_side(side),
1155
1175
  'takerOrMaker': takeOrMaker,
1156
- 'price': self.safe_string_2(trade, 'price', 'p'),
1176
+ 'price': self.safe_string_n(trade, ['price', 'p', 'tradePrice']),
1157
1177
  'amount': amount,
1158
1178
  'cost': cost,
1159
1179
  'fee': {
@@ -3984,7 +4004,7 @@ class bingx(Exchange, ImplicitAPI):
3984
4004
  'status': None,
3985
4005
  }
3986
4006
 
3987
- def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
4007
+ def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
3988
4008
  """
3989
4009
  fetch a history of internal transfers made on an account
3990
4010
  :see: https://bingx-api.github.io/docs/#/spot/account-api.html#Query%20User%20Universal%20Transfer%20History%20(USER_DATA)
@@ -4596,93 +4616,129 @@ class bingx(Exchange, ImplicitAPI):
4596
4616
  def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
4597
4617
  """
4598
4618
  fetch all trades made by the user
4599
- :see: https://bingx-api.github.io/docs/#/en-us/spot/trade-api.html#Query%20Order%20History
4600
- :see: https://bingx-api.github.io/docs/#/swapV2/trade-api.html#Query%20historical%20transaction%20orders
4619
+ :see: https://bingx-api.github.io/docs/#/en-us/spot/trade-api.html#Query%20transaction%20details
4620
+ :see: https://bingx-api.github.io/docs/#/en-us/swapV2/trade-api.html#Query%20historical%20transaction%20orders
4621
+ :see: https://bingx-api.github.io/docs/#/en-us/cswap/trade-api.html#Query%20Order%20Trade%20Detail
4601
4622
  :param str [symbol]: unified market symbol
4602
4623
  :param int [since]: the earliest time in ms to fetch trades for
4603
4624
  :param int [limit]: the maximum number of trades structures to retrieve
4604
4625
  :param dict [params]: extra parameters specific to the exchange API endpoint
4605
4626
  :param int [params.until]: timestamp in ms for the ending date filter, default is None
4606
4627
  :param str params['trandingUnit']: COIN(directly represent assets such and ETH) or CONT(represents the number of contract sheets)
4628
+ :param str params['orderId']: the order id required for inverse swap
4607
4629
  :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
4608
4630
  """
4609
4631
  if symbol is None:
4610
4632
  raise ArgumentsRequired(self.id + ' fetchMyTrades() requires a symbol argument')
4611
4633
  self.load_markets()
4612
4634
  market = self.market(symbol)
4613
- now = self.milliseconds()
4614
- response = None
4615
- request: dict = {
4616
- 'symbol': market['id'],
4617
- }
4618
- if since is not None:
4619
- startTimeReq = 'startTime' if market['spot'] else 'startTs'
4620
- request[startTimeReq] = since
4621
- elif market['swap']:
4622
- request['startTs'] = now - 7776000000 # 90 days
4623
- until = self.safe_integer(params, 'until')
4624
- params = self.omit(params, 'until')
4625
- if until is not None:
4626
- endTimeReq = 'endTime' if market['spot'] else 'endTs'
4627
- request[endTimeReq] = until
4628
- elif market['swap']:
4629
- request['endTs'] = now
4635
+ request: dict = {}
4630
4636
  fills = None
4631
- if market['spot']:
4632
- response = self.spotV1PrivateGetTradeMyTrades(self.extend(request, params))
4633
- data = self.safe_dict(response, 'data', {})
4634
- fills = self.safe_list(data, 'fills', [])
4637
+ response = None
4638
+ subType = None
4639
+ subType, params = self.handle_sub_type_and_params('fetchMyTrades', market, params)
4640
+ if subType == 'inverse':
4641
+ orderId = self.safe_string(params, 'orderId')
4642
+ if orderId is None:
4643
+ raise ArgumentsRequired(self.id + ' fetchMyTrades() requires an orderId argument for inverse swap trades')
4644
+ response = self.cswapV1PrivateGetTradeAllFillOrders(self.extend(request, params))
4645
+ fills = self.safe_list(response, 'data', [])
4635
4646
  #
4636
4647
  # {
4637
4648
  # "code": 0,
4638
4649
  # "msg": "",
4639
- # "debugMsg": "",
4640
- # "data": {
4641
- # "fills": [
4642
- # {
4643
- # "symbol": "LTC-USDT",
4644
- # "id": 36237072,
4645
- # "orderId": 1674069326895775744,
4646
- # "price": "85.891",
4647
- # "qty": "0.0582",
4648
- # "quoteQty": "4.9988562000000005",
4649
- # "commission": -0.00005820000000000001,
4650
- # "commissionAsset": "LTC",
4651
- # "time": 1687964205000,
4652
- # "isBuyer": True,
4653
- # "isMaker": False
4654
- # }
4655
- # ]
4656
- # }
4650
+ # "timestamp": 1722147756019,
4651
+ # "data": [
4652
+ # {
4653
+ # "orderId": "1817441228670648320",
4654
+ # "symbol": "SOL-USD",
4655
+ # "type": "MARKET",
4656
+ # "side": "BUY",
4657
+ # "positionSide": "LONG",
4658
+ # "tradeId": "97244554",
4659
+ # "volume": "2",
4660
+ # "tradePrice": "182.652",
4661
+ # "amount": "20.00000000",
4662
+ # "realizedPnl": "0.00000000",
4663
+ # "commission": "-0.00005475",
4664
+ # "currency": "SOL",
4665
+ # "buyer": True,
4666
+ # "maker": False,
4667
+ # "tradeTime": 1722146730000
4668
+ # }
4669
+ # ]
4657
4670
  # }
4658
4671
  #
4659
4672
  else:
4660
- tradingUnit = self.safe_string_upper(params, 'tradingUnit', 'CONT')
4661
- params = self.omit(params, 'tradingUnit')
4662
- request['tradingUnit'] = tradingUnit
4663
- response = self.swapV2PrivateGetTradeAllFillOrders(self.extend(request, params))
4664
- data = self.safe_dict(response, 'data', {})
4665
- fills = self.safe_list(data, 'fill_orders', [])
4666
- #
4667
- # {
4668
- # "code": "0",
4669
- # "msg": '',
4670
- # "data": {fill_orders: [
4671
- # {
4672
- # "volume": "0.1",
4673
- # "price": "106.75",
4674
- # "amount": "10.6750",
4675
- # "commission": "-0.0053",
4676
- # "currency": "USDT",
4677
- # "orderId": "1676213270274379776",
4678
- # "liquidatedPrice": "0.00",
4679
- # "liquidatedMarginRatio": "0.00",
4680
- # "filledTime": "2023-07-04T20:56:01.000+0800"
4681
- # }
4682
- # ]
4683
- # }
4684
- # }
4685
- #
4673
+ request['symbol'] = market['id']
4674
+ now = self.milliseconds()
4675
+ if since is not None:
4676
+ startTimeReq = 'startTime' if market['spot'] else 'startTs'
4677
+ request[startTimeReq] = since
4678
+ elif market['swap']:
4679
+ request['startTs'] = now - 7776000000 # 90 days
4680
+ until = self.safe_integer(params, 'until')
4681
+ params = self.omit(params, 'until')
4682
+ if until is not None:
4683
+ endTimeReq = 'endTime' if market['spot'] else 'endTs'
4684
+ request[endTimeReq] = until
4685
+ elif market['swap']:
4686
+ request['endTs'] = now
4687
+ if market['spot']:
4688
+ response = self.spotV1PrivateGetTradeMyTrades(self.extend(request, params))
4689
+ data = self.safe_dict(response, 'data', {})
4690
+ fills = self.safe_list(data, 'fills', [])
4691
+ #
4692
+ # {
4693
+ # "code": 0,
4694
+ # "msg": "",
4695
+ # "debugMsg": "",
4696
+ # "data": {
4697
+ # "fills": [
4698
+ # {
4699
+ # "symbol": "LTC-USDT",
4700
+ # "id": 36237072,
4701
+ # "orderId": 1674069326895775744,
4702
+ # "price": "85.891",
4703
+ # "qty": "0.0582",
4704
+ # "quoteQty": "4.9988562000000005",
4705
+ # "commission": -0.00005820000000000001,
4706
+ # "commissionAsset": "LTC",
4707
+ # "time": 1687964205000,
4708
+ # "isBuyer": True,
4709
+ # "isMaker": False
4710
+ # }
4711
+ # ]
4712
+ # }
4713
+ # }
4714
+ #
4715
+ else:
4716
+ tradingUnit = self.safe_string_upper(params, 'tradingUnit', 'CONT')
4717
+ params = self.omit(params, 'tradingUnit')
4718
+ request['tradingUnit'] = tradingUnit
4719
+ response = self.swapV2PrivateGetTradeAllFillOrders(self.extend(request, params))
4720
+ data = self.safe_dict(response, 'data', {})
4721
+ fills = self.safe_list(data, 'fill_orders', [])
4722
+ #
4723
+ # {
4724
+ # "code": "0",
4725
+ # "msg": '',
4726
+ # "data": {fill_orders: [
4727
+ # {
4728
+ # "volume": "0.1",
4729
+ # "price": "106.75",
4730
+ # "amount": "10.6750",
4731
+ # "commission": "-0.0053",
4732
+ # "currency": "USDT",
4733
+ # "orderId": "1676213270274379776",
4734
+ # "liquidatedPrice": "0.00",
4735
+ # "liquidatedMarginRatio": "0.00",
4736
+ # "filledTime": "2023-07-04T20:56:01.000+0800"
4737
+ # }
4738
+ # ]
4739
+ # }
4740
+ # }
4741
+ #
4686
4742
  return self.parse_trades(fills, market, since, limit, params)
4687
4743
 
4688
4744
  def parse_deposit_withdraw_fee(self, fee, currency: Currency = None):
ccxt/bitget.py CHANGED
@@ -7,7 +7,7 @@ from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.bitget import ImplicitAPI
8
8
  import hashlib
9
9
  import json
10
- from ccxt.base.types import Balances, Conversion, CrossBorrowRate, Currencies, Currency, FundingHistory, Int, IsolatedBorrowRate, Leverage, LeverageTier, Liquidation, MarginMode, MarginModification, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry, TransferEntries
10
+ from ccxt.base.types import Balances, Conversion, CrossBorrowRate, Currencies, Currency, FundingHistory, Int, IsolatedBorrowRate, Leverage, LeverageTier, Liquidation, MarginMode, MarginModification, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
13
  from ccxt.base.errors import AuthenticationError
@@ -6819,7 +6819,7 @@ class bitget(Exchange, ImplicitAPI):
6819
6819
  'info': interest,
6820
6820
  }, market)
6821
6821
 
6822
- def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
6822
+ def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
6823
6823
  """
6824
6824
  fetch a history of internal transfers made on an account
6825
6825
  :see: https://www.bitget.com/api-doc/spot/account/Get-Account-TransferRecords
ccxt/bitmart.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.bitmart import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currencies, Currency, Int, IsolatedBorrowRate, IsolatedBorrowRates, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry, TransferEntries
9
+ from ccxt.base.types import Balances, Currencies, Currency, Int, IsolatedBorrowRate, IsolatedBorrowRates, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -3819,7 +3819,7 @@ class bitmart(Exchange, ImplicitAPI):
3819
3819
  'status': self.parse_transfer_status(self.safe_string(transfer, 'state')),
3820
3820
  }
3821
3821
 
3822
- def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
3822
+ def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
3823
3823
  """
3824
3824
  fetch a history of internal transfers made on an account, only transfers between spot and swap are supported
3825
3825
  :see: https://developer-pro.bitmart.com/en/futures/#get-transfer-list-signed
ccxt/bitrue.py CHANGED
@@ -7,7 +7,7 @@ from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.bitrue import ImplicitAPI
8
8
  import hashlib
9
9
  import json
10
- from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry, TransferEntries
10
+ from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
13
  from ccxt.base.errors import AuthenticationError
@@ -2727,7 +2727,7 @@ class bitrue(Exchange, ImplicitAPI):
2727
2727
  'status': 'ok',
2728
2728
  }
2729
2729
 
2730
- def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
2730
+ def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
2731
2731
  """
2732
2732
  fetch a history of internal transfers made on an account
2733
2733
  :see: https://www.bitrue.com/api-docs#get-future-account-transfer-history-list-user_data-hmac-sha256
ccxt/blofin.py CHANGED
@@ -29,6 +29,7 @@ class blofin(Exchange, ImplicitAPI):
29
29
  'countries': ['US'],
30
30
  'version': 'v1',
31
31
  'rateLimit': 100,
32
+ 'pro': True,
32
33
  'has': {
33
34
  'CORS': None,
34
35
  'spot': False,
@@ -103,7 +104,7 @@ class blofin(Exchange, ImplicitAPI):
103
104
  'fetchOpenInterestHistory': False,
104
105
  'fetchOpenOrder': None,
105
106
  'fetchOpenOrders': True,
106
- 'fetchOrder': True,
107
+ 'fetchOrder': None,
107
108
  'fetchOrderBook': True,
108
109
  'fetchOrderBooks': False,
109
110
  'fetchOrders': False,
@@ -153,11 +154,12 @@ class blofin(Exchange, ImplicitAPI):
153
154
  '2h': '2H',
154
155
  '4h': '4H',
155
156
  '6h': '6H',
157
+ '8h': '8H',
156
158
  '12h': '12H',
157
159
  '1d': '1D',
160
+ '3d': '3D',
158
161
  '1w': '1W',
159
162
  '1M': '1M',
160
- '3M': '3M',
161
163
  },
162
164
  'hostname': 'www.blofin.com',
163
165
  'urls': {
@@ -492,6 +494,25 @@ class blofin(Exchange, ImplicitAPI):
492
494
  return self.parse_order_book(first, symbol, timestamp)
493
495
 
494
496
  def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
497
+ #
498
+ # response similar for REST & WS
499
+ #
500
+ # {
501
+ # instId: "ADA-USDT",
502
+ # ts: "1707736811486",
503
+ # last: "0.5315",
504
+ # lastSize: "4",
505
+ # askPrice: "0.5318",
506
+ # askSize: "248",
507
+ # bidPrice: "0.5315",
508
+ # bidSize: "63",
509
+ # open24h: "0.5555",
510
+ # high24h: "0.5563",
511
+ # low24h: "0.5315",
512
+ # volCurrency24h: "198560100",
513
+ # vol24h: "1985601",
514
+ # }
515
+ #
495
516
  timestamp = self.safe_integer(ticker, 'ts')
496
517
  marketId = self.safe_string(ticker, 'instId')
497
518
  market = self.safe_market(marketId, market, '-')
@@ -560,7 +581,8 @@ class blofin(Exchange, ImplicitAPI):
560
581
 
561
582
  def parse_trade(self, trade: dict, market: Market = None) -> Trade:
562
583
  #
563
- # fetch trades
584
+ # fetch trades(response similar for REST & WS)
585
+ #
564
586
  # {
565
587
  # "tradeId": "3263934920",
566
588
  # "instId": "LTC-USDT",
@@ -569,6 +591,7 @@ class blofin(Exchange, ImplicitAPI):
569
591
  # "side": "buy",
570
592
  # "ts": "1707232020854"
571
593
  # }
594
+ #
572
595
  # my trades
573
596
  # {
574
597
  # "instId": "LTC-USDT",
@@ -825,9 +848,11 @@ class blofin(Exchange, ImplicitAPI):
825
848
  if type:
826
849
  return self.parse_funding_balance(response)
827
850
  else:
828
- return self.parse_trading_balance(response)
851
+ return self.parse_balance(response)
829
852
 
830
- def parse_trading_balance(self, response):
853
+ def parse_balance(self, response):
854
+ #
855
+ # "data" similar for REST & WS
831
856
  #
832
857
  # {
833
858
  # "code": "0",
@@ -849,7 +874,8 @@ class blofin(Exchange, ImplicitAPI):
849
874
  # "orderFrozen": "14920.994472632597427761",
850
875
  # "equityUsd": "10011254.077985990315787910",
851
876
  # "isolatedUnrealizedPnl": "-22.151999999999999999952",
852
- # "bonus": "0"
877
+ # "bonus": "0" # present only in REST
878
+ # "unrealizedPnl": "0" # present only in WS
853
879
  # }
854
880
  # ]
855
881
  # }
@@ -998,6 +1024,8 @@ class blofin(Exchange, ImplicitAPI):
998
1024
  return self.safe_string(statuses, status, status)
999
1025
 
1000
1026
  def parse_order(self, order: dict, market: Market = None) -> Order:
1027
+ #
1028
+ # response similar for REST & WS
1001
1029
  #
1002
1030
  # {
1003
1031
  # "orderId": "2075628533",
@@ -1026,6 +1054,9 @@ class blofin(Exchange, ImplicitAPI):
1026
1054
  # "cancelSource": "not_canceled",
1027
1055
  # "cancelSourceReason": null,
1028
1056
  # "brokerId": "ec6dd3a7dd982d0b"
1057
+ # "filled_amount": "1.000000000000000000", # filledAmount in "ws" watchOrders
1058
+ # "cancelSource": "", # only in WS
1059
+ # "instType": "SWAP", # only in WS
1029
1060
  # }
1030
1061
  #
1031
1062
  id = self.safe_string_2(order, 'tpslId', 'orderId')
@@ -1695,6 +1726,32 @@ class blofin(Exchange, ImplicitAPI):
1695
1726
  return self.filter_by_array_positions(result, 'symbol', symbols, False)
1696
1727
 
1697
1728
  def parse_position(self, position: dict, market: Market = None):
1729
+ #
1730
+ # response similar for REST & WS
1731
+ #
1732
+ # {
1733
+ # instType: 'SWAP',
1734
+ # instId: 'LTC-USDT',
1735
+ # marginMode: 'cross',
1736
+ # positionId: '644159',
1737
+ # positionSide: 'net',
1738
+ # positions: '1',
1739
+ # availablePositions: '1',
1740
+ # averagePrice: '68.16',
1741
+ # unrealizedPnl: '0.80631223',
1742
+ # unrealizedPnlRatio: '0.03548909463028169',
1743
+ # leverage: '3',
1744
+ # liquidationPrice: '10.116655172370356435',
1745
+ # markPrice: '68.96',
1746
+ # initialMargin: '22.988770743333333333',
1747
+ # margin: '', # self field might not exist in rest response
1748
+ # marginRatio: '152.523509620342499273',
1749
+ # maintenanceMargin: '0.34483156115',
1750
+ # adl: '4',
1751
+ # createTime: '1707235776528',
1752
+ # updateTime: '1707235776528'
1753
+ # }
1754
+ #
1698
1755
  marketId = self.safe_string(position, 'instId')
1699
1756
  market = self.safe_market(marketId, market)
1700
1757
  symbol = market['symbol']
ccxt/btcbox.py CHANGED
@@ -648,7 +648,7 @@ class btcbox(Exchange, ImplicitAPI):
648
648
  'nonce': nonce,
649
649
  }, params)
650
650
  request = self.urlencode(query)
651
- secret = self.hash(self.encode(self.secret), 'sha256')
651
+ secret = self.hash(self.encode(self.secret), 'md5')
652
652
  query['signature'] = self.hmac(self.encode(request), self.encode(secret), hashlib.sha256)
653
653
  body = self.urlencode(query)
654
654
  headers = {
ccxt/bybit.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.bybit import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, CrossBorrowRate, Currencies, Currency, Greeks, Int, Leverage, LeverageTier, LeverageTiers, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry, TransferEntries
9
+ from ccxt.base.types import Balances, CrossBorrowRate, Currencies, Currency, Greeks, Int, Leverage, LeverageTier, LeverageTiers, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -6718,7 +6718,7 @@ class bybit(Exchange, ImplicitAPI):
6718
6718
  'status': status,
6719
6719
  })
6720
6720
 
6721
- def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
6721
+ def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
6722
6722
  """
6723
6723
  fetch a history of internal transfers made on an account
6724
6724
  :see: https://bybit-exchange.github.io/docs/v5/asset/inter-transfer-list
@@ -7624,7 +7624,7 @@ class bybit(Exchange, ImplicitAPI):
7624
7624
  quoteValueString = Precise.string_mul(baseValueString, priceString)
7625
7625
  return self.safe_liquidation({
7626
7626
  'info': liquidation,
7627
- 'symbol': self.safe_symbol(marketId, market),
7627
+ 'symbol': self.safe_symbol(marketId, market, None, 'contract'),
7628
7628
  'contracts': self.parse_number(contractsString),
7629
7629
  'contractSize': self.parse_number(contractSizeString),
7630
7630
  'price': self.parse_number(priceString),