ccxt 4.4.57__py2.py3-none-any.whl → 4.4.58__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 +1 -1
- ccxt/abstract/xt.py +1 -0
- ccxt/ascendex.py +2 -0
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/ascendex.py +2 -0
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/binance.py +19 -3
- ccxt/async_support/bitget.py +5 -0
- ccxt/async_support/bitmart.py +13 -3
- ccxt/async_support/blofin.py +1 -2
- ccxt/async_support/bybit.py +13 -2
- ccxt/async_support/coinbase.py +8 -1
- ccxt/async_support/hyperliquid.py +8 -3
- ccxt/async_support/timex.py +12 -2
- ccxt/async_support/vertex.py +1 -1
- ccxt/async_support/whitebit.py +2 -1
- ccxt/async_support/xt.py +54 -1
- ccxt/base/errors.py +0 -6
- ccxt/base/exchange.py +2 -2
- ccxt/binance.py +19 -3
- ccxt/bitget.py +5 -0
- ccxt/bitmart.py +13 -3
- ccxt/blofin.py +1 -2
- ccxt/bybit.py +13 -2
- ccxt/coinbase.py +8 -1
- ccxt/hyperliquid.py +8 -3
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/bybit.py +4 -1
- ccxt/pro/mexc.py +3 -1
- ccxt/test/tests_init.py +2 -2
- ccxt/timex.py +12 -2
- ccxt/vertex.py +1 -1
- ccxt/whitebit.py +2 -1
- ccxt/xt.py +54 -1
- {ccxt-4.4.57.dist-info → ccxt-4.4.58.dist-info}/METADATA +5 -5
- {ccxt-4.4.57.dist-info → ccxt-4.4.58.dist-info}/RECORD +39 -39
- {ccxt-4.4.57.dist-info → ccxt-4.4.58.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.4.57.dist-info → ccxt-4.4.58.dist-info}/WHEEL +0 -0
- {ccxt-4.4.57.dist-info → ccxt-4.4.58.dist-info}/top_level.txt +0 -0
ccxt/bitmart.py
CHANGED
@@ -528,7 +528,10 @@ class bitmart(Exchange, ImplicitAPI):
|
|
528
528
|
'40049': InvalidOrder, # 403, The maximum length of clientOrderId cannot exceed 32
|
529
529
|
'40050': InvalidOrder, # 403, Client OrderId duplicated with existing orders
|
530
530
|
},
|
531
|
-
'broad': {
|
531
|
+
'broad': {
|
532
|
+
'You contract account available balance not enough': InsufficientFunds,
|
533
|
+
'you contract account available balance not enough': InsufficientFunds,
|
534
|
+
},
|
532
535
|
},
|
533
536
|
'commonCurrencies': {
|
534
537
|
'$GM': 'GOLDMINER',
|
@@ -968,6 +971,7 @@ class bitmart(Exchange, ImplicitAPI):
|
|
968
971
|
data = self.safe_dict(response, 'data', {})
|
969
972
|
symbols = self.safe_list(data, 'symbols', [])
|
970
973
|
result = []
|
974
|
+
fees = self.fees['trading']
|
971
975
|
for i in range(0, len(symbols)):
|
972
976
|
market = symbols[i]
|
973
977
|
id = self.safe_string(market, 'symbol')
|
@@ -1006,6 +1010,8 @@ class bitmart(Exchange, ImplicitAPI):
|
|
1006
1010
|
'expiryDatetime': None,
|
1007
1011
|
'strike': None,
|
1008
1012
|
'optionType': None,
|
1013
|
+
'maker': fees['maker'],
|
1014
|
+
'taker': fees['taker'],
|
1009
1015
|
'precision': {
|
1010
1016
|
'amount': baseMinSize,
|
1011
1017
|
'price': self.parse_number(self.parse_precision(self.safe_string(market, 'price_max_precision'))),
|
@@ -1077,6 +1083,7 @@ class bitmart(Exchange, ImplicitAPI):
|
|
1077
1083
|
data = self.safe_dict(response, 'data', {})
|
1078
1084
|
symbols = self.safe_list(data, 'symbols', [])
|
1079
1085
|
result = []
|
1086
|
+
fees = self.fees['trading']
|
1080
1087
|
for i in range(0, len(symbols)):
|
1081
1088
|
market = symbols[i]
|
1082
1089
|
id = self.safe_string(market, 'symbol')
|
@@ -1118,6 +1125,8 @@ class bitmart(Exchange, ImplicitAPI):
|
|
1118
1125
|
'expiryDatetime': self.iso8601(expiry),
|
1119
1126
|
'strike': None,
|
1120
1127
|
'optionType': None,
|
1128
|
+
'maker': fees['maker'],
|
1129
|
+
'taker': fees['taker'],
|
1121
1130
|
'precision': {
|
1122
1131
|
'amount': self.safe_number(market, 'vol_precision'),
|
1123
1132
|
'price': self.safe_number(market, 'price_precision'),
|
@@ -5085,6 +5094,7 @@ class bitmart(Exchange, ImplicitAPI):
|
|
5085
5094
|
# {"message":"Bad Request [from is empty]","code":50000,"trace":"579986f7-c93a-4559-926b-06ba9fa79d76","data":{}}
|
5086
5095
|
# {"message":"Kline size over 500","code":50004,"trace":"d625caa8-e8ca-4bd2-b77c-958776965819","data":{}}
|
5087
5096
|
# {"message":"Balance not enough","code":50020,"trace":"7c709d6a-3292-462c-98c5-32362540aeef","data":{}}
|
5097
|
+
# {"code":40012,"message":"You contract account available balance not enough.","trace":"..."}
|
5088
5098
|
#
|
5089
5099
|
# contract
|
5090
5100
|
#
|
@@ -5096,9 +5106,9 @@ class bitmart(Exchange, ImplicitAPI):
|
|
5096
5106
|
isErrorCode = (errorCode is not None) and (errorCode != '1000')
|
5097
5107
|
if isErrorCode or isErrorMessage:
|
5098
5108
|
feedback = self.id + ' ' + body
|
5099
|
-
self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
|
5100
|
-
self.throw_broadly_matched_exception(self.exceptions['broad'], errorCode, feedback)
|
5101
5109
|
self.throw_exactly_matched_exception(self.exceptions['exact'], message, feedback)
|
5102
5110
|
self.throw_broadly_matched_exception(self.exceptions['broad'], message, feedback)
|
5111
|
+
self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
|
5112
|
+
self.throw_broadly_matched_exception(self.exceptions['broad'], errorCode, feedback)
|
5103
5113
|
raise ExchangeError(feedback) # unknown message
|
5104
5114
|
return None
|
ccxt/blofin.py
CHANGED
ccxt/bybit.py
CHANGED
@@ -1420,8 +1420,8 @@ class bybit(Exchange, ImplicitAPI):
|
|
1420
1420
|
|
1421
1421
|
def create_expired_option_market(self, symbol: str):
|
1422
1422
|
# support expired option contracts
|
1423
|
-
quote =
|
1424
|
-
settle =
|
1423
|
+
quote = None
|
1424
|
+
settle = None
|
1425
1425
|
optionParts = symbol.split('-')
|
1426
1426
|
symbolBase = symbol.split('/')
|
1427
1427
|
base = None
|
@@ -1429,9 +1429,20 @@ class bybit(Exchange, ImplicitAPI):
|
|
1429
1429
|
if symbol.find('/') > -1:
|
1430
1430
|
base = self.safe_string(symbolBase, 0)
|
1431
1431
|
expiry = self.safe_string(optionParts, 1)
|
1432
|
+
symbolQuoteAndSettle = self.safe_string(symbolBase, 1)
|
1433
|
+
splitQuote = symbolQuoteAndSettle.split(':')
|
1434
|
+
quoteAndSettle = self.safe_string(splitQuote, 0)
|
1435
|
+
quote = quoteAndSettle
|
1436
|
+
settle = quoteAndSettle
|
1432
1437
|
else:
|
1433
1438
|
base = self.safe_string(optionParts, 0)
|
1434
1439
|
expiry = self.convert_market_id_expire_date(self.safe_string(optionParts, 1))
|
1440
|
+
if symbol.endswith('-USDT'):
|
1441
|
+
quote = 'USDT'
|
1442
|
+
settle = 'USDT'
|
1443
|
+
else:
|
1444
|
+
quote = 'USDC'
|
1445
|
+
settle = 'USDC'
|
1435
1446
|
strike = self.safe_string(optionParts, 2)
|
1436
1447
|
optionType = self.safe_string(optionParts, 3)
|
1437
1448
|
datetime = self.convert_expire_date(expiry)
|
ccxt/coinbase.py
CHANGED
@@ -4795,10 +4795,17 @@ class coinbase(Exchange, ImplicitAPI):
|
|
4795
4795
|
# }
|
4796
4796
|
# ]
|
4797
4797
|
# }
|
4798
|
+
# or
|
4799
|
+
# {
|
4800
|
+
# "error": "UNKNOWN_FAILURE_REASON",
|
4801
|
+
# "message": "",
|
4802
|
+
# "error_details": "",
|
4803
|
+
# "preview_failure_reason": "PREVIEW_STOP_PRICE_BELOW_LAST_TRADE_PRICE"
|
4804
|
+
# }
|
4798
4805
|
#
|
4799
4806
|
errorCode = self.safe_string(response, 'error')
|
4800
4807
|
if errorCode is not None:
|
4801
|
-
errorMessage = self.
|
4808
|
+
errorMessage = self.safe_string_2(response, 'error_description', 'preview_failure_reason')
|
4802
4809
|
self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
|
4803
4810
|
self.throw_broadly_matched_exception(self.exceptions['broad'], errorMessage, feedback)
|
4804
4811
|
raise ExchangeError(feedback)
|
ccxt/hyperliquid.py
CHANGED
@@ -203,7 +203,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
203
203
|
'broad': {
|
204
204
|
'Price must be divisible by tick size.': InvalidOrder,
|
205
205
|
'Order must have minimum value of $10': InvalidOrder,
|
206
|
-
'Insufficient margin to place order.':
|
206
|
+
'Insufficient margin to place order.': InsufficientFunds,
|
207
207
|
'Reduce only order would increase position.': InvalidOrder,
|
208
208
|
'Post only order would have immediately matched,': InvalidOrder,
|
209
209
|
'Order could not immediately match against any resting orders.': InvalidOrder,
|
@@ -601,7 +601,9 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
601
601
|
amountPrecisionStr = self.safe_string(innerBaseTokenInfo, 'szDecimals')
|
602
602
|
amountPrecision = int(amountPrecisionStr)
|
603
603
|
price = self.safe_number(extraData, 'midPx')
|
604
|
-
pricePrecision =
|
604
|
+
pricePrecision = 0
|
605
|
+
if price is not None:
|
606
|
+
pricePrecision = self.calculate_price_precision(price, amountPrecision, 8)
|
605
607
|
pricePrecisionStr = self.number_to_string(pricePrecision)
|
606
608
|
# quotePrecision = self.parse_number(self.parse_precision(self.safe_string(innerQuoteTokenInfo, 'szDecimals')))
|
607
609
|
baseId = self.number_to_string(index + 10000)
|
@@ -698,7 +700,9 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
698
700
|
amountPrecisionStr = self.safe_string(market, 'szDecimals')
|
699
701
|
amountPrecision = int(amountPrecisionStr)
|
700
702
|
price = self.safe_number(market, 'markPx', 0)
|
701
|
-
pricePrecision =
|
703
|
+
pricePrecision = 0
|
704
|
+
if price is not None:
|
705
|
+
pricePrecision = self.calculate_price_precision(price, amountPrecision, 6)
|
702
706
|
pricePrecisionStr = self.number_to_string(pricePrecision)
|
703
707
|
isDelisted = self.safe_bool(market, 'isDelisted')
|
704
708
|
active = True
|
@@ -3264,6 +3268,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
3264
3268
|
# status: 'ok',
|
3265
3269
|
# response: {type: 'order', data: {statuses: [{error: 'Insufficient margin to place order. asset=4'}]}}
|
3266
3270
|
# }
|
3271
|
+
# {"status":"ok","response":{"type":"order","data":{"statuses":[{"error":"Insufficient margin to place order. asset=84"}]}}}
|
3267
3272
|
#
|
3268
3273
|
status = self.safe_string(response, 'status', '')
|
3269
3274
|
message = None
|
ccxt/pro/__init__.py
CHANGED
ccxt/pro/bybit.py
CHANGED
@@ -842,7 +842,10 @@ class bybit(ccxt.async_support.bybit):
|
|
842
842
|
raise BadRequest(self.id + ' watchOrderBookForSymbols() can only use limit 25 and 100 for option markets.')
|
843
843
|
elif (limit != 1) and (limit != 50) and (limit != 200) and (limit != 500):
|
844
844
|
# bybit only support limit 1, 50, 200, 500 for contract
|
845
|
-
raise BadRequest(self.id + ' watchOrderBookForSymbols() can only use limit 1, 50, 200 and 500.')
|
845
|
+
raise BadRequest(self.id + ' watchOrderBookForSymbols() can only use limit 1, 50, 200 and 500 for swap and future markets.')
|
846
|
+
else:
|
847
|
+
if (limit != 1) and (limit != 50) and (limit != 200):
|
848
|
+
raise BadRequest(self.id + ' watchOrderBookForSymbols() can only use limit 1,50, and 200 for spot markets.')
|
846
849
|
topics = []
|
847
850
|
messageHashes = []
|
848
851
|
for i in range(0, len(symbols)):
|
ccxt/pro/mexc.py
CHANGED
@@ -446,7 +446,9 @@ class mexc(ccxt.async_support.mexc):
|
|
446
446
|
# }
|
447
447
|
#
|
448
448
|
parsedTicker = self.parse_ws_bid_ask(message)
|
449
|
-
symbol = parsedTicker
|
449
|
+
symbol = self.safe_string(parsedTicker, 'symbol')
|
450
|
+
if symbol is None:
|
451
|
+
return
|
450
452
|
self.bidsasks[symbol] = parsedTicker
|
451
453
|
messageHash = 'bidask:' + symbol
|
452
454
|
client.resolve(parsedTicker, messageHash)
|
ccxt/test/tests_init.py
CHANGED
@@ -18,7 +18,7 @@ if sys.platform == 'win32':
|
|
18
18
|
# ########### args ###########
|
19
19
|
isWs = get_cli_arg_value('--ws')
|
20
20
|
isBaseTests = get_cli_arg_value('--baseTests')
|
21
|
-
|
21
|
+
runAll = get_cli_arg_value('--all')
|
22
22
|
|
23
23
|
# ###### base tests #######
|
24
24
|
if (isBaseTests):
|
@@ -27,7 +27,7 @@ if (isBaseTests):
|
|
27
27
|
else:
|
28
28
|
base_tests_init()
|
29
29
|
print('base tests passed!')
|
30
|
-
if not
|
30
|
+
if not runAll:
|
31
31
|
exit(0)
|
32
32
|
|
33
33
|
# ###### exchange tests #######
|
ccxt/timex.py
CHANGED
@@ -729,6 +729,7 @@ class timex(Exchange, ImplicitAPI):
|
|
729
729
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
730
730
|
:param int [limit]: the maximum amount of candles to fetch
|
731
731
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
732
|
+
:param int [params.until]: timestamp in ms of the latest candle to fetch
|
732
733
|
:returns int[][]: A list of candles ordered, open, high, low, close, volume
|
733
734
|
"""
|
734
735
|
self.load_markets()
|
@@ -739,15 +740,24 @@ class timex(Exchange, ImplicitAPI):
|
|
739
740
|
}
|
740
741
|
# if since and limit are not specified
|
741
742
|
duration = self.parse_timeframe(timeframe)
|
743
|
+
until = self.safe_integer(params, 'until')
|
742
744
|
if limit is None:
|
743
745
|
limit = 1000 # exchange provides tens of thousands of data, but we set generous default value
|
744
746
|
if since is not None:
|
745
747
|
request['from'] = self.iso8601(since)
|
746
|
-
|
748
|
+
if until is None:
|
749
|
+
request['till'] = self.iso8601(self.sum(since, self.sum(limit, 1) * duration * 1000))
|
750
|
+
else:
|
751
|
+
request['till'] = self.iso8601(until)
|
752
|
+
elif until is not None:
|
753
|
+
request['till'] = self.iso8601(until)
|
754
|
+
fromTimestamp = until - self.sum(limit, 1) * duration * 1000
|
755
|
+
request['from'] = self.iso8601(fromTimestamp)
|
747
756
|
else:
|
748
757
|
now = self.milliseconds()
|
749
758
|
request['till'] = self.iso8601(now)
|
750
|
-
request['from'] = self.iso8601(now - limit * duration * 1000 - 1)
|
759
|
+
request['from'] = self.iso8601(now - self.sum(limit, 1) * duration * 1000 - 1)
|
760
|
+
params = self.omit(params, 'until')
|
751
761
|
response = self.publicGetCandles(self.extend(request, params))
|
752
762
|
#
|
753
763
|
# [
|
ccxt/vertex.py
CHANGED
@@ -1523,7 +1523,7 @@ class vertex(Exchange, ImplicitAPI):
|
|
1523
1523
|
marketId = base + '/' + quote
|
1524
1524
|
if base.find('PERP') > 0:
|
1525
1525
|
marketId = marketId.replace('-PERP', '') + ':USDC'
|
1526
|
-
market = self.
|
1526
|
+
market = self.safe_market(marketId, market)
|
1527
1527
|
last = self.safe_string(ticker, 'last_price')
|
1528
1528
|
return self.safe_ticker({
|
1529
1529
|
'symbol': market['symbol'],
|
ccxt/whitebit.py
CHANGED
@@ -2626,12 +2626,13 @@ class whitebit(Exchange, ImplicitAPI):
|
|
2626
2626
|
# For cases where we have a meaningful status
|
2627
2627
|
# {"response":null,"status":422,"errors":{"orderId":["Finished order id 435453454535 not found on your account"]},"notification":null,"warning":"Finished order id 435453454535 not found on your account","_token":null}
|
2628
2628
|
status = self.safe_string(response, 'status')
|
2629
|
+
errors = self.safe_value(response, 'errors')
|
2629
2630
|
# {"code":10,"message":"Unauthorized request."}
|
2630
2631
|
message = self.safe_string(response, 'message')
|
2631
2632
|
# For these cases where we have a generic code variable error key
|
2632
2633
|
# {"code":0,"message":"Validation failed","errors":{"amount":["Amount must be greater than 0"]}}
|
2633
2634
|
codeNew = self.safe_integer(response, 'code')
|
2634
|
-
hasErrorStatus = status is not None and status != '200'
|
2635
|
+
hasErrorStatus = status is not None and status != '200' and errors is not None
|
2635
2636
|
if hasErrorStatus or codeNew is not None:
|
2636
2637
|
feedback = self.id + ' ' + body
|
2637
2638
|
errorInfo = message
|
ccxt/xt.py
CHANGED
@@ -128,7 +128,7 @@ class xt(Exchange, ImplicitAPI):
|
|
128
128
|
'repayMargin': False,
|
129
129
|
'setLeverage': True,
|
130
130
|
'setMargin': False,
|
131
|
-
'setMarginMode':
|
131
|
+
'setMarginMode': True,
|
132
132
|
'setPositionMode': False,
|
133
133
|
'signIn': False,
|
134
134
|
'transfer': True,
|
@@ -286,6 +286,7 @@ class xt(Exchange, ImplicitAPI):
|
|
286
286
|
'future/user/v1/position/margin': 1,
|
287
287
|
'future/user/v1/user/collection/add': 1,
|
288
288
|
'future/user/v1/user/collection/cancel': 1,
|
289
|
+
'future/user/v1/position/change-type': 1,
|
289
290
|
},
|
290
291
|
},
|
291
292
|
'inverse': {
|
@@ -531,10 +532,12 @@ class xt(Exchange, ImplicitAPI):
|
|
531
532
|
'TRANSFER_012': PermissionDenied, # Currency transfer prohibited
|
532
533
|
'symbol_not_support_trading_via_api': BadSymbol, # {"returnCode":1,"msgInfo":"failure","error":{"code":"symbol_not_support_trading_via_api","msg":"The symbol does not support trading via API"},"result":null}
|
533
534
|
'open_order_min_nominal_value_limit': InvalidOrder, # {"returnCode":1,"msgInfo":"failure","error":{"code":"open_order_min_nominal_value_limit","msg":"Exceeds the minimum notional value of a single order"},"result":null}
|
535
|
+
'insufficient_balance': InsufficientFunds,
|
534
536
|
},
|
535
537
|
'broad': {
|
536
538
|
'The symbol does not support trading via API': BadSymbol, # {"returnCode":1,"msgInfo":"failure","error":{"code":"symbol_not_support_trading_via_api","msg":"The symbol does not support trading via API"},"result":null}
|
537
539
|
'Exceeds the minimum notional value of a single order': InvalidOrder, # {"returnCode":1,"msgInfo":"failure","error":{"code":"open_order_min_nominal_value_limit","msg":"Exceeds the minimum notional value of a single order"},"result":null}
|
540
|
+
'insufficient balance': InsufficientFunds,
|
538
541
|
},
|
539
542
|
},
|
540
543
|
'timeframes': {
|
@@ -4616,6 +4619,53 @@ class xt(Exchange, ImplicitAPI):
|
|
4616
4619
|
'status': None,
|
4617
4620
|
}
|
4618
4621
|
|
4622
|
+
def set_margin_mode(self, marginMode: str, symbol: Str = None, params={}):
|
4623
|
+
"""
|
4624
|
+
set margin mode to 'cross' or 'isolated'
|
4625
|
+
|
4626
|
+
https://doc.xt.com/#futures_userchangePositionType
|
4627
|
+
|
4628
|
+
:param str marginMode: 'cross' or 'isolated'
|
4629
|
+
:param str [symbol]: required
|
4630
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
4631
|
+
:param str [params.positionSide]: *required* "long" or "short"
|
4632
|
+
:returns dict: response from the exchange
|
4633
|
+
"""
|
4634
|
+
if symbol is None:
|
4635
|
+
raise ArgumentsRequired(self.id + ' setMarginMode() requires a symbol argument')
|
4636
|
+
self.load_markets()
|
4637
|
+
market = self.market(symbol)
|
4638
|
+
if market['spot']:
|
4639
|
+
raise BadSymbol(self.id + ' setMarginMode() supports contract markets only')
|
4640
|
+
marginMode = marginMode.lower()
|
4641
|
+
if marginMode != 'isolated' and marginMode != 'cross':
|
4642
|
+
raise BadRequest(self.id + ' setMarginMode() marginMode argument should be isolated or cross')
|
4643
|
+
if marginMode == 'cross':
|
4644
|
+
marginMode = 'CROSSED'
|
4645
|
+
else:
|
4646
|
+
marginMode = 'ISOLATED'
|
4647
|
+
posSide = self.safe_string_upper(params, 'positionSide')
|
4648
|
+
if posSide is None:
|
4649
|
+
raise ArgumentsRequired(self.id + ' setMarginMode() requires a positionSide parameter, either "LONG" or "SHORT"')
|
4650
|
+
request: dict = {
|
4651
|
+
'positionType': marginMode,
|
4652
|
+
'positionSide': posSide,
|
4653
|
+
'symbol': market['id'],
|
4654
|
+
}
|
4655
|
+
response = self.privateLinearPostFutureUserV1PositionChangeType(self.extend(request, params))
|
4656
|
+
#
|
4657
|
+
# {
|
4658
|
+
# "error": {
|
4659
|
+
# "code": "",
|
4660
|
+
# "msg": ""
|
4661
|
+
# },
|
4662
|
+
# "msgInfo": "",
|
4663
|
+
# "result": {},
|
4664
|
+
# "returnCode": 0
|
4665
|
+
# }
|
4666
|
+
#
|
4667
|
+
return response # unify return type
|
4668
|
+
|
4619
4669
|
def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
|
4620
4670
|
#
|
4621
4671
|
# spot: error
|
@@ -4666,6 +4716,9 @@ class xt(Exchange, ImplicitAPI):
|
|
4666
4716
|
# "result": {}
|
4667
4717
|
# }
|
4668
4718
|
#
|
4719
|
+
# {"returnCode":1,"msgInfo":"failure","error":{"code":"insufficient_balance","msg":"insufficient balance","args":[]},"result":null}
|
4720
|
+
#
|
4721
|
+
#
|
4669
4722
|
status = self.safe_string_upper_2(response, 'msgInfo', 'mc')
|
4670
4723
|
if status is not None and status != 'SUCCESS':
|
4671
4724
|
feedback = self.id + ' ' + body
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ccxt
|
3
|
-
Version: 4.4.
|
3
|
+
Version: 4.4.58
|
4
4
|
Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
|
5
5
|
Home-page: https://ccxt.com
|
6
6
|
Author: Igor Kroitor
|
@@ -49,7 +49,7 @@ Requires-Dist: mypy==1.6.1; extra == "type"
|
|
49
49
|
|
50
50
|
# CCXT – CryptoCurrency eXchange Trading Library
|
51
51
|
|
52
|
-
[](https://www.npmjs.com/package/ccxt) [](https://npmjs.com/package/ccxt) [](https://pypi.python.org/pypi/ccxt) [](https://www.nuget.org/packages/ccxt) [](https://godoc.org/github.com/ccxt/ccxt/go/v4) [](https://discord.gg/ccxt) [](https://github.com/ccxt/ccxt/wiki/Exchange-Markets) [](https://x.com/ccxt_official)
|
53
53
|
|
54
54
|
A JavaScript / Python / PHP / C# / Go library for cryptocurrency trading and e-commerce with support for many bitcoin/ether/altcoin exchange markets and merchant APIs.
|
55
55
|
|
@@ -280,13 +280,13 @@ console.log(version, Object.keys(exchanges));
|
|
280
280
|
|
281
281
|
All-in-one browser bundle (dependencies included), served from a CDN of your choice:
|
282
282
|
|
283
|
-
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.
|
284
|
-
* unpkg: https://unpkg.com/ccxt@4.4.
|
283
|
+
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.58/dist/ccxt.browser.min.js
|
284
|
+
* unpkg: https://unpkg.com/ccxt@4.4.58/dist/ccxt.browser.min.js
|
285
285
|
|
286
286
|
CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
|
287
287
|
|
288
288
|
```HTML
|
289
|
-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.
|
289
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.58/dist/ccxt.browser.min.js"></script>
|
290
290
|
```
|
291
291
|
|
292
292
|
Creates a global `ccxt` object:
|