ccxt 4.4.48__py2.py3-none-any.whl → 4.4.50__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/binance.py +1 -0
- ccxt/abstract/binancecoinm.py +1 -0
- ccxt/abstract/binanceus.py +1 -0
- ccxt/abstract/binanceusdm.py +1 -0
- ccxt/alpaca.py +62 -1
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/alpaca.py +62 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/binance.py +8 -4
- ccxt/async_support/bingx.py +73 -29
- ccxt/async_support/bitget.py +12 -10
- ccxt/async_support/blofin.py +1 -1
- ccxt/async_support/coinex.py +3 -3
- ccxt/async_support/coinsph.py +17 -8
- ccxt/async_support/deribit.py +82 -0
- ccxt/async_support/digifinex.py +125 -10
- ccxt/async_support/ellipx.py +61 -0
- ccxt/async_support/exmo.py +58 -0
- ccxt/async_support/hitbtc.py +99 -0
- ccxt/async_support/hollaex.py +85 -16
- ccxt/async_support/huobijp.py +73 -0
- ccxt/async_support/hyperliquid.py +22 -1
- ccxt/async_support/idex.py +71 -0
- ccxt/async_support/independentreserve.py +64 -0
- ccxt/async_support/indodax.py +61 -0
- ccxt/async_support/kucoin.py +47 -67
- ccxt/async_support/kuna.py +60 -1
- ccxt/async_support/latoken.py +64 -0
- ccxt/async_support/lbank.py +70 -0
- ccxt/async_support/luno.py +73 -0
- ccxt/async_support/lykke.py +64 -0
- ccxt/async_support/mercado.py +65 -0
- ccxt/async_support/mexc.py +4 -3
- ccxt/async_support/myokx.py +10 -0
- ccxt/async_support/ndax.py +71 -0
- ccxt/async_support/novadax.py +74 -0
- ccxt/async_support/oceanex.py +69 -0
- ccxt/async_support/okcoin.py +92 -7
- ccxt/async_support/onetrading.py +66 -0
- ccxt/async_support/oxfun.py +66 -0
- ccxt/async_support/p2b.py +63 -1
- ccxt/async_support/paradex.py +68 -0
- ccxt/async_support/paymium.py +42 -0
- ccxt/async_support/probit.py +68 -1
- ccxt/async_support/timex.py +67 -0
- ccxt/async_support/tokocrypto.py +81 -4
- ccxt/async_support/tradeogre.py +58 -1
- ccxt/async_support/whitebit.py +10 -4
- ccxt/base/exchange.py +62 -1
- ccxt/binance.py +8 -4
- ccxt/bingx.py +73 -29
- ccxt/bitget.py +12 -10
- ccxt/blofin.py +1 -1
- ccxt/coinex.py +3 -3
- ccxt/coinsph.py +17 -8
- ccxt/deribit.py +82 -0
- ccxt/digifinex.py +125 -10
- ccxt/ellipx.py +61 -0
- ccxt/exmo.py +58 -0
- ccxt/hitbtc.py +99 -0
- ccxt/hollaex.py +85 -16
- ccxt/huobijp.py +73 -0
- ccxt/hyperliquid.py +22 -1
- ccxt/idex.py +71 -0
- ccxt/independentreserve.py +64 -0
- ccxt/indodax.py +61 -0
- ccxt/kucoin.py +47 -67
- ccxt/kuna.py +60 -1
- ccxt/latoken.py +64 -0
- ccxt/lbank.py +70 -0
- ccxt/luno.py +73 -0
- ccxt/lykke.py +64 -0
- ccxt/mercado.py +65 -0
- ccxt/mexc.py +4 -3
- ccxt/myokx.py +10 -0
- ccxt/ndax.py +71 -0
- ccxt/novadax.py +74 -0
- ccxt/oceanex.py +69 -0
- ccxt/okcoin.py +92 -7
- ccxt/onetrading.py +66 -0
- ccxt/oxfun.py +66 -0
- ccxt/p2b.py +63 -1
- ccxt/paradex.py +68 -0
- ccxt/paymium.py +42 -0
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/bitmart.py +5 -0
- ccxt/probit.py +68 -1
- ccxt/timex.py +67 -0
- ccxt/tokocrypto.py +81 -4
- ccxt/tradeogre.py +58 -1
- ccxt/whitebit.py +10 -4
- {ccxt-4.4.48.dist-info → ccxt-4.4.50.dist-info}/METADATA +4 -4
- {ccxt-4.4.48.dist-info → ccxt-4.4.50.dist-info}/RECORD +97 -97
- {ccxt-4.4.48.dist-info → ccxt-4.4.50.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.4.48.dist-info → ccxt-4.4.50.dist-info}/WHEEL +0 -0
- {ccxt-4.4.48.dist-info → ccxt-4.4.50.dist-info}/top_level.txt +0 -0
ccxt/async_support/huobijp.py
CHANGED
@@ -265,6 +265,79 @@ class huobijp(Exchange, ImplicitAPI):
|
|
265
265
|
'taker': self.parse_number('0.002'),
|
266
266
|
},
|
267
267
|
},
|
268
|
+
'features': {
|
269
|
+
'spot': {
|
270
|
+
'sandbox': False,
|
271
|
+
'createOrder': {
|
272
|
+
'marginMode': False,
|
273
|
+
'triggerPrice': True, # todo: implement
|
274
|
+
'triggerPriceType': None,
|
275
|
+
'triggerDirection': False,
|
276
|
+
'stopLossPrice': False, # todo
|
277
|
+
'takeProfitPrice': False, # todo
|
278
|
+
'attachedStopLossTakeProfit': None,
|
279
|
+
'timeInForce': {
|
280
|
+
'IOC': False,
|
281
|
+
'FOK': False,
|
282
|
+
'PO': False,
|
283
|
+
'GTD': False,
|
284
|
+
},
|
285
|
+
'hedged': False,
|
286
|
+
'selfTradePrevention': False,
|
287
|
+
'trailing': False,
|
288
|
+
'leverage': False,
|
289
|
+
'marketBuyByCost': True,
|
290
|
+
'marketBuyRequiresPrice': False,
|
291
|
+
'iceberg': False,
|
292
|
+
},
|
293
|
+
'createOrders': None,
|
294
|
+
'fetchMyTrades': {
|
295
|
+
'marginMode': False,
|
296
|
+
'limit': 100,
|
297
|
+
'daysBack': 120,
|
298
|
+
'untilDays': 2,
|
299
|
+
},
|
300
|
+
'fetchOrder': {
|
301
|
+
'marginMode': False,
|
302
|
+
'trigger': False,
|
303
|
+
'trailing': False,
|
304
|
+
},
|
305
|
+
'fetchOpenOrders': {
|
306
|
+
'marginMode': False,
|
307
|
+
'limit': None, # todo
|
308
|
+
'trigger': False,
|
309
|
+
'trailing': False,
|
310
|
+
},
|
311
|
+
'fetchOrders': {
|
312
|
+
'marginMode': False,
|
313
|
+
'limit': None,
|
314
|
+
'daysBack': None, # todo
|
315
|
+
'untilDays': None, # todo
|
316
|
+
'trigger': False,
|
317
|
+
'trailing': False,
|
318
|
+
},
|
319
|
+
'fetchClosedOrders': {
|
320
|
+
'marginMode': False,
|
321
|
+
'limit': None,
|
322
|
+
'daysBack': None, # todo
|
323
|
+
'daysBackCanceled': None, # todo
|
324
|
+
'untilDays': None, # todo
|
325
|
+
'trigger': False,
|
326
|
+
'trailing': False,
|
327
|
+
},
|
328
|
+
'fetchOHLCV': {
|
329
|
+
'limit': 2000,
|
330
|
+
},
|
331
|
+
},
|
332
|
+
'swap': {
|
333
|
+
'linear': None,
|
334
|
+
'inverse': None,
|
335
|
+
},
|
336
|
+
'future': {
|
337
|
+
'linear': None,
|
338
|
+
'inverse': None,
|
339
|
+
},
|
340
|
+
},
|
268
341
|
'precisionMode': TICK_SIZE,
|
269
342
|
'exceptions': {
|
270
343
|
'broad': {
|
@@ -216,6 +216,8 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
216
216
|
'Order price cannot be more than 80% away from the reference price': InvalidOrder,
|
217
217
|
'Order has zero size.': InvalidOrder,
|
218
218
|
'Insufficient spot balance asset': InsufficientFunds,
|
219
|
+
'Insufficient balance for withdrawal': InsufficientFunds,
|
220
|
+
'Insufficient balance for token transfer': InsufficientFunds,
|
219
221
|
},
|
220
222
|
},
|
221
223
|
'precisionMode': TICK_SIZE,
|
@@ -2756,7 +2758,26 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
2756
2758
|
'signature': sig,
|
2757
2759
|
}
|
2758
2760
|
response = await self.privatePostExchange(request)
|
2759
|
-
|
2761
|
+
#
|
2762
|
+
# {'response': {'type': 'default'}, 'status': 'ok'}
|
2763
|
+
#
|
2764
|
+
return self.parse_transfer(response)
|
2765
|
+
|
2766
|
+
def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
|
2767
|
+
#
|
2768
|
+
# {'response': {'type': 'default'}, 'status': 'ok'}
|
2769
|
+
#
|
2770
|
+
return {
|
2771
|
+
'info': transfer,
|
2772
|
+
'id': None,
|
2773
|
+
'timestamp': None,
|
2774
|
+
'datetime': None,
|
2775
|
+
'currency': None,
|
2776
|
+
'amount': None,
|
2777
|
+
'fromAccount': None,
|
2778
|
+
'toAccount': None,
|
2779
|
+
'status': 'ok',
|
2780
|
+
}
|
2760
2781
|
|
2761
2782
|
async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
|
2762
2783
|
"""
|
ccxt/async_support/idex.py
CHANGED
@@ -176,6 +176,77 @@ class idex(Exchange, ImplicitAPI):
|
|
176
176
|
'defaultSelfTradePrevention': 'cn',
|
177
177
|
'network': 'MATIC',
|
178
178
|
},
|
179
|
+
'features': {
|
180
|
+
'spot': {
|
181
|
+
'sandbox': False,
|
182
|
+
'createOrder': {
|
183
|
+
'marginMode': False,
|
184
|
+
'triggerPrice': True,
|
185
|
+
# todo: revise
|
186
|
+
'triggerPriceType': {
|
187
|
+
'last': True,
|
188
|
+
'mark': True,
|
189
|
+
'index': True,
|
190
|
+
},
|
191
|
+
'triggerDirection': False,
|
192
|
+
'stopLossPrice': False, # todo
|
193
|
+
'takeProfitPrice': False, # todo
|
194
|
+
'attachedStopLossTakeProfit': None,
|
195
|
+
'timeInForce': {
|
196
|
+
'IOC': True,
|
197
|
+
'FOK': True,
|
198
|
+
'PO': True,
|
199
|
+
'GTD': False,
|
200
|
+
},
|
201
|
+
'hedged': False,
|
202
|
+
'selfTradePrevention': True, # todo implementation
|
203
|
+
'trailing': False,
|
204
|
+
'leverage': False,
|
205
|
+
'marketBuyByCost': False,
|
206
|
+
'marketBuyRequiresPrice': False,
|
207
|
+
'iceberg': False,
|
208
|
+
},
|
209
|
+
'createOrders': None,
|
210
|
+
'fetchMyTrades': {
|
211
|
+
'marginMode': False,
|
212
|
+
'limit': 1000,
|
213
|
+
'daysBack': 100000, # todo
|
214
|
+
'untilDays': 100000, # todo
|
215
|
+
},
|
216
|
+
'fetchOrder': {
|
217
|
+
'marginMode': False,
|
218
|
+
'trigger': False,
|
219
|
+
'trailing': False,
|
220
|
+
},
|
221
|
+
'fetchOpenOrders': {
|
222
|
+
'marginMode': False,
|
223
|
+
'limit': 1000,
|
224
|
+
'trigger': False,
|
225
|
+
'trailing': False,
|
226
|
+
},
|
227
|
+
'fetchOrders': None,
|
228
|
+
'fetchClosedOrders': {
|
229
|
+
'marginMode': False,
|
230
|
+
'limit': 1000,
|
231
|
+
'daysBack': 1000000, # todo
|
232
|
+
'daysBackCanceled': 1, # todo
|
233
|
+
'untilDays': 1000000, # todo
|
234
|
+
'trigger': False,
|
235
|
+
'trailing': False,
|
236
|
+
},
|
237
|
+
'fetchOHLCV': {
|
238
|
+
'limit': 1000,
|
239
|
+
},
|
240
|
+
},
|
241
|
+
'swap': {
|
242
|
+
'linear': None,
|
243
|
+
'inverse': None,
|
244
|
+
},
|
245
|
+
'future': {
|
246
|
+
'linear': None,
|
247
|
+
'inverse': None,
|
248
|
+
},
|
249
|
+
},
|
179
250
|
'exceptions': {
|
180
251
|
'exact': {
|
181
252
|
'INVALID_ORDER_QUANTITY': InvalidOrder,
|
@@ -149,6 +149,70 @@ class independentreserve(Exchange, ImplicitAPI):
|
|
149
149
|
'tierBased': False,
|
150
150
|
},
|
151
151
|
},
|
152
|
+
'features': {
|
153
|
+
'spot': {
|
154
|
+
'sandbox': False,
|
155
|
+
'createOrder': {
|
156
|
+
'marginMode': False,
|
157
|
+
'triggerPrice': False,
|
158
|
+
'triggerPriceType': None,
|
159
|
+
'triggerDirection': False,
|
160
|
+
'stopLossPrice': False,
|
161
|
+
'takeProfitPrice': False,
|
162
|
+
'attachedStopLossTakeProfit': None,
|
163
|
+
'timeInForce': {
|
164
|
+
'IOC': False,
|
165
|
+
'FOK': False,
|
166
|
+
'PO': False,
|
167
|
+
'GTD': False,
|
168
|
+
},
|
169
|
+
'hedged': False,
|
170
|
+
'selfTradePrevention': False,
|
171
|
+
'trailing': False,
|
172
|
+
'leverage': False,
|
173
|
+
'marketBuyByCost': False,
|
174
|
+
'marketBuyRequiresPrice': False,
|
175
|
+
'iceberg': False,
|
176
|
+
},
|
177
|
+
'createOrders': None,
|
178
|
+
'fetchMyTrades': {
|
179
|
+
'marginMode': False,
|
180
|
+
'limit': 100, # todo
|
181
|
+
'daysBack': None,
|
182
|
+
'untilDays': None,
|
183
|
+
},
|
184
|
+
'fetchOrder': {
|
185
|
+
'marginMode': False,
|
186
|
+
'trigger': False,
|
187
|
+
'trailing': False,
|
188
|
+
},
|
189
|
+
'fetchOpenOrders': {
|
190
|
+
'marginMode': False,
|
191
|
+
'limit': 100, # todo
|
192
|
+
'trigger': False,
|
193
|
+
'trailing': False,
|
194
|
+
},
|
195
|
+
'fetchOrders': None,
|
196
|
+
'fetchClosedOrders': {
|
197
|
+
'marginMode': False,
|
198
|
+
'limit': 100, # todo
|
199
|
+
'daysBack': None,
|
200
|
+
'daysBackCanceled': None,
|
201
|
+
'untilDays': None,
|
202
|
+
'trigger': False,
|
203
|
+
'trailing': False,
|
204
|
+
},
|
205
|
+
'fetchOHLCV': None,
|
206
|
+
},
|
207
|
+
'swap': {
|
208
|
+
'linear': None,
|
209
|
+
'inverse': None,
|
210
|
+
},
|
211
|
+
'future': {
|
212
|
+
'linear': None,
|
213
|
+
'inverse': None,
|
214
|
+
},
|
215
|
+
},
|
152
216
|
'commonCurrencies': {
|
153
217
|
'PLA': 'PlayChip',
|
154
218
|
},
|
ccxt/async_support/indodax.py
CHANGED
@@ -204,6 +204,67 @@ class indodax(Exchange, ImplicitAPI):
|
|
204
204
|
'1w': '1W',
|
205
205
|
},
|
206
206
|
},
|
207
|
+
'features': {
|
208
|
+
'spot': {
|
209
|
+
'sandbox': False,
|
210
|
+
'createOrder': {
|
211
|
+
'marginMode': False,
|
212
|
+
'triggerPrice': False,
|
213
|
+
'triggerPriceType': None,
|
214
|
+
'triggerDirection': False,
|
215
|
+
'stopLossPrice': False,
|
216
|
+
'takeProfitPrice': False,
|
217
|
+
'attachedStopLossTakeProfit': None,
|
218
|
+
'timeInForce': {
|
219
|
+
'IOC': True, # todo implementation
|
220
|
+
'FOK': False,
|
221
|
+
'PO': False,
|
222
|
+
'GTD': False,
|
223
|
+
},
|
224
|
+
'hedged': False,
|
225
|
+
'selfTradePrevention': False,
|
226
|
+
'trailing': False,
|
227
|
+
'leverage': False,
|
228
|
+
'marketBuyByCost': False,
|
229
|
+
'marketBuyRequiresPrice': False,
|
230
|
+
'iceberg': False,
|
231
|
+
},
|
232
|
+
'createOrders': None,
|
233
|
+
'fetchMyTrades': None, # todo implement
|
234
|
+
'fetchOrder': {
|
235
|
+
'marginMode': False,
|
236
|
+
'trigger': False,
|
237
|
+
'trailing': False,
|
238
|
+
},
|
239
|
+
'fetchOpenOrders': {
|
240
|
+
'marginMode': False,
|
241
|
+
'limit': None,
|
242
|
+
'trigger': False,
|
243
|
+
'trailing': False,
|
244
|
+
},
|
245
|
+
'fetchOrders': None,
|
246
|
+
'fetchClosedOrders': {
|
247
|
+
'marginMode': False,
|
248
|
+
'limit': 1000,
|
249
|
+
'daysBack': 100000, # todo
|
250
|
+
'daysBackCanceled': 1,
|
251
|
+
'untilDays': None,
|
252
|
+
'trigger': False,
|
253
|
+
'trailing': False,
|
254
|
+
},
|
255
|
+
'fetchOHLCV': {
|
256
|
+
'limit': 2000, # todo: not in request
|
257
|
+
},
|
258
|
+
},
|
259
|
+
'swap': {
|
260
|
+
'linear': None,
|
261
|
+
'inverse': None,
|
262
|
+
},
|
263
|
+
'future': {
|
264
|
+
'linear': None,
|
265
|
+
'inverse': None,
|
266
|
+
},
|
267
|
+
},
|
207
268
|
'commonCurrencies': {
|
208
269
|
'STR': 'XLM',
|
209
270
|
'BCHABC': 'BCH',
|
ccxt/async_support/kucoin.py
CHANGED
@@ -1352,8 +1352,7 @@ class kucoin(Exchange, ImplicitAPI):
|
|
1352
1352
|
:param dict params: extra parameters specific to the exchange API endpoint
|
1353
1353
|
:returns dict: an associative dictionary of currencies
|
1354
1354
|
"""
|
1355
|
-
|
1356
|
-
promises.append(self.publicGetCurrencies(params))
|
1355
|
+
response = await self.publicGetCurrencies(params)
|
1357
1356
|
#
|
1358
1357
|
# {
|
1359
1358
|
# "code":"200000",
|
@@ -1379,87 +1378,39 @@ class kucoin(Exchange, ImplicitAPI):
|
|
1379
1378
|
# "isDepositEnabled":false,
|
1380
1379
|
# "confirms":12,
|
1381
1380
|
# "preConfirms":12,
|
1381
|
+
# "withdrawPrecision": 8,
|
1382
|
+
# "maxWithdraw": null,
|
1383
|
+
# "maxDeposit": null,
|
1384
|
+
# "needTag": False,
|
1382
1385
|
# "contractAddress":"0xa6446d655a0c34bc4f05042ee88170d056cbaf45",
|
1383
1386
|
# "depositFeeRate": "0.001", # present for some currencies/networks
|
1384
1387
|
# }
|
1385
1388
|
# ]
|
1386
1389
|
# },
|
1387
|
-
# }
|
1388
|
-
#
|
1389
|
-
promises.append(self.fetch_web_endpoint('fetchCurrencies', 'webExchangeGetCurrencyCurrencyChainInfo', True))
|
1390
|
-
#
|
1391
|
-
# {
|
1392
|
-
# "success": True,
|
1393
|
-
# "code": "200",
|
1394
|
-
# "msg": "success",
|
1395
|
-
# "retry": False,
|
1396
|
-
# "data": [
|
1397
|
-
# {
|
1398
|
-
# "status": "enabled",
|
1399
|
-
# "currency": "BTC",
|
1400
|
-
# "isChainEnabled": "true",
|
1401
|
-
# "chain": "btc",
|
1402
|
-
# "chainName": "BTC",
|
1403
|
-
# "chainFullName": "Bitcoin",
|
1404
|
-
# "walletPrecision": "8",
|
1405
|
-
# "isDepositEnabled": "true",
|
1406
|
-
# "depositMinSize": "0.00005",
|
1407
|
-
# "confirmationCount": "2",
|
1408
|
-
# "isWithdrawEnabled": "true",
|
1409
|
-
# "withdrawMinSize": "0.001",
|
1410
|
-
# "withdrawMinFee": "0.0005",
|
1411
|
-
# "withdrawFeeRate": "0",
|
1412
|
-
# "depositDisabledTip": "Wallet Maintenance",
|
1413
|
-
# "preDepositTipEnabled": "true",
|
1414
|
-
# "preDepositTip": "Do not transfer from ETH network directly",
|
1415
|
-
# "withdrawDisabledTip": "",
|
1416
|
-
# "preWithdrawTipEnabled": "false",
|
1417
|
-
# "preWithdrawTip": "",
|
1418
|
-
# "orgAddress": "",
|
1419
|
-
# "userAddressName": "Memo",
|
1420
|
-
# },
|
1421
1390
|
# ]
|
1422
1391
|
# }
|
1423
1392
|
#
|
1424
|
-
|
1425
|
-
currenciesResponse = self.safe_dict(responses, 0, {})
|
1426
|
-
currenciesData = self.safe_list(currenciesResponse, 'data', [])
|
1427
|
-
additionalResponse = self.safe_dict(responses, 1, {})
|
1428
|
-
additionalData = self.safe_list(additionalResponse, 'data', [])
|
1429
|
-
additionalDataGrouped = self.group_by(additionalData, 'currency')
|
1393
|
+
currenciesData = self.safe_list(response, 'data', [])
|
1430
1394
|
result: dict = {}
|
1431
1395
|
for i in range(0, len(currenciesData)):
|
1432
1396
|
entry = currenciesData[i]
|
1433
1397
|
id = self.safe_string(entry, 'currency')
|
1434
1398
|
name = self.safe_string(entry, 'fullName')
|
1435
1399
|
code = self.safe_currency_code(id)
|
1436
|
-
isWithdrawEnabled = None
|
1437
|
-
isDepositEnabled = None
|
1438
1400
|
networks: dict = {}
|
1439
1401
|
chains = self.safe_list(entry, 'chains', [])
|
1440
|
-
extraChainsData = self.index_by(self.safe_list(additionalDataGrouped, id, []), 'chain')
|
1441
1402
|
rawPrecision = self.safe_string(entry, 'precision')
|
1442
1403
|
precision = self.parse_number(self.parse_precision(rawPrecision))
|
1443
1404
|
chainsLength = len(chains)
|
1444
1405
|
if not chainsLength:
|
1445
|
-
# https://t.me/KuCoin_API/173118
|
1446
|
-
|
1447
|
-
isDepositEnabled = False
|
1406
|
+
# one buggy coin, which doesn't contain info https://t.me/KuCoin_API/173118
|
1407
|
+
continue
|
1448
1408
|
for j in range(0, chainsLength):
|
1449
1409
|
chain = chains[j]
|
1450
1410
|
chainId = self.safe_string(chain, 'chainId')
|
1451
1411
|
networkCode = self.network_id_to_code(chainId, code)
|
1452
1412
|
chainWithdrawEnabled = self.safe_bool(chain, 'isWithdrawEnabled', False)
|
1453
|
-
if isWithdrawEnabled is None:
|
1454
|
-
isWithdrawEnabled = chainWithdrawEnabled
|
1455
|
-
else:
|
1456
|
-
isWithdrawEnabled = isWithdrawEnabled or chainWithdrawEnabled
|
1457
1413
|
chainDepositEnabled = self.safe_bool(chain, 'isDepositEnabled', False)
|
1458
|
-
if isDepositEnabled is None:
|
1459
|
-
isDepositEnabled = chainDepositEnabled
|
1460
|
-
else:
|
1461
|
-
isDepositEnabled = isDepositEnabled or chainDepositEnabled
|
1462
|
-
chainExtraData = self.safe_dict(extraChainsData, chainId, {})
|
1463
1414
|
networks[networkCode] = {
|
1464
1415
|
'info': chain,
|
1465
1416
|
'id': chainId,
|
@@ -1469,34 +1420,34 @@ class kucoin(Exchange, ImplicitAPI):
|
|
1469
1420
|
'fee': self.safe_number(chain, 'withdrawalMinFee'),
|
1470
1421
|
'deposit': chainDepositEnabled,
|
1471
1422
|
'withdraw': chainWithdrawEnabled,
|
1472
|
-
'precision': self.parse_number(self.parse_precision(self.safe_string(
|
1423
|
+
'precision': self.parse_number(self.parse_precision(self.safe_string(chain, 'withdrawPrecision'))),
|
1473
1424
|
'limits': {
|
1474
1425
|
'withdraw': {
|
1475
1426
|
'min': self.safe_number(chain, 'withdrawalMinSize'),
|
1476
|
-
'max':
|
1427
|
+
'max': self.safe_number(chain, 'maxWithdraw'),
|
1477
1428
|
},
|
1478
1429
|
'deposit': {
|
1479
1430
|
'min': self.safe_number(chain, 'depositMinSize'),
|
1480
|
-
'max':
|
1431
|
+
'max': self.safe_number(chain, 'maxDeposit'),
|
1481
1432
|
},
|
1482
1433
|
},
|
1483
1434
|
}
|
1484
1435
|
# kucoin has determined 'fiat' currencies with below logic
|
1485
1436
|
isFiat = (rawPrecision == '2') and (chainsLength == 0)
|
1486
|
-
result[code] = {
|
1437
|
+
result[code] = self.safe_currency_structure({
|
1487
1438
|
'id': id,
|
1488
1439
|
'name': name,
|
1489
1440
|
'code': code,
|
1490
1441
|
'type': 'fiat' if isFiat else 'crypto',
|
1491
1442
|
'precision': precision,
|
1492
1443
|
'info': entry,
|
1493
|
-
'active': (isDepositEnabled or isWithdrawEnabled),
|
1494
|
-
'deposit': isDepositEnabled,
|
1495
|
-
'withdraw': isWithdrawEnabled,
|
1496
|
-
'fee': None,
|
1497
|
-
'limits': self.limits,
|
1498
1444
|
'networks': networks,
|
1499
|
-
|
1445
|
+
'deposit': None,
|
1446
|
+
'withdraw': None,
|
1447
|
+
'active': None,
|
1448
|
+
'fee': None,
|
1449
|
+
'limits': None,
|
1450
|
+
})
|
1500
1451
|
return result
|
1501
1452
|
|
1502
1453
|
async def fetch_accounts(self, params={}) -> List[Account]:
|
@@ -1636,6 +1587,35 @@ class kucoin(Exchange, ImplicitAPI):
|
|
1636
1587
|
# "chain": "ERC20"
|
1637
1588
|
# }
|
1638
1589
|
#
|
1590
|
+
if 'chains' in fee:
|
1591
|
+
# if data obtained through `currencies` endpoint
|
1592
|
+
resultNew: dict = {
|
1593
|
+
'info': fee,
|
1594
|
+
'withdraw': {
|
1595
|
+
'fee': None,
|
1596
|
+
'percentage': False,
|
1597
|
+
},
|
1598
|
+
'deposit': {
|
1599
|
+
'fee': None,
|
1600
|
+
'percentage': None,
|
1601
|
+
},
|
1602
|
+
'networks': {},
|
1603
|
+
}
|
1604
|
+
chains = self.safe_list(fee, 'chains', [])
|
1605
|
+
for i in range(0, len(chains)):
|
1606
|
+
chain = chains[i]
|
1607
|
+
networkCodeNew = self.network_id_to_code(self.safe_string(chain, 'chainId'), self.safe_string(currency, 'code'))
|
1608
|
+
resultNew['networks'][networkCodeNew] = {
|
1609
|
+
'withdraw': {
|
1610
|
+
'fee': self.safe_number(chain, 'withdrawMinFee'),
|
1611
|
+
'percentage': False,
|
1612
|
+
},
|
1613
|
+
'deposit': {
|
1614
|
+
'fee': None,
|
1615
|
+
'percentage': None,
|
1616
|
+
},
|
1617
|
+
}
|
1618
|
+
return resultNew
|
1639
1619
|
minWithdrawFee = self.safe_number(fee, 'withdrawMinFee')
|
1640
1620
|
result: dict = {
|
1641
1621
|
'info': fee,
|
ccxt/async_support/kuna.py
CHANGED
@@ -78,7 +78,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
78
78
|
'fetchMarkets': True,
|
79
79
|
'fetchMarkOHLCV': False,
|
80
80
|
'fetchMyTrades': True,
|
81
|
-
'fetchOHLCV':
|
81
|
+
'fetchOHLCV': False,
|
82
82
|
'fetchOpenInterest': False,
|
83
83
|
'fetchOpenInterestHistory': False,
|
84
84
|
'fetchOpenOrders': True,
|
@@ -363,6 +363,65 @@ class kuna(Exchange, ImplicitAPI):
|
|
363
363
|
],
|
364
364
|
},
|
365
365
|
},
|
366
|
+
'features': {
|
367
|
+
'spot': {
|
368
|
+
'sandbox': False,
|
369
|
+
'createOrder': {
|
370
|
+
'marginMode': False,
|
371
|
+
'triggerPrice': True,
|
372
|
+
'triggerPriceType': None,
|
373
|
+
'triggerDirection': False,
|
374
|
+
'stopLossPrice': False, # todo
|
375
|
+
'takeProfitPrice': False, # todo
|
376
|
+
'attachedStopLossTakeProfit': None,
|
377
|
+
'timeInForce': {
|
378
|
+
'IOC': False,
|
379
|
+
'FOK': False,
|
380
|
+
'PO': False,
|
381
|
+
'GTD': False,
|
382
|
+
},
|
383
|
+
'hedged': False,
|
384
|
+
'selfTradePrevention': False,
|
385
|
+
'trailing': False,
|
386
|
+
'leverage': False,
|
387
|
+
'marketBuyByCost': True,
|
388
|
+
'marketBuyRequiresPrice': False,
|
389
|
+
'iceberg': False,
|
390
|
+
},
|
391
|
+
'createOrders': None,
|
392
|
+
'fetchMyTrades': None, # todo implement
|
393
|
+
'fetchOrder': {
|
394
|
+
'marginMode': False,
|
395
|
+
'trigger': False,
|
396
|
+
'trailing': False,
|
397
|
+
},
|
398
|
+
'fetchOpenOrders': {
|
399
|
+
'marginMode': False,
|
400
|
+
'limit': 100,
|
401
|
+
'trigger': False,
|
402
|
+
'trailing': False,
|
403
|
+
},
|
404
|
+
'fetchOrders': None,
|
405
|
+
'fetchClosedOrders': {
|
406
|
+
'marginMode': False,
|
407
|
+
'limit': 100,
|
408
|
+
'daysBack': 100000, # todo
|
409
|
+
'daysBackCanceled': 1,
|
410
|
+
'untilDays': 14,
|
411
|
+
'trigger': False,
|
412
|
+
'trailing': False,
|
413
|
+
},
|
414
|
+
'fetchOHLCV': None,
|
415
|
+
},
|
416
|
+
'swap': {
|
417
|
+
'linear': None,
|
418
|
+
'inverse': None,
|
419
|
+
},
|
420
|
+
'future': {
|
421
|
+
'linear': None,
|
422
|
+
'inverse': None,
|
423
|
+
},
|
424
|
+
},
|
366
425
|
'fees': {
|
367
426
|
'trading': {
|
368
427
|
'tierBased': False,
|
ccxt/async_support/latoken.py
CHANGED
@@ -248,6 +248,70 @@ class latoken(Exchange, ImplicitAPI):
|
|
248
248
|
'method': 'fetchPrivateTradingFee', # or 'fetchPublicTradingFee'
|
249
249
|
},
|
250
250
|
},
|
251
|
+
'features': {
|
252
|
+
'spot': {
|
253
|
+
'sandbox': False,
|
254
|
+
'createOrder': {
|
255
|
+
'marginMode': False,
|
256
|
+
'triggerPrice': True,
|
257
|
+
'triggerPriceType': None,
|
258
|
+
'triggerDirection': False,
|
259
|
+
'stopLossPrice': False, # todo
|
260
|
+
'takeProfitPrice': False, # todo
|
261
|
+
'attachedStopLossTakeProfit': None,
|
262
|
+
'timeInForce': {
|
263
|
+
'IOC': True, # todo: for non-trigger orders
|
264
|
+
'FOK': True,
|
265
|
+
'PO': False,
|
266
|
+
'GTD': False,
|
267
|
+
},
|
268
|
+
'hedged': False,
|
269
|
+
'selfTradePrevention': False,
|
270
|
+
'trailing': False,
|
271
|
+
'leverage': False,
|
272
|
+
'marketBuyByCost': True,
|
273
|
+
'marketBuyRequiresPrice': False,
|
274
|
+
'iceberg': False,
|
275
|
+
},
|
276
|
+
'createOrders': None,
|
277
|
+
'fetchMyTrades': {
|
278
|
+
'marginMode': False,
|
279
|
+
'limit': 1000,
|
280
|
+
'daysBack': 100000, # todo
|
281
|
+
'untilDays': None,
|
282
|
+
},
|
283
|
+
'fetchOrder': {
|
284
|
+
'marginMode': False,
|
285
|
+
'trigger': True,
|
286
|
+
'trailing': False,
|
287
|
+
},
|
288
|
+
'fetchOpenOrders': {
|
289
|
+
'marginMode': False,
|
290
|
+
'limit': None,
|
291
|
+
'trigger': False,
|
292
|
+
'trailing': False,
|
293
|
+
},
|
294
|
+
'fetchOrders': None,
|
295
|
+
'fetchClosedOrders': {
|
296
|
+
'marginMode': False,
|
297
|
+
'limit': 1000,
|
298
|
+
'daysBack': 100000, # todo
|
299
|
+
'daysBackCanceled': 1,
|
300
|
+
'untilDays': None,
|
301
|
+
'trigger': True,
|
302
|
+
'trailing': False,
|
303
|
+
},
|
304
|
+
'fetchOHLCV': None,
|
305
|
+
},
|
306
|
+
'swap': {
|
307
|
+
'linear': None,
|
308
|
+
'inverse': None,
|
309
|
+
},
|
310
|
+
'future': {
|
311
|
+
'linear': None,
|
312
|
+
'inverse': None,
|
313
|
+
},
|
314
|
+
},
|
251
315
|
})
|
252
316
|
|
253
317
|
def nonce(self):
|