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/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.3.68'
25
+ __version__ = '4.3.70'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -9,7 +9,7 @@ class ImplicitAPI:
9
9
  v1_public_get_instruments_instrument = v1PublicGetInstrumentsInstrument = Entry('instruments/{instrument}', ['v1', 'public'], 'GET', {})
10
10
  v1_public_get_instruments_instrument_quote = v1PublicGetInstrumentsInstrumentQuote = Entry('instruments/{instrument}/quote', ['v1', 'public'], 'GET', {})
11
11
  v1_public_get_instruments_instrument_funding = v1PublicGetInstrumentsInstrumentFunding = Entry('instruments/{instrument}/funding', ['v1', 'public'], 'GET', {})
12
- v1_public_get = v1PublicGet = Entry('', ['v1', 'public'], 'GET', {})
12
+ v1_public_get_instruments_instrument_candles = v1PublicGetInstrumentsInstrumentCandles = Entry('instruments/{instrument}/candles', ['v1', 'public'], 'GET', {})
13
13
  v1_private_get_orders = v1PrivateGetOrders = Entry('orders', ['v1', 'private'], 'GET', {})
14
14
  v1_private_get_orders_id = v1PrivateGetOrdersId = Entry('orders/{id}', ['v1', 'private'], 'GET', {})
15
15
  v1_private_get_portfolios = v1PrivateGetPortfolios = Entry('portfolios', ['v1', 'private'], 'GET', {})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.68'
7
+ __version__ = '4.3.70'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.3.68'
5
+ __version__ = '4.3.70'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -8,7 +8,7 @@ from ccxt.abstract.binance import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
10
  import json
11
- from ccxt.base.types import Balances, Conversion, CrossBorrowRate, Currencies, Currency, Greeks, Int, IsolatedBorrowRate, IsolatedBorrowRates, Leverage, Leverages, LeverageTier, LeverageTiers, MarginMode, MarginModes, MarginModification, Market, MarketInterface, Num, Option, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry, TransferEntries
11
+ from ccxt.base.types import Balances, Conversion, CrossBorrowRate, Currencies, Currency, Greeks, Int, IsolatedBorrowRate, IsolatedBorrowRates, Leverage, Leverages, LeverageTier, LeverageTiers, MarginMode, MarginModes, MarginModification, Market, MarketInterface, Num, Option, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
12
12
  from typing import List
13
13
  from ccxt.base.errors import ExchangeError
14
14
  from ccxt.base.errors import AuthenticationError
@@ -7801,7 +7801,7 @@ class binance(Exchange, ImplicitAPI):
7801
7801
  #
7802
7802
  return self.parse_transfer(response, currency)
7803
7803
 
7804
- async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
7804
+ async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
7805
7805
  """
7806
7806
  fetch a history of internal transfers made on an account
7807
7807
  :see: https://developers.binance.com/docs/wallet/asset/query-user-universal-transfer
@@ -8,7 +8,7 @@ from ccxt.abstract.bingx import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
10
  import numbers
11
- 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
11
+ 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
12
12
  from typing import List
13
13
  from ccxt.base.errors import ExchangeError
14
14
  from ccxt.base.errors import AuthenticationError
@@ -1111,7 +1111,27 @@ class bingx(Exchange, ImplicitAPI):
1111
1111
  # "s": "BTC-USDT"
1112
1112
  # }
1113
1113
  #
1114
- time = self.safe_integer_n(trade, ['time', 'filledTm', 'T'])
1114
+ # inverse swap fetchMyTrades
1115
+ #
1116
+ # {
1117
+ # "orderId": "1817441228670648320",
1118
+ # "symbol": "SOL-USD",
1119
+ # "type": "MARKET",
1120
+ # "side": "BUY",
1121
+ # "positionSide": "LONG",
1122
+ # "tradeId": "97244554",
1123
+ # "volume": "2",
1124
+ # "tradePrice": "182.652",
1125
+ # "amount": "20.00000000",
1126
+ # "realizedPnl": "0.00000000",
1127
+ # "commission": "-0.00005475",
1128
+ # "currency": "SOL",
1129
+ # "buyer": True,
1130
+ # "maker": False,
1131
+ # "tradeTime": 1722146730000
1132
+ # }
1133
+ #
1134
+ time = self.safe_integer_n(trade, ['time', 'filledTm', 'T', 'tradeTime'])
1115
1135
  datetimeId = self.safe_string(trade, 'filledTm')
1116
1136
  if datetimeId is not None:
1117
1137
  time = self.parse8601(datetimeId)
@@ -1122,8 +1142,8 @@ class bingx(Exchange, ImplicitAPI):
1122
1142
  currencyId = self.safe_string_n(trade, ['currency', 'N', 'commissionAsset'])
1123
1143
  currencyCode = self.safe_currency_code(currencyId)
1124
1144
  m = self.safe_bool(trade, 'm')
1125
- marketId = self.safe_string(trade, 's')
1126
- isBuyerMaker = self.safe_bool_2(trade, 'buyerMaker', 'isBuyerMaker')
1145
+ marketId = self.safe_string_2(trade, 's', 'symbol')
1146
+ isBuyerMaker = self.safe_bool_n(trade, ['buyerMaker', 'isBuyerMaker', 'maker'])
1127
1147
  takeOrMaker = None
1128
1148
  if (isBuyerMaker is not None) or (m is not None):
1129
1149
  takeOrMaker = 'maker' if (isBuyerMaker or m) else 'taker'
@@ -1154,7 +1174,7 @@ class bingx(Exchange, ImplicitAPI):
1154
1174
  'type': self.safe_string_lower(trade, 'o'),
1155
1175
  'side': self.parse_order_side(side),
1156
1176
  'takerOrMaker': takeOrMaker,
1157
- 'price': self.safe_string_2(trade, 'price', 'p'),
1177
+ 'price': self.safe_string_n(trade, ['price', 'p', 'tradePrice']),
1158
1178
  'amount': amount,
1159
1179
  'cost': cost,
1160
1180
  'fee': {
@@ -3985,7 +4005,7 @@ class bingx(Exchange, ImplicitAPI):
3985
4005
  'status': None,
3986
4006
  }
3987
4007
 
3988
- async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
4008
+ async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
3989
4009
  """
3990
4010
  fetch a history of internal transfers made on an account
3991
4011
  :see: https://bingx-api.github.io/docs/#/spot/account-api.html#Query%20User%20Universal%20Transfer%20History%20(USER_DATA)
@@ -4597,93 +4617,129 @@ class bingx(Exchange, ImplicitAPI):
4597
4617
  async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
4598
4618
  """
4599
4619
  fetch all trades made by the user
4600
- :see: https://bingx-api.github.io/docs/#/en-us/spot/trade-api.html#Query%20Order%20History
4601
- :see: https://bingx-api.github.io/docs/#/swapV2/trade-api.html#Query%20historical%20transaction%20orders
4620
+ :see: https://bingx-api.github.io/docs/#/en-us/spot/trade-api.html#Query%20transaction%20details
4621
+ :see: https://bingx-api.github.io/docs/#/en-us/swapV2/trade-api.html#Query%20historical%20transaction%20orders
4622
+ :see: https://bingx-api.github.io/docs/#/en-us/cswap/trade-api.html#Query%20Order%20Trade%20Detail
4602
4623
  :param str [symbol]: unified market symbol
4603
4624
  :param int [since]: the earliest time in ms to fetch trades for
4604
4625
  :param int [limit]: the maximum number of trades structures to retrieve
4605
4626
  :param dict [params]: extra parameters specific to the exchange API endpoint
4606
4627
  :param int [params.until]: timestamp in ms for the ending date filter, default is None
4607
4628
  :param str params['trandingUnit']: COIN(directly represent assets such and ETH) or CONT(represents the number of contract sheets)
4629
+ :param str params['orderId']: the order id required for inverse swap
4608
4630
  :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
4609
4631
  """
4610
4632
  if symbol is None:
4611
4633
  raise ArgumentsRequired(self.id + ' fetchMyTrades() requires a symbol argument')
4612
4634
  await self.load_markets()
4613
4635
  market = self.market(symbol)
4614
- now = self.milliseconds()
4615
- response = None
4616
- request: dict = {
4617
- 'symbol': market['id'],
4618
- }
4619
- if since is not None:
4620
- startTimeReq = 'startTime' if market['spot'] else 'startTs'
4621
- request[startTimeReq] = since
4622
- elif market['swap']:
4623
- request['startTs'] = now - 7776000000 # 90 days
4624
- until = self.safe_integer(params, 'until')
4625
- params = self.omit(params, 'until')
4626
- if until is not None:
4627
- endTimeReq = 'endTime' if market['spot'] else 'endTs'
4628
- request[endTimeReq] = until
4629
- elif market['swap']:
4630
- request['endTs'] = now
4636
+ request: dict = {}
4631
4637
  fills = None
4632
- if market['spot']:
4633
- response = await self.spotV1PrivateGetTradeMyTrades(self.extend(request, params))
4634
- data = self.safe_dict(response, 'data', {})
4635
- fills = self.safe_list(data, 'fills', [])
4638
+ response = None
4639
+ subType = None
4640
+ subType, params = self.handle_sub_type_and_params('fetchMyTrades', market, params)
4641
+ if subType == 'inverse':
4642
+ orderId = self.safe_string(params, 'orderId')
4643
+ if orderId is None:
4644
+ raise ArgumentsRequired(self.id + ' fetchMyTrades() requires an orderId argument for inverse swap trades')
4645
+ response = await self.cswapV1PrivateGetTradeAllFillOrders(self.extend(request, params))
4646
+ fills = self.safe_list(response, 'data', [])
4636
4647
  #
4637
4648
  # {
4638
4649
  # "code": 0,
4639
4650
  # "msg": "",
4640
- # "debugMsg": "",
4641
- # "data": {
4642
- # "fills": [
4643
- # {
4644
- # "symbol": "LTC-USDT",
4645
- # "id": 36237072,
4646
- # "orderId": 1674069326895775744,
4647
- # "price": "85.891",
4648
- # "qty": "0.0582",
4649
- # "quoteQty": "4.9988562000000005",
4650
- # "commission": -0.00005820000000000001,
4651
- # "commissionAsset": "LTC",
4652
- # "time": 1687964205000,
4653
- # "isBuyer": True,
4654
- # "isMaker": False
4655
- # }
4656
- # ]
4657
- # }
4651
+ # "timestamp": 1722147756019,
4652
+ # "data": [
4653
+ # {
4654
+ # "orderId": "1817441228670648320",
4655
+ # "symbol": "SOL-USD",
4656
+ # "type": "MARKET",
4657
+ # "side": "BUY",
4658
+ # "positionSide": "LONG",
4659
+ # "tradeId": "97244554",
4660
+ # "volume": "2",
4661
+ # "tradePrice": "182.652",
4662
+ # "amount": "20.00000000",
4663
+ # "realizedPnl": "0.00000000",
4664
+ # "commission": "-0.00005475",
4665
+ # "currency": "SOL",
4666
+ # "buyer": True,
4667
+ # "maker": False,
4668
+ # "tradeTime": 1722146730000
4669
+ # }
4670
+ # ]
4658
4671
  # }
4659
4672
  #
4660
4673
  else:
4661
- tradingUnit = self.safe_string_upper(params, 'tradingUnit', 'CONT')
4662
- params = self.omit(params, 'tradingUnit')
4663
- request['tradingUnit'] = tradingUnit
4664
- response = await self.swapV2PrivateGetTradeAllFillOrders(self.extend(request, params))
4665
- data = self.safe_dict(response, 'data', {})
4666
- fills = self.safe_list(data, 'fill_orders', [])
4667
- #
4668
- # {
4669
- # "code": "0",
4670
- # "msg": '',
4671
- # "data": {fill_orders: [
4672
- # {
4673
- # "volume": "0.1",
4674
- # "price": "106.75",
4675
- # "amount": "10.6750",
4676
- # "commission": "-0.0053",
4677
- # "currency": "USDT",
4678
- # "orderId": "1676213270274379776",
4679
- # "liquidatedPrice": "0.00",
4680
- # "liquidatedMarginRatio": "0.00",
4681
- # "filledTime": "2023-07-04T20:56:01.000+0800"
4682
- # }
4683
- # ]
4684
- # }
4685
- # }
4686
- #
4674
+ request['symbol'] = market['id']
4675
+ now = self.milliseconds()
4676
+ if since is not None:
4677
+ startTimeReq = 'startTime' if market['spot'] else 'startTs'
4678
+ request[startTimeReq] = since
4679
+ elif market['swap']:
4680
+ request['startTs'] = now - 7776000000 # 90 days
4681
+ until = self.safe_integer(params, 'until')
4682
+ params = self.omit(params, 'until')
4683
+ if until is not None:
4684
+ endTimeReq = 'endTime' if market['spot'] else 'endTs'
4685
+ request[endTimeReq] = until
4686
+ elif market['swap']:
4687
+ request['endTs'] = now
4688
+ if market['spot']:
4689
+ response = await self.spotV1PrivateGetTradeMyTrades(self.extend(request, params))
4690
+ data = self.safe_dict(response, 'data', {})
4691
+ fills = self.safe_list(data, 'fills', [])
4692
+ #
4693
+ # {
4694
+ # "code": 0,
4695
+ # "msg": "",
4696
+ # "debugMsg": "",
4697
+ # "data": {
4698
+ # "fills": [
4699
+ # {
4700
+ # "symbol": "LTC-USDT",
4701
+ # "id": 36237072,
4702
+ # "orderId": 1674069326895775744,
4703
+ # "price": "85.891",
4704
+ # "qty": "0.0582",
4705
+ # "quoteQty": "4.9988562000000005",
4706
+ # "commission": -0.00005820000000000001,
4707
+ # "commissionAsset": "LTC",
4708
+ # "time": 1687964205000,
4709
+ # "isBuyer": True,
4710
+ # "isMaker": False
4711
+ # }
4712
+ # ]
4713
+ # }
4714
+ # }
4715
+ #
4716
+ else:
4717
+ tradingUnit = self.safe_string_upper(params, 'tradingUnit', 'CONT')
4718
+ params = self.omit(params, 'tradingUnit')
4719
+ request['tradingUnit'] = tradingUnit
4720
+ response = await self.swapV2PrivateGetTradeAllFillOrders(self.extend(request, params))
4721
+ data = self.safe_dict(response, 'data', {})
4722
+ fills = self.safe_list(data, 'fill_orders', [])
4723
+ #
4724
+ # {
4725
+ # "code": "0",
4726
+ # "msg": '',
4727
+ # "data": {fill_orders: [
4728
+ # {
4729
+ # "volume": "0.1",
4730
+ # "price": "106.75",
4731
+ # "amount": "10.6750",
4732
+ # "commission": "-0.0053",
4733
+ # "currency": "USDT",
4734
+ # "orderId": "1676213270274379776",
4735
+ # "liquidatedPrice": "0.00",
4736
+ # "liquidatedMarginRatio": "0.00",
4737
+ # "filledTime": "2023-07-04T20:56:01.000+0800"
4738
+ # }
4739
+ # ]
4740
+ # }
4741
+ # }
4742
+ #
4687
4743
  return self.parse_trades(fills, market, since, limit, params)
4688
4744
 
4689
4745
  def parse_deposit_withdraw_fee(self, fee, currency: Currency = None):
@@ -8,7 +8,7 @@ from ccxt.abstract.bitget import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
10
  import json
11
- 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
11
+ 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
12
12
  from typing import List
13
13
  from ccxt.base.errors import ExchangeError
14
14
  from ccxt.base.errors import AuthenticationError
@@ -6820,7 +6820,7 @@ class bitget(Exchange, ImplicitAPI):
6820
6820
  'info': interest,
6821
6821
  }, market)
6822
6822
 
6823
- async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
6823
+ async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
6824
6824
  """
6825
6825
  fetch a history of internal transfers made on an account
6826
6826
  :see: https://www.bitget.com/api-doc/spot/account/Get-Account-TransferRecords
@@ -6,7 +6,7 @@
6
6
  from ccxt.async_support.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
- async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
3822
+ async 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
@@ -8,7 +8,7 @@ from ccxt.abstract.bitrue import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
10
  import json
11
- from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry, TransferEntries
11
+ from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
12
12
  from typing import List
13
13
  from ccxt.base.errors import ExchangeError
14
14
  from ccxt.base.errors import AuthenticationError
@@ -2728,7 +2728,7 @@ class bitrue(Exchange, ImplicitAPI):
2728
2728
  'status': 'ok',
2729
2729
  }
2730
2730
 
2731
- async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
2731
+ async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
2732
2732
  """
2733
2733
  fetch a history of internal transfers made on an account
2734
2734
  :see: https://www.bitrue.com/api-docs#get-future-account-transfer-history-list-user_data-hmac-sha256
@@ -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']
@@ -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 = {
@@ -7,7 +7,7 @@ from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.bybit import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
- 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
10
+ 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
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
13
  from ccxt.base.errors import AuthenticationError
@@ -6719,7 +6719,7 @@ class bybit(Exchange, ImplicitAPI):
6719
6719
  'status': status,
6720
6720
  })
6721
6721
 
6722
- async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
6722
+ async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
6723
6723
  """
6724
6724
  fetch a history of internal transfers made on an account
6725
6725
  :see: https://bybit-exchange.github.io/docs/v5/asset/inter-transfer-list
@@ -7625,7 +7625,7 @@ class bybit(Exchange, ImplicitAPI):
7625
7625
  quoteValueString = Precise.string_mul(baseValueString, priceString)
7626
7626
  return self.safe_liquidation({
7627
7627
  'info': liquidation,
7628
- 'symbol': self.safe_symbol(marketId, market),
7628
+ 'symbol': self.safe_symbol(marketId, market, None, 'contract'),
7629
7629
  'contracts': self.parse_number(contractsString),
7630
7630
  'contractSize': self.parse_number(contractSizeString),
7631
7631
  'price': self.parse_number(priceString),