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.
- ccxt/__init__.py +3 -5
- ccxt/abstract/myokx.py +2 -0
- ccxt/abstract/okx.py +2 -0
- ccxt/ascendex.py +187 -151
- ccxt/async_support/__init__.py +3 -5
- ccxt/async_support/ascendex.py +187 -151
- ccxt/async_support/base/exchange.py +26 -22
- ccxt/async_support/bequant.py +1 -1
- ccxt/async_support/bitget.py +4 -4
- ccxt/async_support/bitmart.py +1 -1
- ccxt/async_support/{huobijp.py → bittrade.py} +11 -11
- ccxt/async_support/coinbase.py +2 -5
- ccxt/async_support/deribit.py +4 -5
- ccxt/async_support/hollaex.py +106 -49
- ccxt/async_support/htx.py +20 -43
- ccxt/async_support/hyperliquid.py +4 -4
- ccxt/async_support/mexc.py +2 -2
- ccxt/async_support/ndax.py +25 -24
- ccxt/async_support/okcoin.py +12 -29
- ccxt/async_support/okx.py +9 -0
- ccxt/async_support/onetrading.py +10 -7
- ccxt/async_support/oxfun.py +40 -110
- ccxt/async_support/paradex.py +3 -0
- ccxt/base/exchange.py +1 -1
- ccxt/bequant.py +1 -1
- ccxt/bitget.py +4 -4
- ccxt/bitmart.py +1 -1
- ccxt/{huobijp.py → bittrade.py} +11 -11
- ccxt/coinbase.py +2 -5
- ccxt/deribit.py +4 -5
- ccxt/hollaex.py +106 -49
- ccxt/htx.py +20 -43
- ccxt/hyperliquid.py +4 -4
- ccxt/mexc.py +2 -2
- ccxt/ndax.py +25 -24
- ccxt/okcoin.py +12 -29
- ccxt/okx.py +9 -0
- ccxt/onetrading.py +10 -7
- ccxt/oxfun.py +40 -110
- ccxt/paradex.py +3 -0
- ccxt/pro/__init__.py +41 -3
- ccxt/pro/binance.py +1 -0
- ccxt/pro/{huobijp.py → bittrade.py} +3 -3
- ccxt/pro/luno.py +6 -5
- ccxt/pro/mexc.py +2 -0
- {ccxt-4.4.85.dist-info → ccxt-4.4.86.dist-info}/METADATA +7 -8
- {ccxt-4.4.85.dist-info → ccxt-4.4.86.dist-info}/RECORD +51 -54
- ccxt/abstract/kuna.py +0 -182
- ccxt/async_support/kuna.py +0 -1935
- ccxt/kuna.py +0 -1935
- /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
- {ccxt-4.4.85.dist-info → ccxt-4.4.86.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.4.85.dist-info → ccxt-4.4.86.dist-info}/WHEEL +0 -0
- {ccxt-4.4.85.dist-info → ccxt-4.4.86.dist-info}/top_level.txt +0 -0
ccxt/async_support/oxfun.py
CHANGED
@@ -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
|
-
|
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
|
-
|
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':
|
745
|
-
'withdraw':
|
746
|
-
'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(
|
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
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
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:
|
ccxt/async_support/paradex.py
CHANGED
@@ -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
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 =
|
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.
|
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
|
|
ccxt/{huobijp.py → bittrade.py}
RENAMED
@@ -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.
|
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
|
30
|
+
class bittrade(Exchange, ImplicitAPI):
|
31
31
|
|
32
32
|
def describe(self) -> Any:
|
33
|
-
return self.deep_extend(super(
|
34
|
-
'id': '
|
35
|
-
'name': '
|
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.
|
112
|
-
'referral': 'https://www.
|
113
|
-
'doc': 'https://api-doc.
|
114
|
-
'fees': 'https://www.
|
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
|
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
|
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,
|
1443
|
-
perpetualFees = self.safe_dict(contractPromises,
|
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.
|
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
|
-
|
650
|
-
result[code] = {
|
649
|
+
result[code] = self.safe_currency_structure({
|
651
650
|
'info': currency,
|
652
651
|
'code': code,
|
653
652
|
'id': currencyId,
|
654
|
-
'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
|
-
#
|
426
|
-
#
|
427
|
-
#
|
428
|
-
#
|
429
|
-
#
|
430
|
-
#
|
431
|
-
#
|
432
|
-
#
|
433
|
-
#
|
434
|
-
#
|
435
|
-
#
|
436
|
-
#
|
437
|
-
#
|
438
|
-
#
|
439
|
-
#
|
440
|
-
#
|
441
|
-
#
|
442
|
-
#
|
443
|
-
#
|
444
|
-
#
|
445
|
-
#
|
446
|
-
#
|
447
|
-
#
|
448
|
-
#
|
449
|
-
#
|
450
|
-
#
|
451
|
-
#
|
452
|
-
#
|
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.
|
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
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
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':
|
533
|
+
'numericId': self.safe_integer(currency, 'id'),
|
477
534
|
'code': code,
|
478
535
|
'info': currency,
|
479
|
-
'name':
|
480
|
-
'active': active,
|
481
|
-
'deposit':
|
482
|
-
'withdraw':
|
483
|
-
'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':
|
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:
|