ccxt 4.4.85__py2.py3-none-any.whl → 4.4.86__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.
Files changed (54) hide show
  1. ccxt/__init__.py +3 -5
  2. ccxt/abstract/myokx.py +2 -0
  3. ccxt/abstract/okx.py +2 -0
  4. ccxt/ascendex.py +187 -151
  5. ccxt/async_support/__init__.py +3 -5
  6. ccxt/async_support/ascendex.py +187 -151
  7. ccxt/async_support/base/exchange.py +26 -22
  8. ccxt/async_support/bequant.py +1 -1
  9. ccxt/async_support/bitget.py +4 -4
  10. ccxt/async_support/bitmart.py +1 -1
  11. ccxt/async_support/{huobijp.py → bittrade.py} +11 -11
  12. ccxt/async_support/coinbase.py +2 -5
  13. ccxt/async_support/deribit.py +4 -5
  14. ccxt/async_support/hollaex.py +106 -49
  15. ccxt/async_support/htx.py +20 -43
  16. ccxt/async_support/hyperliquid.py +4 -4
  17. ccxt/async_support/mexc.py +2 -2
  18. ccxt/async_support/ndax.py +25 -24
  19. ccxt/async_support/okcoin.py +12 -29
  20. ccxt/async_support/okx.py +9 -0
  21. ccxt/async_support/onetrading.py +10 -7
  22. ccxt/async_support/oxfun.py +40 -110
  23. ccxt/async_support/paradex.py +3 -0
  24. ccxt/base/exchange.py +1 -1
  25. ccxt/bequant.py +1 -1
  26. ccxt/bitget.py +4 -4
  27. ccxt/bitmart.py +1 -1
  28. ccxt/{huobijp.py → bittrade.py} +11 -11
  29. ccxt/coinbase.py +2 -5
  30. ccxt/deribit.py +4 -5
  31. ccxt/hollaex.py +106 -49
  32. ccxt/htx.py +20 -43
  33. ccxt/hyperliquid.py +4 -4
  34. ccxt/mexc.py +2 -2
  35. ccxt/ndax.py +25 -24
  36. ccxt/okcoin.py +12 -29
  37. ccxt/okx.py +9 -0
  38. ccxt/onetrading.py +10 -7
  39. ccxt/oxfun.py +40 -110
  40. ccxt/paradex.py +3 -0
  41. ccxt/pro/__init__.py +41 -3
  42. ccxt/pro/binance.py +1 -0
  43. ccxt/pro/{huobijp.py → bittrade.py} +3 -3
  44. ccxt/pro/luno.py +6 -5
  45. ccxt/pro/mexc.py +2 -0
  46. {ccxt-4.4.85.dist-info → ccxt-4.4.86.dist-info}/METADATA +7 -8
  47. {ccxt-4.4.85.dist-info → ccxt-4.4.86.dist-info}/RECORD +51 -54
  48. ccxt/abstract/kuna.py +0 -182
  49. ccxt/async_support/kuna.py +0 -1935
  50. ccxt/kuna.py +0 -1935
  51. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  52. {ccxt-4.4.85.dist-info → ccxt-4.4.86.dist-info}/LICENSE.txt +0 -0
  53. {ccxt-4.4.85.dist-info → ccxt-4.4.86.dist-info}/WHEEL +0 -0
  54. {ccxt-4.4.85.dist-info → ccxt-4.4.86.dist-info}/top_level.txt +0 -0
@@ -25,7 +25,6 @@ from ccxt.base.errors import NetworkError
25
25
  from ccxt.base.errors import RateLimitExceeded
26
26
  from ccxt.base.errors import RequestTimeout
27
27
  from ccxt.base.decimal_to_precision import TICK_SIZE
28
- from ccxt.base.precise import Precise
29
28
 
30
29
 
31
30
  class oxfun(Exchange, ImplicitAPI):
@@ -613,66 +612,7 @@ class oxfun(Exchange, ImplicitAPI):
613
612
  # "minDeposit": "0.00010",
614
613
  # "minWithdrawal": "0.00010"
615
614
  # },
616
- # {
617
- # "network": "Arbitrum",
618
- # "tokenId": "0xba0Dda8762C24dA9487f5FA026a9B64b695A07Ea",
619
- # "transactionPrecision": "18",
620
- # "isWithdrawalFeeChargedToUser": True,
621
- # "canDeposit": True,
622
- # "canWithdraw": True,
623
- # "minDeposit": "0.00010",
624
- # "minWithdrawal": "0.00010"
625
- # },
626
- # {
627
- # "network": "Ethereum",
628
- # "tokenId": "0xba0Dda8762C24dA9487f5FA026a9B64b695A07Ea",
629
- # "transactionPrecision": "18",
630
- # "isWithdrawalFeeChargedToUser": True,
631
- # "canDeposit": True,
632
- # "canWithdraw": True,
633
- # "minDeposit": "0.00010",
634
- # "minWithdrawal": "0.00010"
635
- # },
636
- # {
637
- # "network": "Arbitrum",
638
- # "tokenId": "0x78a0A62Fba6Fb21A83FE8a3433d44C73a4017A6f",
639
- # "transactionPrecision": "18",
640
- # "isWithdrawalFeeChargedToUser": True,
641
- # "canDeposit": True,
642
- # "canWithdraw": False,
643
- # "minDeposit": "0.00010",
644
- # "minWithdrawal": "0.00010"
645
- # },
646
- # {
647
- # "network": "Avalanche",
648
- # "tokenId": "0x78a0A62Fba6Fb21A83FE8a3433d44C73a4017A6f",
649
- # "transactionPrecision": "18",
650
- # "isWithdrawalFeeChargedToUser": True,
651
- # "canDeposit": True,
652
- # "canWithdraw": False,
653
- # "minDeposit": "0.00010",
654
- # "minWithdrawal": "0.00010"
655
- # },
656
- # {
657
- # "network": "Solana",
658
- # "tokenId": "DV3845GEAVXfwpyVGGgWbqBVCtzHdCXNCGfcdboSEuZz",
659
- # "transactionPrecision": "8",
660
- # "isWithdrawalFeeChargedToUser": True,
661
- # "canDeposit": True,
662
- # "canWithdraw": True,
663
- # "minDeposit": "0.00010",
664
- # "minWithdrawal": "0.00010"
665
- # },
666
- # {
667
- # "network": "Ethereum",
668
- # "tokenId": "0x78a0A62Fba6Fb21A83FE8a3433d44C73a4017A6f",
669
- # "transactionPrecision": "18",
670
- # "isWithdrawalFeeChargedToUser": True,
671
- # "canDeposit": True,
672
- # "canWithdraw": False,
673
- # "minDeposit": "0.00010",
674
- # "minWithdrawal": "0.00010"
675
- # }
615
+ # ...
676
616
  # ]
677
617
  # },
678
618
  # {
@@ -722,74 +662,64 @@ class oxfun(Exchange, ImplicitAPI):
722
662
  parts = fullId.split('.')
723
663
  id = parts[0]
724
664
  code = self.safe_currency_code(id)
725
- networks: dict = {}
665
+ if not (code in result):
666
+ result[code] = {
667
+ 'id': id,
668
+ 'code': code,
669
+ 'precision': None,
670
+ 'type': None,
671
+ 'name': None,
672
+ 'active': None,
673
+ 'deposit': None,
674
+ 'withdraw': None,
675
+ 'fee': None,
676
+ 'limits': {
677
+ 'withdraw': {
678
+ 'min': None,
679
+ 'max': None,
680
+ },
681
+ 'deposit': {
682
+ 'min': None,
683
+ 'max': None,
684
+ },
685
+ },
686
+ 'networks': {},
687
+ 'info': [],
688
+ }
726
689
  chains = self.safe_list(currency, 'networkList', [])
727
- currencyMaxPrecision: Str = None
728
- currencyDepositEnabled: Bool = None
729
- currencyWithdrawEnabled: Bool = None
730
690
  for j in range(0, len(chains)):
731
691
  chain = chains[j]
732
692
  networkId = self.safe_string(chain, 'network')
733
693
  networkCode = self.network_id_to_code(networkId)
734
- deposit = self.safe_bool(chain, 'canDeposit')
735
- withdraw = self.safe_bool(chain, 'canWithdraw')
736
- active = (deposit and withdraw)
737
- minDeposit = self.safe_string(chain, 'minDeposit')
738
- minWithdrawal = self.safe_string(chain, 'minWithdrawal')
739
- precision = self.parse_precision(self.safe_string(chain, 'transactionPrecision'))
740
- networks[networkCode] = {
694
+ result[code]['networks'][networkCode] = {
741
695
  'id': networkId,
742
696
  'network': networkCode,
743
697
  'margin': None,
744
- 'deposit': deposit,
745
- 'withdraw': withdraw,
746
- 'active': active,
698
+ 'deposit': self.safe_bool(chain, 'canDeposit'),
699
+ 'withdraw': self.safe_bool(chain, 'canWithdraw'),
700
+ 'active': None,
747
701
  'fee': None,
748
- 'precision': self.parse_number(precision),
702
+ 'precision': self.parse_number(self.parse_precision(self.safe_string(chain, 'transactionPrecision'))),
749
703
  'limits': {
750
704
  'deposit': {
751
- 'min': minDeposit,
705
+ 'min': self.safe_number(chain, 'minDeposit'),
752
706
  'max': None,
753
707
  },
754
708
  'withdraw': {
755
- 'min': minWithdrawal,
709
+ 'min': self.safe_number(chain, 'minWithdrawal'),
756
710
  'max': None,
757
711
  },
758
712
  },
759
713
  'info': chain,
760
714
  }
761
- if (currencyDepositEnabled is None) or deposit:
762
- currencyDepositEnabled = deposit
763
- if (currencyWithdrawEnabled is None) or withdraw:
764
- currencyWithdrawEnabled = withdraw
765
- if (currencyMaxPrecision is None) or Precise.string_gt(currencyMaxPrecision, precision):
766
- currencyMaxPrecision = precision
767
- if code in result:
768
- # checking for specific ids.ARB
769
- networks = self.extend(result[code]['networks'], networks)
770
- result[code] = {
771
- 'id': id,
772
- 'code': code,
773
- 'name': None,
774
- 'type': None,
775
- 'active': None,
776
- 'deposit': currencyDepositEnabled,
777
- 'withdraw': currencyWithdrawEnabled,
778
- 'fee': None,
779
- 'precision': self.parse_number(currencyMaxPrecision),
780
- 'limits': {
781
- 'amount': {
782
- 'min': None,
783
- 'max': None,
784
- },
785
- 'withdraw': {
786
- 'min': None,
787
- 'max': None,
788
- },
789
- },
790
- 'networks': networks,
791
- 'info': currency,
792
- }
715
+ infos = self.safe_list(result[code], 'info', [])
716
+ infos.append(currency)
717
+ result[code]['info'] = infos
718
+ # only after all entries are formed in currencies, restructure each entry
719
+ allKeys = list(result.keys())
720
+ for i in range(0, len(allKeys)):
721
+ code = allKeys[i]
722
+ result[code] = self.safe_currency_structure(result[code]) # self is needed after adding network entry
793
723
  return result
794
724
 
795
725
  async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
@@ -1245,7 +1245,10 @@ class paradex(Exchange, ImplicitAPI):
1245
1245
  price = self.safe_string(order, 'price')
1246
1246
  amount = self.safe_string(order, 'size')
1247
1247
  orderType = self.safe_string(order, 'type')
1248
+ cancelReason = self.safe_string(order, 'cancel_reason')
1248
1249
  status = self.safe_string(order, 'status')
1250
+ if cancelReason is not None:
1251
+ status = 'canceled'
1249
1252
  side = self.safe_string_lower(order, 'side')
1250
1253
  average = self.omit_zero(self.safe_string(order, 'avg_fill_price'))
1251
1254
  remaining = self.omit_zero(self.safe_string(order, 'remaining_size'))
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.85'
7
+ __version__ = '4.4.86'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/bequant.py CHANGED
@@ -14,8 +14,8 @@ class bequant(hitbtc, ImplicitAPI):
14
14
  return self.deep_extend(super(bequant, self).describe(), {
15
15
  'id': 'bequant',
16
16
  'name': 'Bequant',
17
- 'countries': ['MT'], # Malta
18
17
  'pro': True,
18
+ 'countries': ['MT'], # Malta
19
19
  'urls': {
20
20
  'logo': 'https://github.com/user-attachments/assets/0583ef1f-29fe-4b7c-8189-63565a0e2867',
21
21
  'api': {
ccxt/bitget.py CHANGED
@@ -2370,7 +2370,7 @@ class bitget(Exchange, ImplicitAPI):
2370
2370
  'coin': currency['id'],
2371
2371
  'address': address,
2372
2372
  'chain': networkId,
2373
- 'size': amount,
2373
+ 'size': self.currency_to_precision(code, amount, networkCode),
2374
2374
  'transferType': 'on_chain',
2375
2375
  }
2376
2376
  if tag is not None:
@@ -2394,8 +2394,6 @@ class bitget(Exchange, ImplicitAPI):
2394
2394
  fillResponseFromRequest = self.safe_bool(withdrawOptions, 'fillResponseFromRequest', True)
2395
2395
  if fillResponseFromRequest:
2396
2396
  result['currency'] = code
2397
- result['timestamp'] = self.milliseconds()
2398
- result['datetime'] = self.iso8601(self.milliseconds())
2399
2397
  result['amount'] = amount
2400
2398
  result['tag'] = tag
2401
2399
  result['address'] = address
@@ -2513,7 +2511,9 @@ class bitget(Exchange, ImplicitAPI):
2513
2511
  status = self.safe_string(transaction, 'status')
2514
2512
  tag = self.safe_string(transaction, 'tag')
2515
2513
  feeCostString = self.safe_string(transaction, 'fee')
2516
- feeCostAbsString = Precise.string_abs(feeCostString)
2514
+ feeCostAbsString = None
2515
+ if feeCostString is not None:
2516
+ feeCostAbsString = Precise.string_abs(feeCostString)
2517
2517
  fee = None
2518
2518
  amountString = self.safe_string(transaction, 'size')
2519
2519
  if feeCostAbsString is not None:
ccxt/bitmart.py CHANGED
@@ -2306,7 +2306,7 @@ class bitmart(Exchange, ImplicitAPI):
2306
2306
  code = self.safe_currency_code(currencyId)
2307
2307
  account = self.account()
2308
2308
  account['free'] = self.safe_string_2(balance, 'available', 'available_balance')
2309
- account['used'] = self.safe_string_2(balance, 'frozen', 'frozen_balance')
2309
+ account['used'] = self.safe_string_n(balance, ['unAvailable', 'frozen', 'frozen_balance'])
2310
2310
  result[code] = account
2311
2311
  return self.safe_balance(result)
2312
2312
 
@@ -4,7 +4,7 @@
4
4
  # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
- from ccxt.abstract.huobijp import ImplicitAPI
7
+ from ccxt.abstract.bittrade import ImplicitAPI
8
8
  import hashlib
9
9
  from ccxt.base.types import Account, Any, Balances, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
10
10
  from typing import List
@@ -27,12 +27,12 @@ from ccxt.base.decimal_to_precision import TICK_SIZE
27
27
  from ccxt.base.precise import Precise
28
28
 
29
29
 
30
- class huobijp(Exchange, ImplicitAPI):
30
+ class bittrade(Exchange, ImplicitAPI):
31
31
 
32
32
  def describe(self) -> Any:
33
- return self.deep_extend(super(huobijp, self).describe(), {
34
- 'id': 'huobijp',
35
- 'name': 'Huobi Japan',
33
+ return self.deep_extend(super(bittrade, self).describe(), {
34
+ 'id': 'bittrade',
35
+ 'name': 'BitTrade',
36
36
  'countries': ['JP'],
37
37
  'rateLimit': 100,
38
38
  'userAgent': self.userAgents['chrome39'],
@@ -108,10 +108,10 @@ class huobijp(Exchange, ImplicitAPI):
108
108
  'v2Public': 'https://{hostname}',
109
109
  'v2Private': 'https://{hostname}',
110
110
  },
111
- 'www': 'https://www.huobi.co.jp',
112
- 'referral': 'https://www.huobi.co.jp/register/?invite_code=znnq3',
113
- 'doc': 'https://api-doc.huobi.co.jp',
114
- 'fees': 'https://www.huobi.co.jp/support/fee',
111
+ 'www': 'https://www.bittrade.co.jp',
112
+ 'referral': 'https://www.bittrade.co.jp/register/?invite_code=znnq3',
113
+ 'doc': 'https://api-doc.bittrade.co.jp',
114
+ 'fees': 'https://www.bittrade.co.jp/ja-jp/support/fee',
115
115
  },
116
116
  'api': {
117
117
  'v2Public': {
@@ -1483,7 +1483,7 @@ class huobijp(Exchange, ImplicitAPI):
1483
1483
  """
1484
1484
  cancels an open order
1485
1485
  :param str id: order id
1486
- :param str symbol: not used by huobijp cancelOrder()
1486
+ :param str symbol: not used by bittrade cancelOrder()
1487
1487
  :param dict [params]: extra parameters specific to the exchange API endpoint
1488
1488
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1489
1489
  """
@@ -1503,7 +1503,7 @@ class huobijp(Exchange, ImplicitAPI):
1503
1503
  """
1504
1504
  cancel multiple orders
1505
1505
  :param str[] ids: order ids
1506
- :param str symbol: not used by huobijp cancelOrders()
1506
+ :param str symbol: not used by bittrade cancelOrders()
1507
1507
  :param dict [params]: extra parameters specific to the exchange API endpoint
1508
1508
  :returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1509
1509
  """
ccxt/coinbase.py CHANGED
@@ -1424,9 +1424,6 @@ class coinbase(Exchange, ImplicitAPI):
1424
1424
  self.v3PublicGetBrokerageMarketProducts(self.extend(params, {'product_type': 'FUTURE'})),
1425
1425
  self.v3PublicGetBrokerageMarketProducts(self.extend(params, {'product_type': 'FUTURE', 'contract_expiry_type': 'PERPETUAL'})),
1426
1426
  ]
1427
- if self.check_required_credentials(False):
1428
- unresolvedContractPromises.append(self.extend(params, {'product_type': 'FUTURE'}))
1429
- unresolvedContractPromises.append(self.extend(params, {'product_type': 'FUTURE', 'contract_expiry_type': 'PERPETUAL'}))
1430
1427
  except Exception as e:
1431
1428
  unresolvedContractPromises = [] # the sync version of ccxt won't have the promise.all line so the request is made here. Some users can't access perpetual products
1432
1429
  promises = spotUnresolvedPromises
@@ -1439,8 +1436,8 @@ class coinbase(Exchange, ImplicitAPI):
1439
1436
  fees = self.safe_dict(promises, 1, {})
1440
1437
  expiringFutures = self.safe_dict(contractPromises, 0, {})
1441
1438
  perpetualFutures = self.safe_dict(contractPromises, 1, {})
1442
- expiringFees = self.safe_dict(contractPromises, 2, {})
1443
- perpetualFees = self.safe_dict(contractPromises, 3, {})
1439
+ expiringFees = self.safe_dict(contractPromises, 0, {})
1440
+ perpetualFees = self.safe_dict(contractPromises, 1, {})
1444
1441
  #
1445
1442
  # {
1446
1443
  # "total_volume": 0,
ccxt/deribit.py CHANGED
@@ -640,18 +640,17 @@ class deribit(Exchange, ImplicitAPI):
640
640
  # "testnet": True
641
641
  # }
642
642
  #
643
- data = self.safe_value(response, 'result', {})
643
+ data = self.safe_list(response, 'result', [])
644
644
  result: dict = {}
645
645
  for i in range(0, len(data)):
646
646
  currency = data[i]
647
647
  currencyId = self.safe_string(currency, 'currency')
648
648
  code = self.safe_currency_code(currencyId)
649
- name = self.safe_string(currency, 'currency_long')
650
- result[code] = {
649
+ result[code] = self.safe_currency_structure({
651
650
  'info': currency,
652
651
  'code': code,
653
652
  'id': currencyId,
654
- 'name': name,
653
+ 'name': self.safe_string(currency, 'currency_long'),
655
654
  'active': None,
656
655
  'deposit': None,
657
656
  'withdraw': None,
@@ -673,7 +672,7 @@ class deribit(Exchange, ImplicitAPI):
673
672
  },
674
673
  },
675
674
  'networks': None,
676
- }
675
+ })
677
676
  return result
678
677
 
679
678
  def code_from_options(self, methodName, params={}):
ccxt/hollaex.py CHANGED
@@ -292,6 +292,14 @@ class hollaex(Exchange, ImplicitAPI):
292
292
  'BNB': 'bnb',
293
293
  'MATIC': 'matic',
294
294
  },
295
+ 'networksById': {
296
+ 'eth': 'ERC20',
297
+ 'ETH': 'ERC20',
298
+ 'ERC20': 'ERC20',
299
+ 'trx': 'TRC20',
300
+ 'TRX': 'TRC20',
301
+ 'TRC20': 'TRC20',
302
+ },
295
303
  },
296
304
  })
297
305
 
@@ -421,66 +429,115 @@ class hollaex(Exchange, ImplicitAPI):
421
429
  """
422
430
  response = self.publicGetConstants(params)
423
431
  #
424
- # {
425
- # "coins":{
426
- # "bch":{
427
- # "id":4,
428
- # "fullname":"Bitcoin Cash",
429
- # "symbol":"bch",
430
- # "active":true,
431
- # "verified":true,
432
- # "allow_deposit":true,
433
- # "allow_withdrawal":true,
434
- # "withdrawal_fee":0.0002,
435
- # "min":0.001,
436
- # "max":100000,
437
- # "increment_unit":0.001,
438
- # "logo":"https://bitholla.s3.ap-northeast-2.amazonaws.com/icon/BCH-hollaex-asset-01.svg",
439
- # "code":"bch",
440
- # "is_public":true,
441
- # "meta":{},
442
- # "estimated_price":null,
443
- # "description":null,
444
- # "type":"blockchain",
445
- # "network":null,
446
- # "standard":null,
447
- # "issuer":"HollaEx",
448
- # "withdrawal_fees":null,
449
- # "created_at":"2019-08-09T10:45:43.367Z",
450
- # "updated_at":"2021-12-13T03:08:32.372Z",
451
- # "created_by":1,
452
- # "owner_id":1
453
- # },
432
+ # {
433
+ # "coins": {
434
+ # "usdt": {
435
+ # "id": "6",
436
+ # "fullname": "USD Tether",
437
+ # "symbol": "usdt",
438
+ # "active": True,
439
+ # "verified": True,
440
+ # "allow_deposit": True,
441
+ # "allow_withdrawal": True,
442
+ # "withdrawal_fee": "20",
443
+ # "min": "1",
444
+ # "max": "10000000",
445
+ # "increment_unit": "0.0001",
446
+ # "logo": "https://hollaex-resources.s3.ap-southeast-1.amazonaws.com/icons/usdt.svg",
447
+ # "code": "usdt",
448
+ # "is_public": True,
449
+ # "meta": {
450
+ # "color": "#27a17a",
451
+ # "website": "https://tether.to",
452
+ # "explorer": "https://blockchair.com/tether",
453
+ # "decimal_points": "6"
454
+ # },
455
+ # "estimated_price": "1",
456
+ # "description": "<p>Tether(USDT) is a stablecoin pegged 1:1 to the US dollar. It is a digital currency that aims to maintain its value while allowing for fast and secure transfer of funds. It was the first stablecoin, and is the most widely used due stablecoin due to its stability and low volatility compared to other cryptocurrencies. It was launched in 2014 by Tether Limited.</p>",
457
+ # "type": "blockchain",
458
+ # "network": "eth,trx,bnb,matic",
459
+ # "standard": "",
460
+ # "issuer": "HollaEx",
461
+ # "withdrawal_fees": {
462
+ # "bnb": {
463
+ # "value": "0.8",
464
+ # "active": True,
465
+ # "symbol": "usdt"
466
+ # },
467
+ # "eth": {
468
+ # "value": "1.5",
469
+ # "active": True,
470
+ # "symbol": "usdt"
471
+ # },
472
+ # "trx": {
473
+ # "value": "4",
474
+ # "active": True,
475
+ # "symbol": "usdt"
476
+ # },
477
+ # "matic": {
478
+ # "value": "0.3",
479
+ # "active": True,
480
+ # "symbol": "usdt"
481
+ # }
482
+ # },
483
+ # "display_name": null,
484
+ # "deposit_fees": null,
485
+ # "is_risky": False,
486
+ # "market_cap": "144568098696.29",
487
+ # "category": "stable",
488
+ # "created_at": "2019-08-09T10:45:43.367Z",
489
+ # "updated_at": "2025-03-25T17:12:37.970Z",
490
+ # "created_by": "168",
491
+ # "owner_id": "1"
492
+ # },
454
493
  # },
455
494
  # "network":"https://api.hollaex.network"
456
495
  # }
457
496
  #
458
- coins = self.safe_value(response, 'coins', {})
497
+ coins = self.safe_dict(response, 'coins', {})
459
498
  keys = list(coins.keys())
460
499
  result: dict = {}
461
500
  for i in range(0, len(keys)):
462
501
  key = keys[i]
463
502
  currency = coins[key]
464
503
  id = self.safe_string(currency, 'symbol')
465
- numericId = self.safe_integer(currency, 'id')
466
504
  code = self.safe_currency_code(id)
467
- name = self.safe_string(currency, 'fullname')
468
- depositEnabled = self.safe_value(currency, 'allow_deposit')
469
- withdrawEnabled = self.safe_value(currency, 'allow_withdrawal')
470
- isActive = self.safe_value(currency, 'active')
471
- active = isActive and depositEnabled and withdrawEnabled
472
- fee = self.safe_number(currency, 'withdrawal_fee')
473
- withdrawalLimits = self.safe_value(currency, 'withdrawal_limits', [])
474
- result[code] = {
505
+ withdrawalLimits = self.safe_list(currency, 'withdrawal_limits', [])
506
+ rawType = self.safe_string(currency, 'type')
507
+ type = 'crypto' if (rawType == 'blockchain') else 'other'
508
+ rawNetworks = self.safe_dict(currency, 'withdrawal_fees', {})
509
+ networks = {}
510
+ networkIds = list(rawNetworks.keys())
511
+ for j in range(0, len(networkIds)):
512
+ networkId = networkIds[j]
513
+ networkEntry = self.safe_dict(rawNetworks, networkId)
514
+ networkCode = self.network_id_to_code(networkId)
515
+ networks[networkCode] = {
516
+ 'id': networkId,
517
+ 'network': networkCode,
518
+ 'active': self.safe_bool(networkEntry, 'active'),
519
+ 'deposit': None,
520
+ 'withdraw': None,
521
+ 'fee': self.safe_number(networkEntry, 'value'),
522
+ 'precision': None,
523
+ 'limits': {
524
+ 'withdraw': {
525
+ 'min': None,
526
+ 'max': None,
527
+ },
528
+ },
529
+ 'info': networkEntry,
530
+ }
531
+ result[code] = self.safe_currency_structure({
475
532
  'id': id,
476
- 'numericId': numericId,
533
+ 'numericId': self.safe_integer(currency, 'id'),
477
534
  'code': code,
478
535
  'info': currency,
479
- 'name': name,
480
- 'active': active,
481
- 'deposit': depositEnabled,
482
- 'withdraw': withdrawEnabled,
483
- 'fee': fee,
536
+ 'name': self.safe_string(currency, 'fullname'),
537
+ 'active': self.safe_bool(currency, 'active'),
538
+ 'deposit': self.safe_bool(currency, 'allow_deposit'),
539
+ 'withdraw': self.safe_bool(currency, 'allow_withdrawal'),
540
+ 'fee': self.safe_number(currency, 'withdrawal_fee'),
484
541
  'precision': self.safe_number(currency, 'increment_unit'),
485
542
  'limits': {
486
543
  'amount': {
@@ -492,9 +549,9 @@ class hollaex(Exchange, ImplicitAPI):
492
549
  'max': self.safe_value(withdrawalLimits, 0),
493
550
  },
494
551
  },
495
- 'networks': {},
496
- 'type': 'crypto',
497
- }
552
+ 'networks': networks,
553
+ 'type': type,
554
+ })
498
555
  return result
499
556
 
500
557
  def fetch_order_books(self, symbols: Strings = None, limit: Int = None, params={}) -> OrderBooks: