ccxt 3.1.23__py2.py3-none-any.whl → 3.1.24__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 CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '3.1.23'
25
+ __version__ = '3.1.24'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
ccxt/abstract/bybit.py CHANGED
@@ -244,6 +244,7 @@ class ImplicitAPI:
244
244
  private_get_v5_asset_transfer_query_account_coins_balance = privateGetV5AssetTransferQueryAccountCoinsBalance = Entry('v5/asset/transfer/query-account-coins-balance', 'private', 'GET', {'cost': 2.5})
245
245
  private_get_v5_user_query_sub_members = privateGetV5UserQuerySubMembers = Entry('v5/user/query-sub-members', 'private', 'GET', {'cost': 10})
246
246
  private_get_v5_user_query_api = privateGetV5UserQueryApi = Entry('v5/user/query-api', 'private', 'GET', {'cost': 10})
247
+ private_get_v5_customer_info = privateGetV5CustomerInfo = Entry('v5/customer/info', 'private', 'GET', {'cost': 10})
247
248
  private_get_v5_spot_cross_margin_trade_loan_info = privateGetV5SpotCrossMarginTradeLoanInfo = Entry('v5/spot-cross-margin-trade/loan-info', 'private', 'GET', {'cost': 1})
248
249
  private_get_v5_spot_cross_margin_trade_account = privateGetV5SpotCrossMarginTradeAccount = Entry('v5/spot-cross-margin-trade/account', 'private', 'GET', {'cost': 1})
249
250
  private_get_v5_spot_cross_margin_trade_orders = privateGetV5SpotCrossMarginTradeOrders = Entry('v5/spot-cross-margin-trade/orders', 'private', 'GET', {'cost': 1})
@@ -55,6 +55,7 @@ class ImplicitAPI:
55
55
  private_get_v2_tradingpositionshistory = privateGetV2TradingPositionsHistory = Entry('v2/tradingPositionsHistory', 'private', 'GET', {'cost': 1})
56
56
  private_get_v2_transactions = privateGetV2Transactions = Entry('v2/transactions', 'private', 'GET', {'cost': 1})
57
57
  private_get_v2_withdrawals = privateGetV2Withdrawals = Entry('v2/withdrawals', 'private', 'GET', {'cost': 1})
58
+ private_get_v2_fetchorder = privateGetV2FetchOrder = Entry('v2/fetchOrder', 'private', 'GET', {'cost': 1})
58
59
  private_post_v1_order = privatePostV1Order = Entry('v1/order', 'private', 'POST', {'cost': 1})
59
60
  private_post_v1_updatetradingposition = privatePostV1UpdateTradingPosition = Entry('v1/updateTradingPosition', 'private', 'POST', {'cost': 1})
60
61
  private_post_v1_updatetradingorder = privatePostV1UpdateTradingOrder = Entry('v1/updateTradingOrder', 'private', 'POST', {'cost': 1})
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '3.1.23'
7
+ __version__ = '3.1.24'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '3.1.23'
5
+ __version__ = '3.1.24'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -1250,21 +1250,10 @@ class Exchange(BaseExchange):
1250
1250
  })
1251
1251
 
1252
1252
  async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Optional[int] = None, limit: Optional[int] = None, params={}):
1253
- if not self.has['fetchTrades']:
1254
- raise NotSupported(self.id + ' fetchOHLCV() is not supported yet')
1255
- trades = await self.fetchTrades(symbol, since, limit, params)
1256
- ohlcvc = self.build_ohlcvc(trades, timeframe, since, limit)
1257
- result = []
1258
- for i in range(0, len(ohlcvc)):
1259
- result.append([
1260
- self.safe_integer(ohlcvc[i], 0),
1261
- self.safe_number(ohlcvc[i], 1),
1262
- self.safe_number(ohlcvc[i], 2),
1263
- self.safe_number(ohlcvc[i], 3),
1264
- self.safe_number(ohlcvc[i], 4),
1265
- self.safe_number(ohlcvc[i], 5),
1266
- ])
1267
- return result
1253
+ message = ''
1254
+ if self.has['fetchTrades']:
1255
+ message = '. If you want to build OHLCV candles from trade executions data, visit https://github.com/ccxt/ccxt/tree/master/examples/ and see "build-ohlcv-bars" file'
1256
+ raise NotSupported(self.id + ' fetchOHLCV() is not supported yet' + message)
1268
1257
 
1269
1258
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Optional[int] = None, limit: Optional[int] = None, params={}):
1270
1259
  raise NotSupported(self.id + ' watchOHLCV() is not supported yet')
@@ -1731,13 +1720,6 @@ class Exchange(BaseExchange):
1731
1720
  ohlcvs[candle][i_count] = self.sum(ohlcvs[candle][i_count], 1)
1732
1721
  return ohlcvs
1733
1722
 
1734
- async def fetch_ohlcvc(self, symbol, timeframe='1m', since: Optional[Any] = None, limit: Optional[int] = None, params={}):
1735
- if not self.has['fetchTrades']:
1736
- raise NotSupported(self.id + ' fetchOHLCV() is not supported yet')
1737
- await self.load_markets()
1738
- trades = await self.fetchTrades(symbol, since, limit, params)
1739
- return self.build_ohlcvc(trades, timeframe, since, limit)
1740
-
1741
1723
  def parse_trading_view_ohlcv(self, ohlcvs, market=None, timeframe='1m', since: Optional[int] = None, limit: Optional[int] = None):
1742
1724
  result = self.convert_trading_view_to_ohlcv(ohlcvs)
1743
1725
  return self.parse_ohlcvs(result, market, timeframe, since, limit)
@@ -2361,19 +2361,22 @@ class bitget(Exchange, ImplicitAPI):
2361
2361
  #
2362
2362
  # spot
2363
2363
  # {
2364
- # accountId: '6394957606',
2365
- # symbol: 'BTCUSDT_SPBL',
2366
- # orderId: '881623995442958336',
2367
- # clientOrderId: '135335e9-b054-4e43-b00a-499f11d3a5cc',
2368
- # price: '39000.000000000000',
2369
- # quantity: '0.000700000000',
2370
- # orderType: 'limit',
2371
- # side: 'buy',
2372
- # status: 'new',
2373
- # fillPrice: '0.000000000000',
2374
- # fillQuantity: '0.000000000000',
2375
- # fillTotalAmount: '0.000000000000',
2376
- # cTime: '1645921460972'
2364
+ # "accountId": "222222222",
2365
+ # "symbol": "TRXUSDT_SPBL",
2366
+ # "orderId": "1041901704004947968",
2367
+ # "clientOrderId": "c5e8a5e1-a07f-4202-8061-b88bd598b264",
2368
+ # "price": "0",
2369
+ # "quantity": "10.0000000000000000",
2370
+ # "orderType": "market",
2371
+ # "side": "buy",
2372
+ # "status": "full_fill",
2373
+ # "fillPrice": "0.0699782527055350",
2374
+ # "fillQuantity": "142.9015000000000000",
2375
+ # "fillTotalAmount": "9.9999972790000000",
2376
+ # "enterPointSource": "API",
2377
+ # "feeDetail": "{\"BGB\":{\"deduction\":true,\"feeCoinCode\":\"BGB\",\"totalDeductionFee\":-0.017118519726,\"totalFee\":-0.017118519726}}",
2378
+ # "orderSource": "market",
2379
+ # "cTime": "1684134644509"
2377
2380
  # }
2378
2381
  #
2379
2382
  # swap
@@ -2435,6 +2438,22 @@ class bitget(Exchange, ImplicitAPI):
2435
2438
  side = 'sell'
2436
2439
  clientOrderId = self.safe_string_2(order, 'clientOrderId', 'clientOid')
2437
2440
  fee = None
2441
+ feeCostString = self.safe_string(order, 'fee')
2442
+ if feeCostString is not None:
2443
+ # swap
2444
+ fee = {
2445
+ 'cost': feeCostString,
2446
+ 'currency': market['settle'],
2447
+ }
2448
+ feeDetail = self.safe_value(order, 'feeDetail')
2449
+ if feeDetail is not None:
2450
+ parsedFeeDetail = json.loads(feeDetail)
2451
+ feeValues = list(parsedFeeDetail.values())
2452
+ first = self.safe_value(feeValues, 0)
2453
+ fee = {
2454
+ 'cost': self.safe_string(first, 'totalFee'),
2455
+ 'currency': self.safe_currency_code(self.safe_string(first, 'feeCoinCode')),
2456
+ }
2438
2457
  rawStatus = self.safe_string_2(order, 'status', 'state')
2439
2458
  status = self.parse_order_status(rawStatus)
2440
2459
  lastTradeTimestamp = self.safe_integer(order, 'uTime')
@@ -3308,7 +3327,10 @@ class bitget(Exchange, ImplicitAPI):
3308
3327
  # }
3309
3328
  #
3310
3329
  data = self.safe_value(response, 'data')
3311
- return self.safe_value(data, 'orderList', [])
3330
+ if data is not None:
3331
+ return self.safe_value_2(data, 'orderList', 'data', [])
3332
+ parsedData = json.loads(response)
3333
+ return self.safe_value(parsedData, 'data', [])
3312
3334
 
3313
3335
  async def fetch_ledger(self, code: Optional[str] = None, since: Optional[int] = None, limit: Optional[int] = None, params={}):
3314
3336
  """
@@ -411,6 +411,7 @@ class bybit(Exchange, ImplicitAPI):
411
411
  # user
412
412
  'v5/user/query-sub-members': 10,
413
413
  'v5/user/query-api': 10,
414
+ 'v5/customer/info': 10,
414
415
  'v5/spot-cross-margin-trade/loan-info': 1, # 50/s => cost = 50 / 50 = 1
415
416
  'v5/spot-cross-margin-trade/account': 1, # 50/s => cost = 50 / 50 = 1
416
417
  'v5/spot-cross-margin-trade/orders': 1, # 50/s => cost = 50 / 50 = 1
@@ -88,7 +88,7 @@ class currencycom(Exchange, ImplicitAPI):
88
88
  'fetchOHLCV': True,
89
89
  'fetchOpenOrder': None,
90
90
  'fetchOpenOrders': True,
91
- 'fetchOrder': None,
91
+ 'fetchOrder': True,
92
92
  'fetchOrderBook': True,
93
93
  'fetchOrderBooks': None,
94
94
  'fetchOrders': None,
@@ -214,6 +214,7 @@ class currencycom(Exchange, ImplicitAPI):
214
214
  'v2/tradingPositionsHistory': 1,
215
215
  'v2/transactions': 1,
216
216
  'v2/withdrawals': 1,
217
+ 'v2/fetchOrder': 1,
217
218
  },
218
219
  'post': {
219
220
  'v1/order': 1,
@@ -269,6 +270,8 @@ class currencycom(Exchange, ImplicitAPI):
269
270
  'Only leverage symbol allowed here:': BadSymbol, # when you fetchLeverage for non-leverage symbols, like 'BTC/USDT' instead of 'BTC/USDT_LEVERAGE': {"code":"-1128","msg":"Only leverage symbol allowed here: BTC/USDT"}
270
271
  'market data service is not available': ExchangeNotAvailable, # {"code":"-1021","msg":"market data service is not available"}
271
272
  'your time is ahead of server': InvalidNonce, # {"code":"-1021","msg":"your time is ahead of server"}
273
+ 'Can not find account': BadRequest, # -1128
274
+ 'You mentioned an invalid value for the price parameter': BadRequest, # -1030
272
275
  },
273
276
  'exact': {
274
277
  '-1000': ExchangeNotAvailable, # {"code":-1000,"msg":"An unknown error occured while processing the request."}
@@ -279,7 +282,7 @@ class currencycom(Exchange, ImplicitAPI):
279
282
  '-1100': InvalidOrder, # createOrder(symbol, 1, asdf) -> 'Illegal characters found in parameter 'price'
280
283
  '-1104': ExchangeError, # Not all sent parameters were read, read 8 parameters but was sent 9
281
284
  '-1025': AuthenticationError, # {"code":-1025,"msg":"Invalid API-key, IP, or permissions for action"}
282
- '-1128': BadRequest, # {"code":-1128,"msg":"Combination of optional parameters invalid."} | {"code":"-1128","msg":"Combination of parameters invalid"} | {"code":"-1128","msg":"Invalid limit price"}
285
+ '-1128': BadRequest, # {"code":-1128,"msg":"Combination of optional parameters invalid."} | {"code":"-1128","msg":"Combination of parameters invalid"} | {"code":"-1128","msg":"Invalid limit price"} | {"code":"-1128","msg":"Can not find account: null"}
283
286
  '-2010': ExchangeError, # generic error code for createOrder -> 'Account has insufficient balance for requested action.', {"code":-2010,"msg":"Rest API trading is not enabled."}, etc...
284
287
  '-2011': OrderNotFound, # cancelOrder(1, 'BTC/USDT') -> 'UNKNOWN_ORDER'
285
288
  '-2013': OrderNotFound, # fetchOrder(1, 'BTC/USDT') -> 'Order does not exist'
@@ -607,7 +610,7 @@ class currencycom(Exchange, ImplicitAPI):
607
610
  result = []
608
611
  for i in range(0, len(accounts)):
609
612
  account = accounts[i]
610
- accountId = self.safe_integer(account, 'accountId')
613
+ accountId = self.safe_string(account, 'accountId') # must be string, because the numeric value is far too big for integer, and causes bugs
611
614
  currencyId = self.safe_string(account, 'asset')
612
615
  currencyCode = self.safe_currency_code(currencyId)
613
616
  result.append({
@@ -1077,28 +1080,14 @@ class currencycom(Exchange, ImplicitAPI):
1077
1080
  # "orderId": "00000000-0000-0000-0000-000006eacaa0",
1078
1081
  # "transactTime": "1645281669295",
1079
1082
  # "price": "30000.00000000",
1080
- # "origQty": "0.0002",
1081
- # "executedQty": "0.0", # positive for BUY, negative for SELL
1082
- # "status": "NEW",
1083
+ # "origQty": "0.0002", # might not be present for "market" order
1084
+ # "executedQty": "0.0", # positive for BUY, negative for SELL. This property might not be present in Leverage markets
1085
+ # "margin": 0.1, # present in leverage markets
1086
+ # "status": "NEW", # NEW, FILLED, ...
1083
1087
  # "timeInForce": "GTC",
1084
- # "type": "LIMIT",
1088
+ # "type": "LIMIT", # LIMIT, MARKET
1085
1089
  # "side": "BUY",
1086
- # }
1087
- #
1088
- # market
1089
- #
1090
- # {
1091
- # "symbol": "DOGE/USD",
1092
- # "orderId": "00000000-0000-0000-0000-000006eab2ad",
1093
- # "transactTime": "1645283022252",
1094
- # "price": "0.14066000",
1095
- # "origQty": "40",
1096
- # "executedQty": "40.0", # positive for BUY, negative for SELL
1097
- # "status": "FILLED",
1098
- # "timeInForce": "FOK",
1099
- # "type": "MARKET",
1100
- # "side": "SELL",
1101
- # "fills": [
1090
+ # "fills": [ # self field might not be present if there were no fills
1102
1091
  # {
1103
1092
  # "price": "0.14094",
1104
1093
  # "qty": "40.0",
@@ -1108,6 +1097,32 @@ class currencycom(Exchange, ImplicitAPI):
1108
1097
  # ],
1109
1098
  # }
1110
1099
  #
1100
+ # fetchOrder(fetchOpenOrders is an array same structure, with some extra fields)
1101
+ #
1102
+ # {
1103
+ # "symbol": "BTC/USD_LEVERAGE",
1104
+ # "accountId": "123456789012345678",
1105
+ # "orderId": "00a01234-0123-54c4-0000-123451234567",
1106
+ # "price": "25779.35",
1107
+ # "status": "MODIFIED",
1108
+ # "type": "LIMIT",
1109
+ # "timeInForceType": "GTC",
1110
+ # "side": "BUY",
1111
+ # "guaranteedStopLoss": False,
1112
+ # "trailingStopLoss": False,
1113
+ # "margin": "0.05",
1114
+ # "takeProfit": "27020.00",
1115
+ # "stopLoss": "24500.35",
1116
+ # "fills": [], # might not be present
1117
+ # "timestamp": "1685958369623", # "time" in "fetchOpenOrders"
1118
+ # "expireTime": "1686167960000", # "expireTimestamp" in "fetchOpenOrders"
1119
+ # "quantity": "0.00040", # "origQty" in "fetchOpenOrders"
1120
+ # "executedQty": "0.0", # present in "fetchOpenOrders"
1121
+ # "updateTime": "1685958369542", # present in "fetchOpenOrders"
1122
+ # "leverage": True, # present in "fetchOpenOrders"
1123
+ # "working": True # present in "fetchOpenOrders"
1124
+ # }
1125
+ #
1111
1126
  # cancelOrder
1112
1127
  #
1113
1128
  # {
@@ -1122,36 +1137,18 @@ class currencycom(Exchange, ImplicitAPI):
1122
1137
  # "side": "BUY",
1123
1138
  # }
1124
1139
  #
1125
- # fetchOpenOrders
1126
- #
1127
- # {
1128
- # "symbol": "DOGE/USD",
1129
- # "orderId": "00000000-0000-0003-0000-000004bcc27a",
1130
- # "price": "0.13",
1131
- # "origQty": "39.0",
1132
- # "executedQty": "0.0",
1133
- # "status": "NEW",
1134
- # "timeInForce": "GTC",
1135
- # "type": "LIMIT",
1136
- # "side": "BUY",
1137
- # "time": "1645284216240",
1138
- # "updateTime": "1645284216240",
1139
- # "leverage": False, # whether it's swap or not
1140
- # "working": True,
1141
- # }
1142
- #
1143
1140
  marketId = self.safe_string(order, 'symbol')
1144
1141
  symbol = self.safe_symbol(marketId, market, '/')
1145
1142
  id = self.safe_string(order, 'orderId')
1146
1143
  price = self.safe_string(order, 'price')
1147
- amount = self.safe_string(order, 'origQty')
1144
+ amount = self.safe_string_2(order, 'origQty', 'quantity')
1148
1145
  filledRaw = self.safe_string(order, 'executedQty')
1149
1146
  filled = Precise.string_abs(filledRaw)
1150
1147
  status = self.parse_order_status(self.safe_string(order, 'status'))
1151
- timeInForce = self.parse_order_time_in_force(self.safe_string(order, 'timeInForce'))
1148
+ timeInForce = self.parse_order_time_in_force(self.safe_string_2(order, 'timeInForce', 'timeInForceType'))
1152
1149
  type = self.parse_order_type(self.safe_string(order, 'type'))
1153
1150
  side = self.parse_order_side(self.safe_string(order, 'side'))
1154
- timestamp = self.safe_integer_2(order, 'time', 'transactTime')
1151
+ timestamp = self.safe_integer_n(order, ['time', 'transactTime', 'timestamp'])
1155
1152
  fills = self.safe_value(order, 'fills')
1156
1153
  return self.safe_order({
1157
1154
  'info': order,
@@ -1179,6 +1176,8 @@ class currencycom(Exchange, ImplicitAPI):
1179
1176
  def parse_order_status(self, status):
1180
1177
  statuses = {
1181
1178
  'NEW': 'open',
1179
+ 'CREATED': 'open',
1180
+ 'MODIFIED': 'open',
1182
1181
  'PARTIALLY_FILLED': 'open',
1183
1182
  'FILLED': 'closed',
1184
1183
  'CANCELED': 'canceled',
@@ -1304,6 +1303,46 @@ class currencycom(Exchange, ImplicitAPI):
1304
1303
  #
1305
1304
  return self.parse_order(response, market)
1306
1305
 
1306
+ async def fetch_order(self, id: str, symbol: Optional[str] = None, params={}):
1307
+ """
1308
+ fetches information on an order made by the user
1309
+ see https://apitradedoc.currency.com/swagger-ui.html#/rest-api/getOrderUsingGET
1310
+ :param str symbol: unified symbol of the market the order was made in
1311
+ :param dict params: extra parameters specific to the currencycom api endpoint
1312
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1313
+ """
1314
+ self.check_required_symbol('fetchOrder', symbol)
1315
+ await self.load_markets()
1316
+ market = self.market(symbol)
1317
+ request = {
1318
+ 'orderId': id,
1319
+ 'symbol': market['id'],
1320
+ }
1321
+ response = await self.privateGetV2FetchOrder(self.extend(request, params))
1322
+ #
1323
+ # {
1324
+ # "accountId": "109698017413125316",
1325
+ # "orderId": "2810f1c5-0079-54c4-0000-000080421601",
1326
+ # "quantity": "20.0",
1327
+ # "price": "0.06",
1328
+ # "timestamp": "1661157503788",
1329
+ # "status": "CREATED",
1330
+ # "type": "LIMIT",
1331
+ # "timeInForceType": "GTC",
1332
+ # "side": "BUY",
1333
+ # "margin": "0.1",
1334
+ # "fills": [ # might not be present
1335
+ # {
1336
+ # "price": "0.14094",
1337
+ # "qty": "40.0",
1338
+ # "commission": "0",
1339
+ # "commissionAsset": "dUSD"
1340
+ # }
1341
+ # ]
1342
+ # }
1343
+ #
1344
+ return self.parse_order(response)
1345
+
1307
1346
  async def fetch_open_orders(self, symbol: Optional[str] = None, since: Optional[int] = None, limit: Optional[int] = None, params={}):
1308
1347
  """
1309
1348
  fetch all unfilled currently open orders
@@ -198,6 +198,7 @@ class poloniex(Exchange, ImplicitAPI):
198
198
  'BDG': 'Badgercoin',
199
199
  'BTM': 'Bitmark',
200
200
  'CON': 'Coino',
201
+ 'ETHTRON': 'ETH',
201
202
  'GOLD': 'GoldEagles',
202
203
  'GPUC': 'GPU',
203
204
  'HOT': 'Hotcoin',
@@ -210,6 +211,7 @@ class poloniex(Exchange, ImplicitAPI):
210
211
  'STR': 'XLM',
211
212
  'SOC': 'SOCC',
212
213
  'TRADE': 'Unitrade',
214
+ 'TRXETH': 'TRX',
213
215
  'XAP': 'API Coin',
214
216
  # self is not documented in the API docs for Poloniex
215
217
  # https://github.com/ccxt/ccxt/issues/7084
@@ -220,6 +222,7 @@ class poloniex(Exchange, ImplicitAPI):
220
222
  # with a USDTTRON or a USDTETH currency id, respectfully
221
223
  # therefore we have map them back to the original code USDT
222
224
  # otherwise the returned withdrawals are filtered out
225
+ 'USDTBSC': 'USDT',
223
226
  'USDTTRON': 'USDT',
224
227
  'USDTETH': 'USDT',
225
228
  'UST': 'USTC',
@@ -234,6 +237,7 @@ class poloniex(Exchange, ImplicitAPI):
234
237
  'BSC': 'BEP20',
235
238
  'ETH': 'ERC20',
236
239
  'TRON': 'TRC20',
240
+ 'TRX': 'TRC20',
237
241
  },
238
242
  'limits': {
239
243
  'cost': {
@@ -643,7 +647,7 @@ class poloniex(Exchange, ImplicitAPI):
643
647
  :param dict params: extra parameters specific to the poloniex api endpoint
644
648
  :returns dict: an associative dictionary of currencies
645
649
  """
646
- response = await self.publicGetCurrencies(params)
650
+ response = await self.publicGetCurrencies(self.extend(params, {'includeMultiChainCurrencies': True}))
647
651
  #
648
652
  # [
649
653
  # {
@@ -659,6 +663,8 @@ class poloniex(Exchange, ImplicitAPI):
659
663
  # "delisted": False,
660
664
  # "tradingState": "NORMAL",
661
665
  # "walletState": "DISABLED",
666
+ # "walletDepositState": 'DISABLED',
667
+ # "walletWithdrawalState": 'DISABLED',
662
668
  # "parentChain": null,
663
669
  # "isMultiChain": False,
664
670
  # "isChildChain": False,
@@ -674,36 +680,91 @@ class poloniex(Exchange, ImplicitAPI):
674
680
  id = self.safe_value(ids, 0)
675
681
  currency = self.safe_value(item, id)
676
682
  code = self.safe_currency_code(id)
683
+ name = self.safe_string(currency, 'name')
684
+ networkId = self.safe_string(currency, 'blockchain')
685
+ networkCode = self.network_id_to_code(networkId, code)
677
686
  delisted = self.safe_value(currency, 'delisted')
678
- walletState = self.safe_string(currency, 'walletState')
679
- enabled = walletState == 'ENABLED'
680
- listed = not delisted
681
- active = listed and enabled
687
+ walletEnabled = self.safe_string(currency, 'walletState') == 'ENABLED'
688
+ depositEnabled = self.safe_string(currency, 'walletDepositState') == 'ENABLED'
689
+ withdrawEnabled = self.safe_string(currency, 'walletWithdrawalState') == 'ENABLED'
690
+ active = not delisted and walletEnabled and depositEnabled and withdrawEnabled
682
691
  numericId = self.safe_integer(currency, 'id')
683
- fee = self.safe_number(currency, 'withdrawalFee')
684
- result[code] = {
685
- 'id': id,
686
- 'numericId': numericId,
687
- 'code': code,
692
+ feeString = self.safe_string(currency, 'withdrawalFee')
693
+ parentChain = self.safe_value(currency, 'parentChain')
694
+ noParentChain = parentChain is None
695
+ if self.safe_value(result, code) is None:
696
+ result[code] = {
697
+ 'id': id,
698
+ 'code': code,
699
+ 'info': None,
700
+ 'name': name,
701
+ 'active': active,
702
+ 'deposit': depositEnabled,
703
+ 'withdraw': withdrawEnabled,
704
+ 'fee': self.parse_number(feeString),
705
+ 'precision': None,
706
+ 'limits': {
707
+ 'amount': {
708
+ 'min': None,
709
+ 'max': None,
710
+ },
711
+ 'deposit': {
712
+ 'min': None,
713
+ 'max': None,
714
+ },
715
+ 'withdraw': {
716
+ 'min': None,
717
+ 'max': None,
718
+ },
719
+ },
720
+ }
721
+ minFeeString = self.safe_string(result[code], 'fee')
722
+ if feeString is not None:
723
+ minFeeString = feeString if (minFeeString is None) else Precise.string_min(feeString, minFeeString)
724
+ depositAvailable = self.safe_value(result[code], 'deposit')
725
+ depositAvailable = depositEnabled if (depositEnabled) else depositAvailable
726
+ withdrawAvailable = self.safe_value(result[code], 'withdraw')
727
+ withdrawAvailable = withdrawEnabled if (withdrawEnabled) else withdrawAvailable
728
+ networks = self.safe_value(result[code], 'networks', {})
729
+ networks[networkCode] = {
688
730
  'info': currency,
689
- 'name': currency['name'],
731
+ 'id': networkId,
732
+ 'network': networkCode,
733
+ 'currencyId': id,
734
+ 'numericId': numericId,
735
+ 'deposit': depositEnabled,
736
+ 'withdraw': withdrawEnabled,
690
737
  'active': active,
691
- 'deposit': None,
692
- 'withdraw': None,
693
- 'fee': fee,
738
+ 'fee': self.parse_number(feeString),
694
739
  'precision': None,
695
- 'networks': {},
696
740
  'limits': {
697
741
  'amount': {
698
742
  'min': None,
699
743
  'max': None,
700
744
  },
701
745
  'withdraw': {
702
- 'min': fee,
746
+ 'min': None,
747
+ 'max': None,
748
+ },
749
+ 'deposit': {
750
+ 'min': None,
703
751
  'max': None,
704
752
  },
705
753
  },
706
754
  }
755
+ result[code]['networks'] = networks
756
+ info = self.safe_value(result[code], 'info', [])
757
+ rawInfo = {}
758
+ rawInfo[id] = currency
759
+ info.append(rawInfo)
760
+ result[code]['info'] = info
761
+ if noParentChain:
762
+ result[code]['id'] = id
763
+ result[code]['name'] = name
764
+ result[code]['active'] = depositAvailable and withdrawAvailable
765
+ result[code]['deposit'] = depositAvailable
766
+ result[code]['withdraw'] = withdrawAvailable
767
+ result[code]['fee'] = self.parse_number(minFeeString)
707
768
  return result
708
769
 
709
770
  async def fetch_ticker(self, symbol: str, params={}):
ccxt/async_support/xt.py CHANGED
@@ -4342,7 +4342,11 @@ class xt(Exchange, ImplicitAPI):
4342
4342
  timestamp = self.number_to_string(self.nonce())
4343
4343
  body = query
4344
4344
  if (payload == '/v4/order') or (payload == '/future/trade/v1/order/create') or (payload == '/future/trade/v1/entrust/create-plan') or (payload == '/future/trade/v1/entrust/create-profit') or (payload == '/future/trade/v1/order/create-batch'):
4345
- body['clientMedia'] = 'CCXT'
4345
+ id = 'CCXT'
4346
+ if payload.find('future') > -1:
4347
+ body['clientMedia'] = id
4348
+ else:
4349
+ body['media'] = id
4346
4350
  isUndefinedBody = ((method == 'GET') or (path == 'order/{orderId}'))
4347
4351
  body = None if isUndefinedBody else self.json(body)
4348
4352
  payloadString = None
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '3.1.23'
7
+ __version__ = '3.1.24'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2406,21 +2406,10 @@ class Exchange(object):
2406
2406
  })
2407
2407
 
2408
2408
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Optional[int] = None, limit: Optional[int] = None, params={}):
2409
- if not self.has['fetchTrades']:
2410
- raise NotSupported(self.id + ' fetchOHLCV() is not supported yet')
2411
- trades = self.fetchTrades(symbol, since, limit, params)
2412
- ohlcvc = self.build_ohlcvc(trades, timeframe, since, limit)
2413
- result = []
2414
- for i in range(0, len(ohlcvc)):
2415
- result.append([
2416
- self.safe_integer(ohlcvc[i], 0),
2417
- self.safe_number(ohlcvc[i], 1),
2418
- self.safe_number(ohlcvc[i], 2),
2419
- self.safe_number(ohlcvc[i], 3),
2420
- self.safe_number(ohlcvc[i], 4),
2421
- self.safe_number(ohlcvc[i], 5),
2422
- ])
2423
- return result
2409
+ message = ''
2410
+ if self.has['fetchTrades']:
2411
+ message = '. If you want to build OHLCV candles from trade executions data, visit https://github.com/ccxt/ccxt/tree/master/examples/ and see "build-ohlcv-bars" file'
2412
+ raise NotSupported(self.id + ' fetchOHLCV() is not supported yet' + message)
2424
2413
 
2425
2414
  def watch_ohlcv(self, symbol: str, timeframe='1m', since: Optional[int] = None, limit: Optional[int] = None, params={}):
2426
2415
  raise NotSupported(self.id + ' watchOHLCV() is not supported yet')
@@ -2887,13 +2876,6 @@ class Exchange(object):
2887
2876
  ohlcvs[candle][i_count] = self.sum(ohlcvs[candle][i_count], 1)
2888
2877
  return ohlcvs
2889
2878
 
2890
- def fetch_ohlcvc(self, symbol, timeframe='1m', since: Optional[Any] = None, limit: Optional[int] = None, params={}):
2891
- if not self.has['fetchTrades']:
2892
- raise NotSupported(self.id + ' fetchOHLCV() is not supported yet')
2893
- self.load_markets()
2894
- trades = self.fetchTrades(symbol, since, limit, params)
2895
- return self.build_ohlcvc(trades, timeframe, since, limit)
2896
-
2897
2879
  def parse_trading_view_ohlcv(self, ohlcvs, market=None, timeframe='1m', since: Optional[int] = None, limit: Optional[int] = None):
2898
2880
  result = self.convert_trading_view_to_ohlcv(ohlcvs)
2899
2881
  return self.parse_ohlcvs(result, market, timeframe, since, limit)
ccxt/bitget.py CHANGED
@@ -2360,19 +2360,22 @@ class bitget(Exchange, ImplicitAPI):
2360
2360
  #
2361
2361
  # spot
2362
2362
  # {
2363
- # accountId: '6394957606',
2364
- # symbol: 'BTCUSDT_SPBL',
2365
- # orderId: '881623995442958336',
2366
- # clientOrderId: '135335e9-b054-4e43-b00a-499f11d3a5cc',
2367
- # price: '39000.000000000000',
2368
- # quantity: '0.000700000000',
2369
- # orderType: 'limit',
2370
- # side: 'buy',
2371
- # status: 'new',
2372
- # fillPrice: '0.000000000000',
2373
- # fillQuantity: '0.000000000000',
2374
- # fillTotalAmount: '0.000000000000',
2375
- # cTime: '1645921460972'
2363
+ # "accountId": "222222222",
2364
+ # "symbol": "TRXUSDT_SPBL",
2365
+ # "orderId": "1041901704004947968",
2366
+ # "clientOrderId": "c5e8a5e1-a07f-4202-8061-b88bd598b264",
2367
+ # "price": "0",
2368
+ # "quantity": "10.0000000000000000",
2369
+ # "orderType": "market",
2370
+ # "side": "buy",
2371
+ # "status": "full_fill",
2372
+ # "fillPrice": "0.0699782527055350",
2373
+ # "fillQuantity": "142.9015000000000000",
2374
+ # "fillTotalAmount": "9.9999972790000000",
2375
+ # "enterPointSource": "API",
2376
+ # "feeDetail": "{\"BGB\":{\"deduction\":true,\"feeCoinCode\":\"BGB\",\"totalDeductionFee\":-0.017118519726,\"totalFee\":-0.017118519726}}",
2377
+ # "orderSource": "market",
2378
+ # "cTime": "1684134644509"
2376
2379
  # }
2377
2380
  #
2378
2381
  # swap
@@ -2434,6 +2437,22 @@ class bitget(Exchange, ImplicitAPI):
2434
2437
  side = 'sell'
2435
2438
  clientOrderId = self.safe_string_2(order, 'clientOrderId', 'clientOid')
2436
2439
  fee = None
2440
+ feeCostString = self.safe_string(order, 'fee')
2441
+ if feeCostString is not None:
2442
+ # swap
2443
+ fee = {
2444
+ 'cost': feeCostString,
2445
+ 'currency': market['settle'],
2446
+ }
2447
+ feeDetail = self.safe_value(order, 'feeDetail')
2448
+ if feeDetail is not None:
2449
+ parsedFeeDetail = json.loads(feeDetail)
2450
+ feeValues = list(parsedFeeDetail.values())
2451
+ first = self.safe_value(feeValues, 0)
2452
+ fee = {
2453
+ 'cost': self.safe_string(first, 'totalFee'),
2454
+ 'currency': self.safe_currency_code(self.safe_string(first, 'feeCoinCode')),
2455
+ }
2437
2456
  rawStatus = self.safe_string_2(order, 'status', 'state')
2438
2457
  status = self.parse_order_status(rawStatus)
2439
2458
  lastTradeTimestamp = self.safe_integer(order, 'uTime')
@@ -3307,7 +3326,10 @@ class bitget(Exchange, ImplicitAPI):
3307
3326
  # }
3308
3327
  #
3309
3328
  data = self.safe_value(response, 'data')
3310
- return self.safe_value(data, 'orderList', [])
3329
+ if data is not None:
3330
+ return self.safe_value_2(data, 'orderList', 'data', [])
3331
+ parsedData = json.loads(response)
3332
+ return self.safe_value(parsedData, 'data', [])
3311
3333
 
3312
3334
  def fetch_ledger(self, code: Optional[str] = None, since: Optional[int] = None, limit: Optional[int] = None, params={}):
3313
3335
  """
ccxt/bybit.py CHANGED
@@ -410,6 +410,7 @@ class bybit(Exchange, ImplicitAPI):
410
410
  # user
411
411
  'v5/user/query-sub-members': 10,
412
412
  'v5/user/query-api': 10,
413
+ 'v5/customer/info': 10,
413
414
  'v5/spot-cross-margin-trade/loan-info': 1, # 50/s => cost = 50 / 50 = 1
414
415
  'v5/spot-cross-margin-trade/account': 1, # 50/s => cost = 50 / 50 = 1
415
416
  'v5/spot-cross-margin-trade/orders': 1, # 50/s => cost = 50 / 50 = 1
ccxt/currencycom.py CHANGED
@@ -88,7 +88,7 @@ class currencycom(Exchange, ImplicitAPI):
88
88
  'fetchOHLCV': True,
89
89
  'fetchOpenOrder': None,
90
90
  'fetchOpenOrders': True,
91
- 'fetchOrder': None,
91
+ 'fetchOrder': True,
92
92
  'fetchOrderBook': True,
93
93
  'fetchOrderBooks': None,
94
94
  'fetchOrders': None,
@@ -214,6 +214,7 @@ class currencycom(Exchange, ImplicitAPI):
214
214
  'v2/tradingPositionsHistory': 1,
215
215
  'v2/transactions': 1,
216
216
  'v2/withdrawals': 1,
217
+ 'v2/fetchOrder': 1,
217
218
  },
218
219
  'post': {
219
220
  'v1/order': 1,
@@ -269,6 +270,8 @@ class currencycom(Exchange, ImplicitAPI):
269
270
  'Only leverage symbol allowed here:': BadSymbol, # when you fetchLeverage for non-leverage symbols, like 'BTC/USDT' instead of 'BTC/USDT_LEVERAGE': {"code":"-1128","msg":"Only leverage symbol allowed here: BTC/USDT"}
270
271
  'market data service is not available': ExchangeNotAvailable, # {"code":"-1021","msg":"market data service is not available"}
271
272
  'your time is ahead of server': InvalidNonce, # {"code":"-1021","msg":"your time is ahead of server"}
273
+ 'Can not find account': BadRequest, # -1128
274
+ 'You mentioned an invalid value for the price parameter': BadRequest, # -1030
272
275
  },
273
276
  'exact': {
274
277
  '-1000': ExchangeNotAvailable, # {"code":-1000,"msg":"An unknown error occured while processing the request."}
@@ -279,7 +282,7 @@ class currencycom(Exchange, ImplicitAPI):
279
282
  '-1100': InvalidOrder, # createOrder(symbol, 1, asdf) -> 'Illegal characters found in parameter 'price'
280
283
  '-1104': ExchangeError, # Not all sent parameters were read, read 8 parameters but was sent 9
281
284
  '-1025': AuthenticationError, # {"code":-1025,"msg":"Invalid API-key, IP, or permissions for action"}
282
- '-1128': BadRequest, # {"code":-1128,"msg":"Combination of optional parameters invalid."} | {"code":"-1128","msg":"Combination of parameters invalid"} | {"code":"-1128","msg":"Invalid limit price"}
285
+ '-1128': BadRequest, # {"code":-1128,"msg":"Combination of optional parameters invalid."} | {"code":"-1128","msg":"Combination of parameters invalid"} | {"code":"-1128","msg":"Invalid limit price"} | {"code":"-1128","msg":"Can not find account: null"}
283
286
  '-2010': ExchangeError, # generic error code for createOrder -> 'Account has insufficient balance for requested action.', {"code":-2010,"msg":"Rest API trading is not enabled."}, etc...
284
287
  '-2011': OrderNotFound, # cancelOrder(1, 'BTC/USDT') -> 'UNKNOWN_ORDER'
285
288
  '-2013': OrderNotFound, # fetchOrder(1, 'BTC/USDT') -> 'Order does not exist'
@@ -607,7 +610,7 @@ class currencycom(Exchange, ImplicitAPI):
607
610
  result = []
608
611
  for i in range(0, len(accounts)):
609
612
  account = accounts[i]
610
- accountId = self.safe_integer(account, 'accountId')
613
+ accountId = self.safe_string(account, 'accountId') # must be string, because the numeric value is far too big for integer, and causes bugs
611
614
  currencyId = self.safe_string(account, 'asset')
612
615
  currencyCode = self.safe_currency_code(currencyId)
613
616
  result.append({
@@ -1077,28 +1080,14 @@ class currencycom(Exchange, ImplicitAPI):
1077
1080
  # "orderId": "00000000-0000-0000-0000-000006eacaa0",
1078
1081
  # "transactTime": "1645281669295",
1079
1082
  # "price": "30000.00000000",
1080
- # "origQty": "0.0002",
1081
- # "executedQty": "0.0", # positive for BUY, negative for SELL
1082
- # "status": "NEW",
1083
+ # "origQty": "0.0002", # might not be present for "market" order
1084
+ # "executedQty": "0.0", # positive for BUY, negative for SELL. This property might not be present in Leverage markets
1085
+ # "margin": 0.1, # present in leverage markets
1086
+ # "status": "NEW", # NEW, FILLED, ...
1083
1087
  # "timeInForce": "GTC",
1084
- # "type": "LIMIT",
1088
+ # "type": "LIMIT", # LIMIT, MARKET
1085
1089
  # "side": "BUY",
1086
- # }
1087
- #
1088
- # market
1089
- #
1090
- # {
1091
- # "symbol": "DOGE/USD",
1092
- # "orderId": "00000000-0000-0000-0000-000006eab2ad",
1093
- # "transactTime": "1645283022252",
1094
- # "price": "0.14066000",
1095
- # "origQty": "40",
1096
- # "executedQty": "40.0", # positive for BUY, negative for SELL
1097
- # "status": "FILLED",
1098
- # "timeInForce": "FOK",
1099
- # "type": "MARKET",
1100
- # "side": "SELL",
1101
- # "fills": [
1090
+ # "fills": [ # self field might not be present if there were no fills
1102
1091
  # {
1103
1092
  # "price": "0.14094",
1104
1093
  # "qty": "40.0",
@@ -1108,6 +1097,32 @@ class currencycom(Exchange, ImplicitAPI):
1108
1097
  # ],
1109
1098
  # }
1110
1099
  #
1100
+ # fetchOrder(fetchOpenOrders is an array same structure, with some extra fields)
1101
+ #
1102
+ # {
1103
+ # "symbol": "BTC/USD_LEVERAGE",
1104
+ # "accountId": "123456789012345678",
1105
+ # "orderId": "00a01234-0123-54c4-0000-123451234567",
1106
+ # "price": "25779.35",
1107
+ # "status": "MODIFIED",
1108
+ # "type": "LIMIT",
1109
+ # "timeInForceType": "GTC",
1110
+ # "side": "BUY",
1111
+ # "guaranteedStopLoss": False,
1112
+ # "trailingStopLoss": False,
1113
+ # "margin": "0.05",
1114
+ # "takeProfit": "27020.00",
1115
+ # "stopLoss": "24500.35",
1116
+ # "fills": [], # might not be present
1117
+ # "timestamp": "1685958369623", # "time" in "fetchOpenOrders"
1118
+ # "expireTime": "1686167960000", # "expireTimestamp" in "fetchOpenOrders"
1119
+ # "quantity": "0.00040", # "origQty" in "fetchOpenOrders"
1120
+ # "executedQty": "0.0", # present in "fetchOpenOrders"
1121
+ # "updateTime": "1685958369542", # present in "fetchOpenOrders"
1122
+ # "leverage": True, # present in "fetchOpenOrders"
1123
+ # "working": True # present in "fetchOpenOrders"
1124
+ # }
1125
+ #
1111
1126
  # cancelOrder
1112
1127
  #
1113
1128
  # {
@@ -1122,36 +1137,18 @@ class currencycom(Exchange, ImplicitAPI):
1122
1137
  # "side": "BUY",
1123
1138
  # }
1124
1139
  #
1125
- # fetchOpenOrders
1126
- #
1127
- # {
1128
- # "symbol": "DOGE/USD",
1129
- # "orderId": "00000000-0000-0003-0000-000004bcc27a",
1130
- # "price": "0.13",
1131
- # "origQty": "39.0",
1132
- # "executedQty": "0.0",
1133
- # "status": "NEW",
1134
- # "timeInForce": "GTC",
1135
- # "type": "LIMIT",
1136
- # "side": "BUY",
1137
- # "time": "1645284216240",
1138
- # "updateTime": "1645284216240",
1139
- # "leverage": False, # whether it's swap or not
1140
- # "working": True,
1141
- # }
1142
- #
1143
1140
  marketId = self.safe_string(order, 'symbol')
1144
1141
  symbol = self.safe_symbol(marketId, market, '/')
1145
1142
  id = self.safe_string(order, 'orderId')
1146
1143
  price = self.safe_string(order, 'price')
1147
- amount = self.safe_string(order, 'origQty')
1144
+ amount = self.safe_string_2(order, 'origQty', 'quantity')
1148
1145
  filledRaw = self.safe_string(order, 'executedQty')
1149
1146
  filled = Precise.string_abs(filledRaw)
1150
1147
  status = self.parse_order_status(self.safe_string(order, 'status'))
1151
- timeInForce = self.parse_order_time_in_force(self.safe_string(order, 'timeInForce'))
1148
+ timeInForce = self.parse_order_time_in_force(self.safe_string_2(order, 'timeInForce', 'timeInForceType'))
1152
1149
  type = self.parse_order_type(self.safe_string(order, 'type'))
1153
1150
  side = self.parse_order_side(self.safe_string(order, 'side'))
1154
- timestamp = self.safe_integer_2(order, 'time', 'transactTime')
1151
+ timestamp = self.safe_integer_n(order, ['time', 'transactTime', 'timestamp'])
1155
1152
  fills = self.safe_value(order, 'fills')
1156
1153
  return self.safe_order({
1157
1154
  'info': order,
@@ -1179,6 +1176,8 @@ class currencycom(Exchange, ImplicitAPI):
1179
1176
  def parse_order_status(self, status):
1180
1177
  statuses = {
1181
1178
  'NEW': 'open',
1179
+ 'CREATED': 'open',
1180
+ 'MODIFIED': 'open',
1182
1181
  'PARTIALLY_FILLED': 'open',
1183
1182
  'FILLED': 'closed',
1184
1183
  'CANCELED': 'canceled',
@@ -1304,6 +1303,46 @@ class currencycom(Exchange, ImplicitAPI):
1304
1303
  #
1305
1304
  return self.parse_order(response, market)
1306
1305
 
1306
+ def fetch_order(self, id: str, symbol: Optional[str] = None, params={}):
1307
+ """
1308
+ fetches information on an order made by the user
1309
+ see https://apitradedoc.currency.com/swagger-ui.html#/rest-api/getOrderUsingGET
1310
+ :param str symbol: unified symbol of the market the order was made in
1311
+ :param dict params: extra parameters specific to the currencycom api endpoint
1312
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1313
+ """
1314
+ self.check_required_symbol('fetchOrder', symbol)
1315
+ self.load_markets()
1316
+ market = self.market(symbol)
1317
+ request = {
1318
+ 'orderId': id,
1319
+ 'symbol': market['id'],
1320
+ }
1321
+ response = self.privateGetV2FetchOrder(self.extend(request, params))
1322
+ #
1323
+ # {
1324
+ # "accountId": "109698017413125316",
1325
+ # "orderId": "2810f1c5-0079-54c4-0000-000080421601",
1326
+ # "quantity": "20.0",
1327
+ # "price": "0.06",
1328
+ # "timestamp": "1661157503788",
1329
+ # "status": "CREATED",
1330
+ # "type": "LIMIT",
1331
+ # "timeInForceType": "GTC",
1332
+ # "side": "BUY",
1333
+ # "margin": "0.1",
1334
+ # "fills": [ # might not be present
1335
+ # {
1336
+ # "price": "0.14094",
1337
+ # "qty": "40.0",
1338
+ # "commission": "0",
1339
+ # "commissionAsset": "dUSD"
1340
+ # }
1341
+ # ]
1342
+ # }
1343
+ #
1344
+ return self.parse_order(response)
1345
+
1307
1346
  def fetch_open_orders(self, symbol: Optional[str] = None, since: Optional[int] = None, limit: Optional[int] = None, params={}):
1308
1347
  """
1309
1348
  fetch all unfilled currently open orders
ccxt/poloniex.py CHANGED
@@ -198,6 +198,7 @@ class poloniex(Exchange, ImplicitAPI):
198
198
  'BDG': 'Badgercoin',
199
199
  'BTM': 'Bitmark',
200
200
  'CON': 'Coino',
201
+ 'ETHTRON': 'ETH',
201
202
  'GOLD': 'GoldEagles',
202
203
  'GPUC': 'GPU',
203
204
  'HOT': 'Hotcoin',
@@ -210,6 +211,7 @@ class poloniex(Exchange, ImplicitAPI):
210
211
  'STR': 'XLM',
211
212
  'SOC': 'SOCC',
212
213
  'TRADE': 'Unitrade',
214
+ 'TRXETH': 'TRX',
213
215
  'XAP': 'API Coin',
214
216
  # self is not documented in the API docs for Poloniex
215
217
  # https://github.com/ccxt/ccxt/issues/7084
@@ -220,6 +222,7 @@ class poloniex(Exchange, ImplicitAPI):
220
222
  # with a USDTTRON or a USDTETH currency id, respectfully
221
223
  # therefore we have map them back to the original code USDT
222
224
  # otherwise the returned withdrawals are filtered out
225
+ 'USDTBSC': 'USDT',
223
226
  'USDTTRON': 'USDT',
224
227
  'USDTETH': 'USDT',
225
228
  'UST': 'USTC',
@@ -234,6 +237,7 @@ class poloniex(Exchange, ImplicitAPI):
234
237
  'BSC': 'BEP20',
235
238
  'ETH': 'ERC20',
236
239
  'TRON': 'TRC20',
240
+ 'TRX': 'TRC20',
237
241
  },
238
242
  'limits': {
239
243
  'cost': {
@@ -643,7 +647,7 @@ class poloniex(Exchange, ImplicitAPI):
643
647
  :param dict params: extra parameters specific to the poloniex api endpoint
644
648
  :returns dict: an associative dictionary of currencies
645
649
  """
646
- response = self.publicGetCurrencies(params)
650
+ response = self.publicGetCurrencies(self.extend(params, {'includeMultiChainCurrencies': True}))
647
651
  #
648
652
  # [
649
653
  # {
@@ -659,6 +663,8 @@ class poloniex(Exchange, ImplicitAPI):
659
663
  # "delisted": False,
660
664
  # "tradingState": "NORMAL",
661
665
  # "walletState": "DISABLED",
666
+ # "walletDepositState": 'DISABLED',
667
+ # "walletWithdrawalState": 'DISABLED',
662
668
  # "parentChain": null,
663
669
  # "isMultiChain": False,
664
670
  # "isChildChain": False,
@@ -674,36 +680,91 @@ class poloniex(Exchange, ImplicitAPI):
674
680
  id = self.safe_value(ids, 0)
675
681
  currency = self.safe_value(item, id)
676
682
  code = self.safe_currency_code(id)
683
+ name = self.safe_string(currency, 'name')
684
+ networkId = self.safe_string(currency, 'blockchain')
685
+ networkCode = self.network_id_to_code(networkId, code)
677
686
  delisted = self.safe_value(currency, 'delisted')
678
- walletState = self.safe_string(currency, 'walletState')
679
- enabled = walletState == 'ENABLED'
680
- listed = not delisted
681
- active = listed and enabled
687
+ walletEnabled = self.safe_string(currency, 'walletState') == 'ENABLED'
688
+ depositEnabled = self.safe_string(currency, 'walletDepositState') == 'ENABLED'
689
+ withdrawEnabled = self.safe_string(currency, 'walletWithdrawalState') == 'ENABLED'
690
+ active = not delisted and walletEnabled and depositEnabled and withdrawEnabled
682
691
  numericId = self.safe_integer(currency, 'id')
683
- fee = self.safe_number(currency, 'withdrawalFee')
684
- result[code] = {
685
- 'id': id,
686
- 'numericId': numericId,
687
- 'code': code,
692
+ feeString = self.safe_string(currency, 'withdrawalFee')
693
+ parentChain = self.safe_value(currency, 'parentChain')
694
+ noParentChain = parentChain is None
695
+ if self.safe_value(result, code) is None:
696
+ result[code] = {
697
+ 'id': id,
698
+ 'code': code,
699
+ 'info': None,
700
+ 'name': name,
701
+ 'active': active,
702
+ 'deposit': depositEnabled,
703
+ 'withdraw': withdrawEnabled,
704
+ 'fee': self.parse_number(feeString),
705
+ 'precision': None,
706
+ 'limits': {
707
+ 'amount': {
708
+ 'min': None,
709
+ 'max': None,
710
+ },
711
+ 'deposit': {
712
+ 'min': None,
713
+ 'max': None,
714
+ },
715
+ 'withdraw': {
716
+ 'min': None,
717
+ 'max': None,
718
+ },
719
+ },
720
+ }
721
+ minFeeString = self.safe_string(result[code], 'fee')
722
+ if feeString is not None:
723
+ minFeeString = feeString if (minFeeString is None) else Precise.string_min(feeString, minFeeString)
724
+ depositAvailable = self.safe_value(result[code], 'deposit')
725
+ depositAvailable = depositEnabled if (depositEnabled) else depositAvailable
726
+ withdrawAvailable = self.safe_value(result[code], 'withdraw')
727
+ withdrawAvailable = withdrawEnabled if (withdrawEnabled) else withdrawAvailable
728
+ networks = self.safe_value(result[code], 'networks', {})
729
+ networks[networkCode] = {
688
730
  'info': currency,
689
- 'name': currency['name'],
731
+ 'id': networkId,
732
+ 'network': networkCode,
733
+ 'currencyId': id,
734
+ 'numericId': numericId,
735
+ 'deposit': depositEnabled,
736
+ 'withdraw': withdrawEnabled,
690
737
  'active': active,
691
- 'deposit': None,
692
- 'withdraw': None,
693
- 'fee': fee,
738
+ 'fee': self.parse_number(feeString),
694
739
  'precision': None,
695
- 'networks': {},
696
740
  'limits': {
697
741
  'amount': {
698
742
  'min': None,
699
743
  'max': None,
700
744
  },
701
745
  'withdraw': {
702
- 'min': fee,
746
+ 'min': None,
747
+ 'max': None,
748
+ },
749
+ 'deposit': {
750
+ 'min': None,
703
751
  'max': None,
704
752
  },
705
753
  },
706
754
  }
755
+ result[code]['networks'] = networks
756
+ info = self.safe_value(result[code], 'info', [])
757
+ rawInfo = {}
758
+ rawInfo[id] = currency
759
+ info.append(rawInfo)
760
+ result[code]['info'] = info
761
+ if noParentChain:
762
+ result[code]['id'] = id
763
+ result[code]['name'] = name
764
+ result[code]['active'] = depositAvailable and withdrawAvailable
765
+ result[code]['deposit'] = depositAvailable
766
+ result[code]['withdraw'] = withdrawAvailable
767
+ result[code]['fee'] = self.parse_number(minFeeString)
707
768
  return result
708
769
 
709
770
  def fetch_ticker(self, symbol: str, params={}):
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '3.1.23'
7
+ __version__ = '3.1.24'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/xt.py CHANGED
@@ -4341,7 +4341,11 @@ class xt(Exchange, ImplicitAPI):
4341
4341
  timestamp = self.number_to_string(self.nonce())
4342
4342
  body = query
4343
4343
  if (payload == '/v4/order') or (payload == '/future/trade/v1/order/create') or (payload == '/future/trade/v1/entrust/create-plan') or (payload == '/future/trade/v1/entrust/create-profit') or (payload == '/future/trade/v1/order/create-batch'):
4344
- body['clientMedia'] = 'CCXT'
4344
+ id = 'CCXT'
4345
+ if payload.find('future') > -1:
4346
+ body['clientMedia'] = id
4347
+ else:
4348
+ body['media'] = id
4345
4349
  isUndefinedBody = ((method == 'GET') or (path == 'order/{orderId}'))
4346
4350
  body = None if isUndefinedBody else self.json(body)
4347
4351
  payloadString = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 3.1.23
3
+ Version: 3.1.24
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 130+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -264,13 +264,13 @@ console.log(version, Object.keys(exchanges));
264
264
 
265
265
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
266
266
 
267
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@3.1.23/dist/ccxt.browser.js
268
- * unpkg: https://unpkg.com/ccxt@3.1.23/dist/ccxt.browser.js
267
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@3.1.24/dist/ccxt.browser.js
268
+ * unpkg: https://unpkg.com/ccxt@3.1.24/dist/ccxt.browser.js
269
269
 
270
270
  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.
271
271
 
272
272
  ```HTML
273
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@3.1.23/dist/ccxt.browser.js"></script>
273
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@3.1.24/dist/ccxt.browser.js"></script>
274
274
  ```
275
275
 
276
276
  Creates a global `ccxt` object:
@@ -1,4 +1,4 @@
1
- ccxt/__init__.py,sha256=RICypjG2HSpvbsLpZA-NP2UDfGTUJKtJNwS4wdmwpQE,15531
1
+ ccxt/__init__.py,sha256=4umWpOziooqPyqK_yH16s56svTFX5AYnsuq0F292G0Y,15531
2
2
  ccxt/ace.py,sha256=EF63BJQ3hYZO9atvTrzpLrBeA80bH5mdfdzhBUSSULE,41329
3
3
  ccxt/alpaca.py,sha256=cn5ABCJszrfE2qWMCDIW_1F-dGHtBbG-7zeo8tpNaeE,33161
4
4
  ccxt/ascendex.py,sha256=NVSEWJYQAj-5W3Zu8WE6nGO0qWUpbVWauXXyaNj0JM8,129270
@@ -17,7 +17,7 @@ ccxt/bitfinex.py,sha256=p4utzPqvd3aMDzfAuiuY8Ui4Eu66fOuiwjDPFAA2Lio,69312
17
17
  ccxt/bitfinex2.py,sha256=uDHBHSgacp2V48PAX6AwiO9J1JtSeBqYGBV0nyGruXU,111509
18
18
  ccxt/bitflyer.py,sha256=uCr57Qn3l5EMzM1KSTsDjihxSUkSygxKYyZg_S2TEKQ,37741
19
19
  ccxt/bitforex.py,sha256=-d7g8taNUI01JsxGs2MtoY5GUITLF8B__6J63j0XoYk,28316
20
- ccxt/bitget.py,sha256=KUdCRg0AsSlULBtga9pM2fiG4tTgCMLNygCf7YcHh4Q,218328
20
+ ccxt/bitget.py,sha256=SLS_VmntPvE2SosD6IZpEiSNp9u5vOikrnzy0gFh7a0,219439
21
21
  ccxt/bithumb.py,sha256=Lh5AswfAiOCi9kknUrusqDFtkkMCmh9XtRNMJSDYCno,42572
22
22
  ccxt/bitmart.py,sha256=lwziKtfmKuJu4a8fgZTjpMJ60F3TPH6dZ4hLM9SGm24,131482
23
23
  ccxt/bitmex.py,sha256=P-ZAWtim5FfYnj-9DImsuODrH-T796zC5dLHjMS-M4o,111059
@@ -39,7 +39,7 @@ ccxt/btcmarkets.py,sha256=f2xQs_QaB8lbnzxih-NWeJQZdV5FgyIHVtZ9myAJ1FY,48547
39
39
  ccxt/btctradeua.py,sha256=E5MqeOmjMP7Bu3dK53Nx78P8nAVCqjk8CVeKE0B2fQY,22177
40
40
  ccxt/btcturk.py,sha256=eswXO6eUpjc27vetGEaYepXeSWuLNHkWmnBSCzo4p5M,35384
41
41
  ccxt/buda.py,sha256=HdPsfWEZcr-l4c4Y0Gq1atqEi7BO_dbDgJmjxop_S2I,45591
42
- ccxt/bybit.py,sha256=BhcMlgMaQlEusoN4yFzVrKXp5i0-1DtnboQrvOQ-Ju0,398284
42
+ ccxt/bybit.py,sha256=O2UNk4GjIDhJq1bgQP_turlc-_rad2mwrWxWfDndrfU,398332
43
43
  ccxt/cex.py,sha256=JAxB-WpXoLfOBJ5K9_BIZH7zsKhDL72fa58mbWpkdCU,64922
44
44
  ccxt/coinbase.py,sha256=DuVwcb8OpxG1g-hrr3OfobnKSTodQhAXqlgxbYhvaHo,124582
45
45
  ccxt/coinbaseprime.py,sha256=Ygvljulxb2uKdei5yimCj1LMjLlUJNvP-G7ns1HpUFk,1219
@@ -52,7 +52,7 @@ ccxt/coinone.py,sha256=EzKvQavWepcMY2JN0PFyIXSp2l4JI3gXv5pC9jDfxJ4,35211
52
52
  ccxt/coinsph.py,sha256=pPWHBLBVVEem_Noeef9wGwFzLWxJuKkjKc35knhl3m4,81092
53
53
  ccxt/coinspot.py,sha256=668j3GUhdojJ6lAs07L_5OgarktfBxabnUFV23hyUBo,18778
54
54
  ccxt/cryptocom.py,sha256=cGxx4OsheInA536JVjYSx4wrkxGVb-R99igCM-2c_YY,108391
55
- ccxt/currencycom.py,sha256=s7inti_iLupMIbUCj8XZvlWUScS3_ASYN4FZZL911uc,79611
55
+ ccxt/currencycom.py,sha256=gaUHxyEOt1s--Iaiok0-uPvEaBBWmevyPn94TQaj0ik,82121
56
56
  ccxt/delta.py,sha256=TqlsYRUe4C3qTnkJ0TO5KydLuorNcGfjUs9YwHrmvwI,84060
57
57
  ccxt/deribit.py,sha256=bDKo6ed1rZPw_qK4dU1mQ5kL9rbhYNATC5ew1J9wvHQ,119018
58
58
  ccxt/digifinex.py,sha256=bRTuFwxbXBEUa2xYdXkeqP4Yo2f72732uDwLxQVa2b0,152160
@@ -94,7 +94,7 @@ ccxt/okex5.py,sha256=LKTogVF1svNkqW_-Cx0AuAopu6esgFf7ucbv7CaodUg,441
94
94
  ccxt/okx.py,sha256=F-VDDcCU4UNGQKoAOaliVYTRhKdSJnUMMNAhazRtsqs,275356
95
95
  ccxt/paymium.py,sha256=fUXMr3WvkKWS30XvVeGqqr4dLxsWsXhoE3G68SR76X0,23887
96
96
  ccxt/phemex.py,sha256=aZXknEY1tRKDfby1M4sJXw3tAJdnZ2DE_EByXSMHDIg,192823
97
- ccxt/poloniex.py,sha256=KC2trrqzObdIAJd0c9DH10UuMANrMZzhGldu408l1sc,90295
97
+ ccxt/poloniex.py,sha256=ckqTa_XqdE6s2eJKypt0U2XzeIV14DqIn1hvt6XCQ0M,93433
98
98
  ccxt/poloniexfutures.py,sha256=Ke821VIhCjDuNW3I5yZ3xqoj0y99bNI7glk5vX3XTWk,76598
99
99
  ccxt/probit.py,sha256=YQJ8dZTKHXKR6BPrOT6juMi-3GdLq9ZT3J4yHks3w2I,69774
100
100
  ccxt/ripio.py,sha256=B9wGD-eDe2fAmHlw-kCYOOqFqP0PHkaR1kt0EA_po3g,47325
@@ -107,7 +107,7 @@ ccxt/wavesexchange.py,sha256=dwM6jhubrIJ-fZ-9gPSZing28cdycU7V9HcqtyJncXA,103453
107
107
  ccxt/wazirx.py,sha256=1mn0HiR6H6vvMfChXc694uzgiapwCe7VdUd1XMJjaTw,35544
108
108
  ccxt/whitebit.py,sha256=Sdkp_ca2AI617PWZGIgoL8XIinqVjMtKRzrAdJB6Hdw,92221
109
109
  ccxt/woo.py,sha256=eZ7qi3ICLkh9Z3Bgng2otOgu2aozRNNFXXXyQyr_RKk,94738
110
- ccxt/xt.py,sha256=4_ZxxG54s533eCBXq8N_EyPTB7I4FLCamyviAKlhF1Y,196726
110
+ ccxt/xt.py,sha256=CVAGMxZ9jEnq57FWO0xjb2rEroTAf12muT1V_m2m1z0,196863
111
111
  ccxt/yobit.py,sha256=1b1Byz3OgIAGqxksulhbvJzbPVjvS_6Ut2vol7lYgFA,51572
112
112
  ccxt/zaif.py,sha256=3yB3ZYm73JWk9oVv5xg-RsqmuYsvie738QGD3hioEII,28777
113
113
  ccxt/zb.py,sha256=8fNNN13jKixNRGQWr9KFZbOvAVU7E__XIM92urdyA08,183857
@@ -152,7 +152,7 @@ ccxt/abstract/btcex.py,sha256=QsxRv_h-pGyIr9Vu1odeFqbIyj59MgOgNGc54f9BDr4,5594
152
152
  ccxt/abstract/btcmarkets.py,sha256=dQ2yTZ_8T2TEeAYIuKE0ATImbOLDLGSK7HbbBd8XVJQ,3690
153
153
  ccxt/abstract/btctradeua.py,sha256=n2EQMOpdzLNNZrnwZWnpMvnazzoY1vzmdUcLVE7fRho,1407
154
154
  ccxt/abstract/btcturk.py,sha256=081t4ZptWBV-W13Y449RbIC_7w-Y1Q7Ozyu9DWCMr0w,1403
155
- ccxt/abstract/bybit.py,sha256=zCSVGVFM26ajM0s7Ik0QhVrFPJ5h5auvKImPxbcqocc,72593
155
+ ccxt/abstract/bybit.py,sha256=698pLZ7FbXjWCxyCNxbKkzzcNAUVWVhkM4xtotqiBNg,72713
156
156
  ccxt/abstract/cex.py,sha256=Q0NJeDuJ4Kn_mtokYqBenhXWvLIiMSVTqbgbfcLGgv4,3311
157
157
  ccxt/abstract/coinbase.py,sha256=fWcoQs-uOWpvKCjiTjyI_AqdWYYX24M7xlV6q7PM6Ko,9017
158
158
  ccxt/abstract/coinbaseprime.py,sha256=lLp2coY-wJx7MT34jLsIOOSocQxLCi9uyvQ5xplylhw,6952
@@ -165,7 +165,7 @@ ccxt/abstract/coinone.py,sha256=fqsnaWgGzYXo-K1K3MJB4TNrfJzc6HB5VjV2h9CdJA8,2507
165
165
  ccxt/abstract/coinsph.py,sha256=Xa1JQch0WZ9r06s29ixk5L6H-KUOEy6j-A-28bkGNn8,3736
166
166
  ccxt/abstract/coinspot.py,sha256=DVsqMQGmEZYESzYvaGBmctP3W229yF1__Y5KzGiI5RA,2707
167
167
  ccxt/abstract/cryptocom.py,sha256=lQIIkhGRtS2mKvwJx74NrWzqcxifLpjtEEODILXZIM8,21126
168
- ccxt/abstract/currencycom.py,sha256=cqDY_Lx3zl04YiETD9UBSwb3yaxhxa8ay6TlXqZnbeY,7452
168
+ ccxt/abstract/currencycom.py,sha256=8T6Wn2n5KXpFv-nev5P314dMfndVemm7tBtI7qwFtqc,7563
169
169
  ccxt/abstract/delta.py,sha256=ZqdNynDelhjCCryRxWweTjRsv5iGwEksLzTSlvcHdrY,3128
170
170
  ccxt/abstract/deribit.py,sha256=rS_982u8dOVsh2vGSB5TO7K8Tye0Alq-Rg9fYZwz8hg,15499
171
171
  ccxt/abstract/digifinex.py,sha256=2tlP2G6Niu6TSbNUcgxvXdHfln6VhAZliXV7upFwpas,9386
@@ -220,7 +220,7 @@ ccxt/abstract/xt.py,sha256=xHHv2viFGK0_iPZ4gu6Wb0aOrpcKhr9zoY-BIPWh5bs,27028
220
220
  ccxt/abstract/yobit.py,sha256=8ycfCO8ORFly9hc0Aa47sZyX4_ZKPXS9h9yJzI-uQ7Q,1339
221
221
  ccxt/abstract/zaif.py,sha256=m15WHdl3gYy0GOXNZ8NEH8eE7sVh8c0T_ITNuU8vXeU,3935
222
222
  ccxt/abstract/zonda.py,sha256=VoxuPkSq8vAvKnDvOqnByhwsIf09m7yIrs8HejFrDk4,5482
223
- ccxt/async_support/__init__.py,sha256=8wkrzFpiEJ0xqUS_kLVHbgxzgciB4xxsAozeDoVSVkc,15324
223
+ ccxt/async_support/__init__.py,sha256=HNe_p8KfQxE7HfkSAVLePKMxQMDNFvMPB02uINqweS8,15324
224
224
  ccxt/async_support/ace.py,sha256=4RAmTYdlzO2yA9jnTopavGHBWZ9jDC7ceXMXxgiCrHY,41553
225
225
  ccxt/async_support/alpaca.py,sha256=0WxBRJDp4Rem6VKCzoVPZsgrPNFr4g5Iv7_P0RFxMkE,33307
226
226
  ccxt/async_support/ascendex.py,sha256=RptK6xnD1YOnQBkmn8uz07oWM4JGYpf7jwOeNR_Td8Y,129884
@@ -239,7 +239,7 @@ ccxt/async_support/bitfinex.py,sha256=IIxp_4AMC1XVRYzyT4eQnu5sJUofWbYRRK9rKVG_RF
239
239
  ccxt/async_support/bitfinex2.py,sha256=1_We9jzxhzBFqgmgQMZH8S7bkS6jRGmVInot0J-9bPA,111979
240
240
  ccxt/async_support/bitflyer.py,sha256=IECIxIf_MAgwmBW_Rp5FBfR-0VNoUQ3qoMraesz0D10,38049
241
241
  ccxt/async_support/bitforex.py,sha256=_ieZdAzDacQdiU6LhgcRnoUCWM4mgkn72d8OzdFwOq8,28522
242
- ccxt/async_support/bitget.py,sha256=jqUOVrCNFPZeI_rv7o2UKy1OrZNBnWQeNAjAokhmA8s,219202
242
+ ccxt/async_support/bitget.py,sha256=ZPzy7b2-CcEJXQjD5Kk3xFZCjNJktt9Ul7VTLcfp6ss,220313
243
243
  ccxt/async_support/bithumb.py,sha256=inJAIQM-k9IXnQr-F7Bv8CZpDmjd0maCen5KCaYUhP8,42790
244
244
  ccxt/async_support/bitmart.py,sha256=vI5_sbzqOJUiuiQvNm0e5Y-wQeAwtdzwImbHoTfHL1Q,132120
245
245
  ccxt/async_support/bitmex.py,sha256=G_U8U75wUuqSgQkI-op71zDp3p_P5XAoGV5jR_4Ehnk,111523
@@ -261,7 +261,7 @@ ccxt/async_support/btcmarkets.py,sha256=1gXbe_7wlN1KrXoBn-gNhxI7zU0bjjUoil9S2pUL
261
261
  ccxt/async_support/btctradeua.py,sha256=eow6iFtrYpOcmZnfcJofXunr_j6pw2_2sA6EYLP8Z6E,22323
262
262
  ccxt/async_support/btcturk.py,sha256=DRjq5bcvySq31PXl6qvcaZh45Mdh6pC2P_xBDv4JDjI,35602
263
263
  ccxt/async_support/buda.py,sha256=52OEMVpDkitF15CWUh0CG5uM-sE30f8G9xAkOhrcqtU,45959
264
- ccxt/async_support/bybit.py,sha256=koTHakaplXXWSzcs7DRHX3Ds8809DJMzPhMvGIR0cac,400172
264
+ ccxt/async_support/bybit.py,sha256=Bt8WwxwQkptQ7sNTWmamf-AR5GtIkg5MRBCyrWT6-3Q,400220
265
265
  ccxt/async_support/cex.py,sha256=3uqC1Y5VDaeoHzrV3E5hqN4EYkgoUAM-7gB07EPqRh4,65248
266
266
  ccxt/async_support/coinbase.py,sha256=F0PRBSRRlHWI_b7LFyeHj-d4PjqBiEHDsAHhpSSWELI,125226
267
267
  ccxt/async_support/coinbaseprime.py,sha256=M5Ez1DsFcW3-vJ-4QoZzwYBAKjAAtJnJpkfnV4sWAIc,1233
@@ -274,7 +274,7 @@ ccxt/async_support/coinone.py,sha256=tLccRfLYCVH-5JPQuLrybGpo3y8VZwUd3p1DIYleTGM
274
274
  ccxt/async_support/coinsph.py,sha256=PmgKdeINKbx4wZX6Jds0ytpzFR6f21Dyt_wn2L1rWwU,81496
275
275
  ccxt/async_support/coinspot.py,sha256=uRLvUXCE3T-f95Yq5TDym5dsNffoYwUgvpkpxjNvZuY,18912
276
276
  ccxt/async_support/cryptocom.py,sha256=1pN4CffmkxR5c_R3kr62OMi6n8O2sf8FUzRzyUjC1ig,108923
277
- ccxt/async_support/currencycom.py,sha256=dguSKYDllaYdA7YATVs5iKEoWkFx6nrGWKQsRxlORPc,80003
277
+ ccxt/async_support/currencycom.py,sha256=8sQXiOBFFlfgSClvMgOSVqqY4fz02pEOPBJNbw3Uu5g,82531
278
278
  ccxt/async_support/delta.py,sha256=bKS5bHU7O_KjVBb95wT0IrjJVmcCLSgTBaqXSYwHUsI,84440
279
279
  ccxt/async_support/deribit.py,sha256=-dfdPCsHDaqRlwpRwlTJCBXDLCi_x2VwhoaeNuhUvwU,119560
280
280
  ccxt/async_support/digifinex.py,sha256=0vFc7Mciel7ArhLPuUUKXmYNKpQC9tvNo3zfLP6kUGI,152866
@@ -316,7 +316,7 @@ ccxt/async_support/okex5.py,sha256=tq41tKx06j3DDO9pu9iKInpjayVprbobVNTK8qb7hoM,4
316
316
  ccxt/async_support/okx.py,sha256=bFmhZv3WJj1TTS1_fFrtXVUvlbBVZ3KilUjjCfcpBY8,276404
317
317
  ccxt/async_support/paymium.py,sha256=5SeLSMGgLVWu3TDEbxrc2VT2tAdXfIm90EuZ3Rtsn_Q,24075
318
318
  ccxt/async_support/phemex.py,sha256=eMnk8yVrCG2A1ENmPJn5El-sLggZ_ojwPtvODCOhMbA,193419
319
- ccxt/async_support/poloniex.py,sha256=0SQ8_B4lYyauxemO_svPiZtMSGBJgsXrxxRSBf8o4nE,90795
319
+ ccxt/async_support/poloniex.py,sha256=nIJq6V5lUTnX7J68c3RCZnQLQwJsiHMs4hcirqJFQ_U,93933
320
320
  ccxt/async_support/poloniexfutures.py,sha256=f_bS3FlG4J3E4xWAih4PmnR3NkA2EwZUtAZ6emVQhcE,76966
321
321
  ccxt/async_support/probit.py,sha256=kwcV6dWPUXtOOQpMbtwYbIRKw8lTgOnG5zCqQRV-1Rg,70124
322
322
  ccxt/async_support/ripio.py,sha256=ZXAx-Uj7_Nx0e9V_zSoPpoYSbBh2PHmbI5T2eS3Ao8s,47585
@@ -329,13 +329,13 @@ ccxt/async_support/wavesexchange.py,sha256=nBOvf9kQrhFicrTUFvxd9sKXrDCXw8TpcN2sp
329
329
  ccxt/async_support/wazirx.py,sha256=HptI1mDn_frZHOnYTA2gHR0XUGoQvds7GesB0gHMmNc,35792
330
330
  ccxt/async_support/whitebit.py,sha256=9iRwYMhVanLtXOv7InS_ldF5wGGmgV_XU3u72-i1ovI,92673
331
331
  ccxt/async_support/woo.py,sha256=3yuwzH5ZD6kx9OB4MSp-gikqqGi3-hjnCEyLCGHUPzc,95322
332
- ccxt/async_support/xt.py,sha256=yIIBiId9OAEXpnlThaOnA8VWF4-VCqqeNeeGImhBFZE,197845
332
+ ccxt/async_support/xt.py,sha256=MsCwFZAcw82HCDMxKJatXZQqusvPmzMvxfaPT4P2vbY,197982
333
333
  ccxt/async_support/yobit.py,sha256=Eejlh__5PsoOhxhqazA_KQpIHTCiLusSeftWB82eQHk,51856
334
334
  ccxt/async_support/zaif.py,sha256=Tye_zrffs7Ua22_o7fp68C3Ti1qdJ3H26dbz6j1bVRc,28959
335
335
  ccxt/async_support/zb.py,sha256=W8HHyssjCLTugSRs80TnAwGJl85vp7nyNPOn9RLpXFk,184533
336
336
  ccxt/async_support/zonda.py,sha256=0ABz8ApeophACxwTL4hxonco2Yc6uTF5torKmDLQSN0,74326
337
337
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
338
- ccxt/async_support/base/exchange.py,sha256=AZw9ZIJu8_Kru5HstglOtRtYUBAv6jF0oCQDr3nGWC8,131711
338
+ ccxt/async_support/base/exchange.py,sha256=aLm2xP7iLWkAVDT8EIM7bgMW6D76ciaeajqHcTDNuas,130943
339
339
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
340
340
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
341
341
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=xmlZV30Vb9Kq7JCm3D5FuEmuj1zp5H4F4hrz8-Y-Ir4,4999
@@ -349,10 +349,10 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=GH-475Ni0mLOx7mUDnz4jjzaGkh
349
349
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
350
350
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
351
351
  ccxt/base/errors.py,sha256=-LVeTNyXvu3QEgb-p-KzMpcBgzHlvFTwDzmZK7Gfc14,3401
352
- ccxt/base/exchange.py,sha256=-OzywVwntQlVVev4csEJ-zDdGvXM3Cv1Km06D8rUUAU,171189
352
+ ccxt/base/exchange.py,sha256=W-pQNQ1Hi9jSUnqoRoXFeeapNd6QSjLiFMeN8t8qGsU,170445
353
353
  ccxt/base/precise.py,sha256=_xfu54sV0vWNnOfGTKRFykeuWP8mn4K1m9lk1tcllX4,8565
354
354
  ccxt/base/types.py,sha256=8FseQkf_LL-nXdb5LyT6RpDaU8pr3HAI9Jb9Wj_oDN0,1366
355
- ccxt/pro/__init__.py,sha256=ypwFviA_7wxK7LC0WgyPAYpDRVIuz8AuJ-2qaNVYuUo,6463
355
+ ccxt/pro/__init__.py,sha256=gDxp-KHoBj3EmZITMMI3XXP3JpXqAQYf0WU0ir7we44,6463
356
356
  ccxt/pro/alpaca.py,sha256=CmaU0MJq0HiNaYvBHeDJfTa-letDiEQonRON7Q_3W_k,26686
357
357
  ccxt/pro/ascendex.py,sha256=k6rpuiPhj3ipeWRG5vwR22SS4iAzQPe1q1WxJaaucLk,34565
358
358
  ccxt/pro/bequant.py,sha256=qz8JjnpkAQY_CFiFSKGqrjjgZ2167_TBKjSJOb9NeDw,1081
@@ -462,7 +462,7 @@ ccxt/test/base/test_ticker.py,sha256=h9AV_O6s-Ax3vB3sFoN0Mz22rMOi65i9BDv0SNejH98
462
462
  ccxt/test/base/test_trade.py,sha256=bL9o3S_TGW8Nnlxu-BYkRG8NyRzKAWrU66uO5jJCM3A,2259
463
463
  ccxt/test/base/test_trading_fee.py,sha256=yRCpLHLg_ca9JQXdZB3_pIMHgHLGEfeQF95E6d1e2Bc,1125
464
464
  ccxt/test/base/test_transaction.py,sha256=BTbB4UHHXkrvYgwbrhh867nVRlevmIkIrz1W_odlQJI,1434
465
- ccxt-3.1.23.dist-info/METADATA,sha256=5lkvgZcFYSVTTxIrTzWaSduLwhEuzF8aYIsQ0KNv0G8,110521
466
- ccxt-3.1.23.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110
467
- ccxt-3.1.23.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
468
- ccxt-3.1.23.dist-info/RECORD,,
465
+ ccxt-3.1.24.dist-info/METADATA,sha256=VAOHHLVsEL1dghJ2ugcvUGFtew8sa66sDawznIsYoWA,110521
466
+ ccxt-3.1.24.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110
467
+ ccxt-3.1.24.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
468
+ ccxt-3.1.24.dist-info/RECORD,,
File without changes