ccxt 4.4.27__py2.py3-none-any.whl → 4.4.28__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__ = '4.4.27'
25
+ __version__ = '4.4.28'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
ccxt/abstract/binance.py CHANGED
@@ -587,6 +587,9 @@ class ImplicitAPI:
587
587
  eapiprivate_get_mmp = eapiPrivateGetMmp = Entry('mmp', 'eapiPrivate', 'GET', {'cost': 1})
588
588
  eapiprivate_get_countdowncancelall = eapiPrivateGetCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'GET', {'cost': 1})
589
589
  eapiprivate_get_order = eapiPrivateGetOrder = Entry('order', 'eapiPrivate', 'GET', {'cost': 1})
590
+ eapiprivate_get_block_order_orders = eapiPrivateGetBlockOrderOrders = Entry('block/order/orders', 'eapiPrivate', 'GET', {'cost': 5})
591
+ eapiprivate_get_block_order_execute = eapiPrivateGetBlockOrderExecute = Entry('block/order/execute', 'eapiPrivate', 'GET', {'cost': 5})
592
+ eapiprivate_get_block_user_trades = eapiPrivateGetBlockUserTrades = Entry('block/user-trades', 'eapiPrivate', 'GET', {'cost': 5})
590
593
  eapiprivate_post_order = eapiPrivatePostOrder = Entry('order', 'eapiPrivate', 'POST', {'cost': 1})
591
594
  eapiprivate_post_batchorders = eapiPrivatePostBatchOrders = Entry('batchOrders', 'eapiPrivate', 'POST', {'cost': 5})
592
595
  eapiprivate_post_listenkey = eapiPrivatePostListenKey = Entry('listenKey', 'eapiPrivate', 'POST', {'cost': 1})
@@ -594,12 +597,16 @@ class ImplicitAPI:
594
597
  eapiprivate_post_mmpreset = eapiPrivatePostMmpReset = Entry('mmpReset', 'eapiPrivate', 'POST', {'cost': 1})
595
598
  eapiprivate_post_countdowncancelall = eapiPrivatePostCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'POST', {'cost': 1})
596
599
  eapiprivate_post_countdowncancelallheartbeat = eapiPrivatePostCountdownCancelAllHeartBeat = Entry('countdownCancelAllHeartBeat', 'eapiPrivate', 'POST', {'cost': 10})
600
+ eapiprivate_post_block_order_create = eapiPrivatePostBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'POST', {'cost': 5})
601
+ eapiprivate_post_block_order_execute = eapiPrivatePostBlockOrderExecute = Entry('block/order/execute', 'eapiPrivate', 'POST', {'cost': 5})
597
602
  eapiprivate_put_listenkey = eapiPrivatePutListenKey = Entry('listenKey', 'eapiPrivate', 'PUT', {'cost': 1})
603
+ eapiprivate_put_block_order_create = eapiPrivatePutBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'PUT', {'cost': 5})
598
604
  eapiprivate_delete_order = eapiPrivateDeleteOrder = Entry('order', 'eapiPrivate', 'DELETE', {'cost': 1})
599
605
  eapiprivate_delete_batchorders = eapiPrivateDeleteBatchOrders = Entry('batchOrders', 'eapiPrivate', 'DELETE', {'cost': 1})
600
606
  eapiprivate_delete_allopenorders = eapiPrivateDeleteAllOpenOrders = Entry('allOpenOrders', 'eapiPrivate', 'DELETE', {'cost': 1})
601
607
  eapiprivate_delete_allopenordersbyunderlying = eapiPrivateDeleteAllOpenOrdersByUnderlying = Entry('allOpenOrdersByUnderlying', 'eapiPrivate', 'DELETE', {'cost': 1})
602
608
  eapiprivate_delete_listenkey = eapiPrivateDeleteListenKey = Entry('listenKey', 'eapiPrivate', 'DELETE', {'cost': 1})
609
+ eapiprivate_delete_block_order_create = eapiPrivateDeleteBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'DELETE', {'cost': 5})
603
610
  public_get_ping = publicGetPing = Entry('ping', 'public', 'GET', {'cost': 0.2})
604
611
  public_get_time = publicGetTime = Entry('time', 'public', 'GET', {'cost': 0.2})
605
612
  public_get_depth = publicGetDepth = Entry('depth', 'public', 'GET', {'cost': 1, 'byLimit': [[100, 1], [500, 5], [1000, 10], [5000, 50]]})
@@ -587,6 +587,9 @@ class ImplicitAPI:
587
587
  eapiprivate_get_mmp = eapiPrivateGetMmp = Entry('mmp', 'eapiPrivate', 'GET', {'cost': 1})
588
588
  eapiprivate_get_countdowncancelall = eapiPrivateGetCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'GET', {'cost': 1})
589
589
  eapiprivate_get_order = eapiPrivateGetOrder = Entry('order', 'eapiPrivate', 'GET', {'cost': 1})
590
+ eapiprivate_get_block_order_orders = eapiPrivateGetBlockOrderOrders = Entry('block/order/orders', 'eapiPrivate', 'GET', {'cost': 5})
591
+ eapiprivate_get_block_order_execute = eapiPrivateGetBlockOrderExecute = Entry('block/order/execute', 'eapiPrivate', 'GET', {'cost': 5})
592
+ eapiprivate_get_block_user_trades = eapiPrivateGetBlockUserTrades = Entry('block/user-trades', 'eapiPrivate', 'GET', {'cost': 5})
590
593
  eapiprivate_post_order = eapiPrivatePostOrder = Entry('order', 'eapiPrivate', 'POST', {'cost': 1})
591
594
  eapiprivate_post_batchorders = eapiPrivatePostBatchOrders = Entry('batchOrders', 'eapiPrivate', 'POST', {'cost': 5})
592
595
  eapiprivate_post_listenkey = eapiPrivatePostListenKey = Entry('listenKey', 'eapiPrivate', 'POST', {'cost': 1})
@@ -594,12 +597,16 @@ class ImplicitAPI:
594
597
  eapiprivate_post_mmpreset = eapiPrivatePostMmpReset = Entry('mmpReset', 'eapiPrivate', 'POST', {'cost': 1})
595
598
  eapiprivate_post_countdowncancelall = eapiPrivatePostCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'POST', {'cost': 1})
596
599
  eapiprivate_post_countdowncancelallheartbeat = eapiPrivatePostCountdownCancelAllHeartBeat = Entry('countdownCancelAllHeartBeat', 'eapiPrivate', 'POST', {'cost': 10})
600
+ eapiprivate_post_block_order_create = eapiPrivatePostBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'POST', {'cost': 5})
601
+ eapiprivate_post_block_order_execute = eapiPrivatePostBlockOrderExecute = Entry('block/order/execute', 'eapiPrivate', 'POST', {'cost': 5})
597
602
  eapiprivate_put_listenkey = eapiPrivatePutListenKey = Entry('listenKey', 'eapiPrivate', 'PUT', {'cost': 1})
603
+ eapiprivate_put_block_order_create = eapiPrivatePutBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'PUT', {'cost': 5})
598
604
  eapiprivate_delete_order = eapiPrivateDeleteOrder = Entry('order', 'eapiPrivate', 'DELETE', {'cost': 1})
599
605
  eapiprivate_delete_batchorders = eapiPrivateDeleteBatchOrders = Entry('batchOrders', 'eapiPrivate', 'DELETE', {'cost': 1})
600
606
  eapiprivate_delete_allopenorders = eapiPrivateDeleteAllOpenOrders = Entry('allOpenOrders', 'eapiPrivate', 'DELETE', {'cost': 1})
601
607
  eapiprivate_delete_allopenordersbyunderlying = eapiPrivateDeleteAllOpenOrdersByUnderlying = Entry('allOpenOrdersByUnderlying', 'eapiPrivate', 'DELETE', {'cost': 1})
602
608
  eapiprivate_delete_listenkey = eapiPrivateDeleteListenKey = Entry('listenKey', 'eapiPrivate', 'DELETE', {'cost': 1})
609
+ eapiprivate_delete_block_order_create = eapiPrivateDeleteBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'DELETE', {'cost': 5})
603
610
  public_get_ping = publicGetPing = Entry('ping', 'public', 'GET', {'cost': 0.2})
604
611
  public_get_time = publicGetTime = Entry('time', 'public', 'GET', {'cost': 0.2})
605
612
  public_get_depth = publicGetDepth = Entry('depth', 'public', 'GET', {'cost': 1, 'byLimit': [[100, 1], [500, 5], [1000, 10], [5000, 50]]})
@@ -639,6 +639,9 @@ class ImplicitAPI:
639
639
  eapiprivate_get_mmp = eapiPrivateGetMmp = Entry('mmp', 'eapiPrivate', 'GET', {'cost': 1})
640
640
  eapiprivate_get_countdowncancelall = eapiPrivateGetCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'GET', {'cost': 1})
641
641
  eapiprivate_get_order = eapiPrivateGetOrder = Entry('order', 'eapiPrivate', 'GET', {'cost': 1})
642
+ eapiprivate_get_block_order_orders = eapiPrivateGetBlockOrderOrders = Entry('block/order/orders', 'eapiPrivate', 'GET', {'cost': 5})
643
+ eapiprivate_get_block_order_execute = eapiPrivateGetBlockOrderExecute = Entry('block/order/execute', 'eapiPrivate', 'GET', {'cost': 5})
644
+ eapiprivate_get_block_user_trades = eapiPrivateGetBlockUserTrades = Entry('block/user-trades', 'eapiPrivate', 'GET', {'cost': 5})
642
645
  eapiprivate_post_order = eapiPrivatePostOrder = Entry('order', 'eapiPrivate', 'POST', {'cost': 1})
643
646
  eapiprivate_post_batchorders = eapiPrivatePostBatchOrders = Entry('batchOrders', 'eapiPrivate', 'POST', {'cost': 5})
644
647
  eapiprivate_post_listenkey = eapiPrivatePostListenKey = Entry('listenKey', 'eapiPrivate', 'POST', {'cost': 1})
@@ -646,12 +649,16 @@ class ImplicitAPI:
646
649
  eapiprivate_post_mmpreset = eapiPrivatePostMmpReset = Entry('mmpReset', 'eapiPrivate', 'POST', {'cost': 1})
647
650
  eapiprivate_post_countdowncancelall = eapiPrivatePostCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'POST', {'cost': 1})
648
651
  eapiprivate_post_countdowncancelallheartbeat = eapiPrivatePostCountdownCancelAllHeartBeat = Entry('countdownCancelAllHeartBeat', 'eapiPrivate', 'POST', {'cost': 10})
652
+ eapiprivate_post_block_order_create = eapiPrivatePostBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'POST', {'cost': 5})
653
+ eapiprivate_post_block_order_execute = eapiPrivatePostBlockOrderExecute = Entry('block/order/execute', 'eapiPrivate', 'POST', {'cost': 5})
649
654
  eapiprivate_put_listenkey = eapiPrivatePutListenKey = Entry('listenKey', 'eapiPrivate', 'PUT', {'cost': 1})
655
+ eapiprivate_put_block_order_create = eapiPrivatePutBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'PUT', {'cost': 5})
650
656
  eapiprivate_delete_order = eapiPrivateDeleteOrder = Entry('order', 'eapiPrivate', 'DELETE', {'cost': 1})
651
657
  eapiprivate_delete_batchorders = eapiPrivateDeleteBatchOrders = Entry('batchOrders', 'eapiPrivate', 'DELETE', {'cost': 1})
652
658
  eapiprivate_delete_allopenorders = eapiPrivateDeleteAllOpenOrders = Entry('allOpenOrders', 'eapiPrivate', 'DELETE', {'cost': 1})
653
659
  eapiprivate_delete_allopenordersbyunderlying = eapiPrivateDeleteAllOpenOrdersByUnderlying = Entry('allOpenOrdersByUnderlying', 'eapiPrivate', 'DELETE', {'cost': 1})
654
660
  eapiprivate_delete_listenkey = eapiPrivateDeleteListenKey = Entry('listenKey', 'eapiPrivate', 'DELETE', {'cost': 1})
661
+ eapiprivate_delete_block_order_create = eapiPrivateDeleteBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'DELETE', {'cost': 5})
655
662
  public_get_ping = publicGetPing = Entry('ping', 'public', 'GET', {'cost': 1})
656
663
  public_get_time = publicGetTime = Entry('time', 'public', 'GET', {'cost': 1})
657
664
  public_get_depth = publicGetDepth = Entry('depth', 'public', 'GET', {'cost': 1, 'byLimit': [[100, 1], [500, 5], [1000, 10], [5000, 50]]})
@@ -587,6 +587,9 @@ class ImplicitAPI:
587
587
  eapiprivate_get_mmp = eapiPrivateGetMmp = Entry('mmp', 'eapiPrivate', 'GET', {'cost': 1})
588
588
  eapiprivate_get_countdowncancelall = eapiPrivateGetCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'GET', {'cost': 1})
589
589
  eapiprivate_get_order = eapiPrivateGetOrder = Entry('order', 'eapiPrivate', 'GET', {'cost': 1})
590
+ eapiprivate_get_block_order_orders = eapiPrivateGetBlockOrderOrders = Entry('block/order/orders', 'eapiPrivate', 'GET', {'cost': 5})
591
+ eapiprivate_get_block_order_execute = eapiPrivateGetBlockOrderExecute = Entry('block/order/execute', 'eapiPrivate', 'GET', {'cost': 5})
592
+ eapiprivate_get_block_user_trades = eapiPrivateGetBlockUserTrades = Entry('block/user-trades', 'eapiPrivate', 'GET', {'cost': 5})
590
593
  eapiprivate_post_order = eapiPrivatePostOrder = Entry('order', 'eapiPrivate', 'POST', {'cost': 1})
591
594
  eapiprivate_post_batchorders = eapiPrivatePostBatchOrders = Entry('batchOrders', 'eapiPrivate', 'POST', {'cost': 5})
592
595
  eapiprivate_post_listenkey = eapiPrivatePostListenKey = Entry('listenKey', 'eapiPrivate', 'POST', {'cost': 1})
@@ -594,12 +597,16 @@ class ImplicitAPI:
594
597
  eapiprivate_post_mmpreset = eapiPrivatePostMmpReset = Entry('mmpReset', 'eapiPrivate', 'POST', {'cost': 1})
595
598
  eapiprivate_post_countdowncancelall = eapiPrivatePostCountdownCancelAll = Entry('countdownCancelAll', 'eapiPrivate', 'POST', {'cost': 1})
596
599
  eapiprivate_post_countdowncancelallheartbeat = eapiPrivatePostCountdownCancelAllHeartBeat = Entry('countdownCancelAllHeartBeat', 'eapiPrivate', 'POST', {'cost': 10})
600
+ eapiprivate_post_block_order_create = eapiPrivatePostBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'POST', {'cost': 5})
601
+ eapiprivate_post_block_order_execute = eapiPrivatePostBlockOrderExecute = Entry('block/order/execute', 'eapiPrivate', 'POST', {'cost': 5})
597
602
  eapiprivate_put_listenkey = eapiPrivatePutListenKey = Entry('listenKey', 'eapiPrivate', 'PUT', {'cost': 1})
603
+ eapiprivate_put_block_order_create = eapiPrivatePutBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'PUT', {'cost': 5})
598
604
  eapiprivate_delete_order = eapiPrivateDeleteOrder = Entry('order', 'eapiPrivate', 'DELETE', {'cost': 1})
599
605
  eapiprivate_delete_batchorders = eapiPrivateDeleteBatchOrders = Entry('batchOrders', 'eapiPrivate', 'DELETE', {'cost': 1})
600
606
  eapiprivate_delete_allopenorders = eapiPrivateDeleteAllOpenOrders = Entry('allOpenOrders', 'eapiPrivate', 'DELETE', {'cost': 1})
601
607
  eapiprivate_delete_allopenordersbyunderlying = eapiPrivateDeleteAllOpenOrdersByUnderlying = Entry('allOpenOrdersByUnderlying', 'eapiPrivate', 'DELETE', {'cost': 1})
602
608
  eapiprivate_delete_listenkey = eapiPrivateDeleteListenKey = Entry('listenKey', 'eapiPrivate', 'DELETE', {'cost': 1})
609
+ eapiprivate_delete_block_order_create = eapiPrivateDeleteBlockOrderCreate = Entry('block/order/create', 'eapiPrivate', 'DELETE', {'cost': 5})
603
610
  public_get_ping = publicGetPing = Entry('ping', 'public', 'GET', {'cost': 0.2})
604
611
  public_get_time = publicGetTime = Entry('time', 'public', 'GET', {'cost': 0.2})
605
612
  public_get_depth = publicGetDepth = Entry('depth', 'public', 'GET', {'cost': 1, 'byLimit': [[100, 1], [500, 5], [1000, 10], [5000, 50]]})
ccxt/alpaca.py CHANGED
@@ -17,6 +17,7 @@ from ccxt.base.errors import InvalidOrder
17
17
  from ccxt.base.errors import NotSupported
18
18
  from ccxt.base.errors import RateLimitExceeded
19
19
  from ccxt.base.decimal_to_precision import TICK_SIZE
20
+ from ccxt.base.precise import Precise
20
21
 
21
22
 
22
23
  class alpaca(Exchange, ImplicitAPI):
@@ -1313,19 +1314,19 @@ class alpaca(Exchange, ImplicitAPI):
1313
1314
  response = self.traderPrivatePostV2WalletsTransfers(self.extend(request, params))
1314
1315
  #
1315
1316
  # {
1316
- # "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1317
- # "tx_hash": "string",
1318
- # "direction": "INCOMING",
1317
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1318
+ # "tx_hash": null,
1319
+ # "direction": "OUTGOING",
1320
+ # "amount": "20",
1321
+ # "usd_value": "19.99856",
1322
+ # "chain": "ETH",
1323
+ # "asset": "USDT",
1324
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1325
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1319
1326
  # "status": "PROCESSING",
1320
- # "amount": "string",
1321
- # "usd_value": "string",
1322
- # "network_fee": "string",
1323
- # "fees": "string",
1324
- # "chain": "string",
1325
- # "asset": "string",
1326
- # "from_address": "string",
1327
- # "to_address": "string",
1328
- # "created_at": "2024-11-02T07:42:48.402Z"
1327
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1328
+ # "network_fee": "4",
1329
+ # "fees": "0.1"
1329
1330
  # }
1330
1331
  #
1331
1332
  return self.parse_transaction(response, currency)
@@ -1338,19 +1339,19 @@ class alpaca(Exchange, ImplicitAPI):
1338
1339
  response = self.traderPrivateGetV2WalletsTransfers(params)
1339
1340
  #
1340
1341
  # {
1341
- # "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1342
- # "tx_hash": "string",
1343
- # "direction": "INCOMING",
1342
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1343
+ # "tx_hash": null,
1344
+ # "direction": "OUTGOING",
1345
+ # "amount": "20",
1346
+ # "usd_value": "19.99856",
1347
+ # "chain": "ETH",
1348
+ # "asset": "USDT",
1349
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1350
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1344
1351
  # "status": "PROCESSING",
1345
- # "amount": "string",
1346
- # "usd_value": "string",
1347
- # "network_fee": "string",
1348
- # "fees": "string",
1349
- # "chain": "string",
1350
- # "asset": "string",
1351
- # "from_address": "string",
1352
- # "to_address": "string",
1353
- # "created_at": "2024-11-02T07:42:48.402Z"
1352
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1353
+ # "network_fee": "4",
1354
+ # "fees": "0.1"
1354
1355
  # }
1355
1356
  #
1356
1357
  results = []
@@ -1359,7 +1360,7 @@ class alpaca(Exchange, ImplicitAPI):
1359
1360
  direction = self.safe_string(entry, 'direction')
1360
1361
  if direction == type:
1361
1362
  results.append(entry)
1362
- elif direction == 'BOTH':
1363
+ elif type == 'BOTH':
1363
1364
  results.append(entry)
1364
1365
  return self.parse_transactions(results, currency, since, limit, params)
1365
1366
 
@@ -1402,26 +1403,29 @@ class alpaca(Exchange, ImplicitAPI):
1402
1403
  def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1403
1404
  #
1404
1405
  # {
1405
- # "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1406
- # "tx_hash": "string",
1407
- # "direction": "INCOMING",
1406
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1407
+ # "tx_hash": null,
1408
+ # "direction": "OUTGOING",
1409
+ # "amount": "20",
1410
+ # "usd_value": "19.99856",
1411
+ # "chain": "ETH",
1412
+ # "asset": "USDT",
1413
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1414
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1408
1415
  # "status": "PROCESSING",
1409
- # "amount": "string",
1410
- # "usd_value": "string",
1411
- # "network_fee": "string",
1412
- # "fees": "string",
1413
- # "chain": "string",
1414
- # "asset": "string",
1415
- # "from_address": "string",
1416
- # "to_address": "string",
1417
- # "created_at": "2024-11-02T07:42:48.402Z"
1416
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1417
+ # "network_fee": "4",
1418
+ # "fees": "0.1"
1418
1419
  # }
1419
1420
  #
1420
1421
  datetime = self.safe_string(transaction, 'created_at')
1421
1422
  currencyId = self.safe_string(transaction, 'asset')
1422
1423
  code = self.safe_currency_code(currencyId, currency)
1424
+ fees = self.safe_string(transaction, 'fees')
1425
+ networkFee = self.safe_string(transaction, 'network_fee')
1426
+ totalFee = Precise.string_add(fees, networkFee)
1423
1427
  fee = {
1424
- 'cost': self.safe_number(transaction, 'fees'),
1428
+ 'cost': self.parse_number(totalFee),
1425
1429
  'currency': code,
1426
1430
  }
1427
1431
  return {
@@ -1450,8 +1454,8 @@ class alpaca(Exchange, ImplicitAPI):
1450
1454
  def parse_transaction_status(self, status: Str):
1451
1455
  statuses: dict = {
1452
1456
  'PROCESSING': 'pending',
1453
- # 'FAILED': 'failed',
1454
- # 'SUCCESS': 'ok',
1457
+ 'FAILED': 'failed',
1458
+ 'COMPLETE': 'ok',
1455
1459
  }
1456
1460
  return self.safe_string(statuses, status, status)
1457
1461
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.27'
7
+ __version__ = '4.4.28'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -17,6 +17,7 @@ from ccxt.base.errors import InvalidOrder
17
17
  from ccxt.base.errors import NotSupported
18
18
  from ccxt.base.errors import RateLimitExceeded
19
19
  from ccxt.base.decimal_to_precision import TICK_SIZE
20
+ from ccxt.base.precise import Precise
20
21
 
21
22
 
22
23
  class alpaca(Exchange, ImplicitAPI):
@@ -1313,19 +1314,19 @@ class alpaca(Exchange, ImplicitAPI):
1313
1314
  response = await self.traderPrivatePostV2WalletsTransfers(self.extend(request, params))
1314
1315
  #
1315
1316
  # {
1316
- # "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1317
- # "tx_hash": "string",
1318
- # "direction": "INCOMING",
1317
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1318
+ # "tx_hash": null,
1319
+ # "direction": "OUTGOING",
1320
+ # "amount": "20",
1321
+ # "usd_value": "19.99856",
1322
+ # "chain": "ETH",
1323
+ # "asset": "USDT",
1324
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1325
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1319
1326
  # "status": "PROCESSING",
1320
- # "amount": "string",
1321
- # "usd_value": "string",
1322
- # "network_fee": "string",
1323
- # "fees": "string",
1324
- # "chain": "string",
1325
- # "asset": "string",
1326
- # "from_address": "string",
1327
- # "to_address": "string",
1328
- # "created_at": "2024-11-02T07:42:48.402Z"
1327
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1328
+ # "network_fee": "4",
1329
+ # "fees": "0.1"
1329
1330
  # }
1330
1331
  #
1331
1332
  return self.parse_transaction(response, currency)
@@ -1338,19 +1339,19 @@ class alpaca(Exchange, ImplicitAPI):
1338
1339
  response = await self.traderPrivateGetV2WalletsTransfers(params)
1339
1340
  #
1340
1341
  # {
1341
- # "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1342
- # "tx_hash": "string",
1343
- # "direction": "INCOMING",
1342
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1343
+ # "tx_hash": null,
1344
+ # "direction": "OUTGOING",
1345
+ # "amount": "20",
1346
+ # "usd_value": "19.99856",
1347
+ # "chain": "ETH",
1348
+ # "asset": "USDT",
1349
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1350
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1344
1351
  # "status": "PROCESSING",
1345
- # "amount": "string",
1346
- # "usd_value": "string",
1347
- # "network_fee": "string",
1348
- # "fees": "string",
1349
- # "chain": "string",
1350
- # "asset": "string",
1351
- # "from_address": "string",
1352
- # "to_address": "string",
1353
- # "created_at": "2024-11-02T07:42:48.402Z"
1352
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1353
+ # "network_fee": "4",
1354
+ # "fees": "0.1"
1354
1355
  # }
1355
1356
  #
1356
1357
  results = []
@@ -1359,7 +1360,7 @@ class alpaca(Exchange, ImplicitAPI):
1359
1360
  direction = self.safe_string(entry, 'direction')
1360
1361
  if direction == type:
1361
1362
  results.append(entry)
1362
- elif direction == 'BOTH':
1363
+ elif type == 'BOTH':
1363
1364
  results.append(entry)
1364
1365
  return self.parse_transactions(results, currency, since, limit, params)
1365
1366
 
@@ -1402,26 +1403,29 @@ class alpaca(Exchange, ImplicitAPI):
1402
1403
  def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1403
1404
  #
1404
1405
  # {
1405
- # "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
1406
- # "tx_hash": "string",
1407
- # "direction": "INCOMING",
1406
+ # "id": "e27b70a6-5610-40d7-8468-a516a284b776",
1407
+ # "tx_hash": null,
1408
+ # "direction": "OUTGOING",
1409
+ # "amount": "20",
1410
+ # "usd_value": "19.99856",
1411
+ # "chain": "ETH",
1412
+ # "asset": "USDT",
1413
+ # "from_address": "0x123930E4dCA196E070d39B60c644C8Aae02f23",
1414
+ # "to_address": "0x1232c0925196e4dcf05945f67f690153190fbaab",
1408
1415
  # "status": "PROCESSING",
1409
- # "amount": "string",
1410
- # "usd_value": "string",
1411
- # "network_fee": "string",
1412
- # "fees": "string",
1413
- # "chain": "string",
1414
- # "asset": "string",
1415
- # "from_address": "string",
1416
- # "to_address": "string",
1417
- # "created_at": "2024-11-02T07:42:48.402Z"
1416
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1417
+ # "network_fee": "4",
1418
+ # "fees": "0.1"
1418
1419
  # }
1419
1420
  #
1420
1421
  datetime = self.safe_string(transaction, 'created_at')
1421
1422
  currencyId = self.safe_string(transaction, 'asset')
1422
1423
  code = self.safe_currency_code(currencyId, currency)
1424
+ fees = self.safe_string(transaction, 'fees')
1425
+ networkFee = self.safe_string(transaction, 'network_fee')
1426
+ totalFee = Precise.string_add(fees, networkFee)
1423
1427
  fee = {
1424
- 'cost': self.safe_number(transaction, 'fees'),
1428
+ 'cost': self.parse_number(totalFee),
1425
1429
  'currency': code,
1426
1430
  }
1427
1431
  return {
@@ -1450,8 +1454,8 @@ class alpaca(Exchange, ImplicitAPI):
1450
1454
  def parse_transaction_status(self, status: Str):
1451
1455
  statuses: dict = {
1452
1456
  'PROCESSING': 'pending',
1453
- # 'FAILED': 'failed',
1454
- # 'SUCCESS': 'ok',
1457
+ 'FAILED': 'failed',
1458
+ 'COMPLETE': 'ok',
1455
1459
  }
1456
1460
  return self.safe_string(statuses, status, status)
1457
1461
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.4.27'
5
+ __version__ = '4.4.28'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -974,6 +974,9 @@ class binance(Exchange, ImplicitAPI):
974
974
  'mmp': 1,
975
975
  'countdownCancelAll': 1,
976
976
  'order': 1,
977
+ 'block/order/orders': 5,
978
+ 'block/order/execute': 5,
979
+ 'block/user-trades': 5,
977
980
  },
978
981
  'post': {
979
982
  'order': 1,
@@ -983,9 +986,12 @@ class binance(Exchange, ImplicitAPI):
983
986
  'mmpReset': 1,
984
987
  'countdownCancelAll': 1,
985
988
  'countdownCancelAllHeartBeat': 10,
989
+ 'block/order/create': 5,
990
+ 'block/order/execute': 5,
986
991
  },
987
992
  'put': {
988
993
  'listenKey': 1,
994
+ 'block/order/create': 5,
989
995
  },
990
996
  'delete': {
991
997
  'order': 1,
@@ -993,6 +999,7 @@ class binance(Exchange, ImplicitAPI):
993
999
  'allOpenOrders': 1,
994
1000
  'allOpenOrdersByUnderlying': 1,
995
1001
  'listenKey': 1,
1002
+ 'block/order/create': 5,
996
1003
  },
997
1004
  },
998
1005
  'public': {
@@ -1436,7 +1436,7 @@ class kraken(Exchange, ImplicitAPI):
1436
1436
  # {
1437
1437
  # "error": [],
1438
1438
  # "result": {
1439
- # "descr": {order: 'buy 0.02100000 ETHUSDT @ limit 330.00'},
1439
+ # "descr": {order: 'buy 0.02100000 ETHUSDT @ limit 330.00'}, # see more examples in "parseOrder"
1440
1440
  # "txid": ['OEKVV2-IH52O-TPL6GZ']
1441
1441
  # }
1442
1442
  # }
@@ -1496,9 +1496,10 @@ class kraken(Exchange, ImplicitAPI):
1496
1496
 
1497
1497
  def parse_order_type(self, status):
1498
1498
  statuses: dict = {
1499
+ # we dont add "space" delimited orders here(eg. stop loss) because they need separate parsing
1499
1500
  'take-profit': 'market',
1500
- 'stop-loss-limit': 'limit',
1501
1501
  'stop-loss': 'market',
1502
+ 'stop-loss-limit': 'limit',
1502
1503
  'take-profit-limit': 'limit',
1503
1504
  'trailing-stop-limit': 'limit',
1504
1505
  }
@@ -1506,30 +1507,19 @@ class kraken(Exchange, ImplicitAPI):
1506
1507
 
1507
1508
  def parse_order(self, order: dict, market: Market = None) -> Order:
1508
1509
  #
1509
- # createOrder for regular orders
1510
+ # createOrder
1510
1511
  #
1511
1512
  # {
1512
- # "descr": {order: 'buy 0.02100000 ETHUSDT @ limit 330.00'},
1513
+ # "descr": {
1514
+ # "order": "buy 0.02100000 ETHUSDT @ limit 330.00" # limit orders
1515
+ # "buy 0.12345678 ETHUSDT @ market" # market order
1516
+ # "sell 0.28002676 ETHUSDT @ stop loss 0.0123 -> limit 0.0.1222" # stop order
1517
+ # "sell 0.00100000 ETHUSDT @ stop loss 2677.00 -> limit 2577.00 with 5:1 leverage"
1518
+ # "buy 0.10000000 LTCUSDT @ take profit 75.00000 -> limit 74.00000"
1519
+ # "sell 10.00000000 XRPEUR @ trailing stop +50.0000%" # trailing stop
1520
+ # },
1513
1521
  # "txid": ['OEKVV2-IH52O-TPL6GZ']
1514
1522
  # }
1515
- # {
1516
- # "txid": ["TX_ID_HERE"],
1517
- # "descr": {"order":"buy 0.12345678 ETHEUR @ market"},
1518
- # }
1519
- #
1520
- #
1521
- # createOrder for stop orders
1522
- #
1523
- # {
1524
- # "txid":["OSILNC-VQI5Q-775ZDQ"],
1525
- # "descr":{"order":"sell 167.28002676 ADAXBT @ stop loss 0.00003280 -> limit 0.00003212"}
1526
- # }
1527
- #
1528
- #
1529
- # {
1530
- # "txid":["OVHMJV-BZW2V-6NZFWF"],
1531
- # "descr":{"order":"sell 0.00100000 ETHUSD @ stop loss 2677.00 -> limit 2577.00 with 5:1 leverage"}
1532
- # }
1533
1523
  #
1534
1524
  # editOrder
1535
1525
  #
@@ -1607,24 +1597,29 @@ class kraken(Exchange, ImplicitAPI):
1607
1597
  else:
1608
1598
  orderDescription = self.safe_string(order, 'descr')
1609
1599
  side = None
1610
- type = None
1600
+ rawType = None
1611
1601
  marketId = None
1612
1602
  price = None
1613
1603
  amount = None
1614
- stopPrice = None
1604
+ triggerPrice = None
1615
1605
  if orderDescription is not None:
1616
1606
  parts = orderDescription.split(' ')
1617
1607
  side = self.safe_string(parts, 0)
1618
1608
  amount = self.safe_string(parts, 1)
1619
1609
  marketId = self.safe_string(parts, 2)
1620
- type = self.safe_string(parts, 4)
1621
- if type == 'stop':
1622
- stopPrice = self.safe_string(parts, 6)
1610
+ part4 = self.safe_string(parts, 4)
1611
+ part5 = self.safe_string(parts, 5)
1612
+ if part4 == 'limit' or part4 == 'market':
1613
+ rawType = part4 # eg, limit, market
1614
+ else:
1615
+ rawType = part4 + ' ' + part5 # eg. stop loss, take profit, trailing stop
1616
+ if rawType == 'stop loss' or rawType == 'take profit':
1617
+ triggerPrice = self.safe_string(parts, 6)
1623
1618
  price = self.safe_string(parts, 9)
1624
- elif type == 'limit':
1619
+ elif rawType == 'limit':
1625
1620
  price = self.safe_string(parts, 5)
1626
1621
  side = self.safe_string(description, 'type', side)
1627
- type = self.safe_string(description, 'ordertype', type)
1622
+ rawType = self.safe_string(description, 'ordertype', rawType) # orderType has dash, e.g. trailing-stop
1628
1623
  marketId = self.safe_string(description, 'pair', marketId)
1629
1624
  foundMarket = self.find_market_by_altname_or_id(marketId)
1630
1625
  symbol = None
@@ -1676,15 +1671,28 @@ class kraken(Exchange, ImplicitAPI):
1676
1671
  trades.append(self.safe_trade({'id': rawTrade, 'orderId': id, 'symbol': symbol, 'info': {}}))
1677
1672
  else:
1678
1673
  trades.append(rawTrade)
1679
- stopPrice = self.omit_zero(self.safe_string(order, 'stopprice', stopPrice))
1674
+ # in #24192 PR, self field is not something consistent/actual
1675
+ # triggerPrice = self.omit_zero(self.safe_string(order, 'stopprice', triggerPrice))
1680
1676
  stopLossPrice = None
1681
1677
  takeProfitPrice = None
1682
- if type.startswith('take-profit'):
1678
+ # the dashed strings are not provided from fields(eg. fetch order)
1679
+ # while spaced strings from "order" sentence(when other fields not available)
1680
+ if rawType.startswith('take-profit'):
1683
1681
  takeProfitPrice = self.safe_string(description, 'price')
1684
1682
  price = self.omit_zero(self.safe_string(description, 'price2'))
1685
- elif type.startswith('stop-loss'):
1683
+ elif rawType.startswith('stop-loss'):
1686
1684
  stopLossPrice = self.safe_string(description, 'price')
1687
1685
  price = self.omit_zero(self.safe_string(description, 'price2'))
1686
+ elif rawType == 'take profit':
1687
+ takeProfitPrice = triggerPrice
1688
+ elif rawType == 'stop loss':
1689
+ stopLossPrice = triggerPrice
1690
+ finalType = self.parse_order_type(rawType)
1691
+ # unlike from endpoints which provide eg: "take-profit-limit"
1692
+ # for "space-delimited" orders we dont have market/limit suffixes, their format is
1693
+ # eg: `stop loss > limit 123`, so we need to parse them manually
1694
+ if self.in_array(finalType, ['stop loss', 'take profit']):
1695
+ finalType = 'market' if (price is None) else 'limit'
1688
1696
  return self.safe_order({
1689
1697
  'id': id,
1690
1698
  'clientOrderId': clientOrderId,
@@ -1694,13 +1702,13 @@ class kraken(Exchange, ImplicitAPI):
1694
1702
  'lastTradeTimestamp': None,
1695
1703
  'status': status,
1696
1704
  'symbol': symbol,
1697
- 'type': self.parse_order_type(type),
1705
+ 'type': finalType,
1698
1706
  'timeInForce': None,
1699
1707
  'postOnly': isPostOnly,
1700
1708
  'side': side,
1701
1709
  'price': price,
1702
- 'stopPrice': stopPrice,
1703
- 'triggerPrice': stopPrice,
1710
+ 'stopPrice': triggerPrice,
1711
+ 'triggerPrice': triggerPrice,
1704
1712
  'takeProfitPrice': takeProfitPrice,
1705
1713
  'stopLossPrice': stopLossPrice,
1706
1714
  'cost': None,
@@ -1443,6 +1443,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1443
1443
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
1444
1444
  """
1445
1445
  fetches information on an order made by the user
1446
+ :see: https://matcher.waves.exchange/api-docs/index.html#/status/getOrderStatusByPKAndIdWithSig
1446
1447
  :param str symbol: unified symbol of the market the order was made in
1447
1448
  :param dict [params]: extra parameters specific to the exchange API endpoint
1448
1449
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.27'
7
+ __version__ = '4.4.28'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/binance.py CHANGED
@@ -973,6 +973,9 @@ class binance(Exchange, ImplicitAPI):
973
973
  'mmp': 1,
974
974
  'countdownCancelAll': 1,
975
975
  'order': 1,
976
+ 'block/order/orders': 5,
977
+ 'block/order/execute': 5,
978
+ 'block/user-trades': 5,
976
979
  },
977
980
  'post': {
978
981
  'order': 1,
@@ -982,9 +985,12 @@ class binance(Exchange, ImplicitAPI):
982
985
  'mmpReset': 1,
983
986
  'countdownCancelAll': 1,
984
987
  'countdownCancelAllHeartBeat': 10,
988
+ 'block/order/create': 5,
989
+ 'block/order/execute': 5,
985
990
  },
986
991
  'put': {
987
992
  'listenKey': 1,
993
+ 'block/order/create': 5,
988
994
  },
989
995
  'delete': {
990
996
  'order': 1,
@@ -992,6 +998,7 @@ class binance(Exchange, ImplicitAPI):
992
998
  'allOpenOrders': 1,
993
999
  'allOpenOrdersByUnderlying': 1,
994
1000
  'listenKey': 1,
1001
+ 'block/order/create': 5,
995
1002
  },
996
1003
  },
997
1004
  'public': {
ccxt/kraken.py CHANGED
@@ -1436,7 +1436,7 @@ class kraken(Exchange, ImplicitAPI):
1436
1436
  # {
1437
1437
  # "error": [],
1438
1438
  # "result": {
1439
- # "descr": {order: 'buy 0.02100000 ETHUSDT @ limit 330.00'},
1439
+ # "descr": {order: 'buy 0.02100000 ETHUSDT @ limit 330.00'}, # see more examples in "parseOrder"
1440
1440
  # "txid": ['OEKVV2-IH52O-TPL6GZ']
1441
1441
  # }
1442
1442
  # }
@@ -1496,9 +1496,10 @@ class kraken(Exchange, ImplicitAPI):
1496
1496
 
1497
1497
  def parse_order_type(self, status):
1498
1498
  statuses: dict = {
1499
+ # we dont add "space" delimited orders here(eg. stop loss) because they need separate parsing
1499
1500
  'take-profit': 'market',
1500
- 'stop-loss-limit': 'limit',
1501
1501
  'stop-loss': 'market',
1502
+ 'stop-loss-limit': 'limit',
1502
1503
  'take-profit-limit': 'limit',
1503
1504
  'trailing-stop-limit': 'limit',
1504
1505
  }
@@ -1506,30 +1507,19 @@ class kraken(Exchange, ImplicitAPI):
1506
1507
 
1507
1508
  def parse_order(self, order: dict, market: Market = None) -> Order:
1508
1509
  #
1509
- # createOrder for regular orders
1510
+ # createOrder
1510
1511
  #
1511
1512
  # {
1512
- # "descr": {order: 'buy 0.02100000 ETHUSDT @ limit 330.00'},
1513
+ # "descr": {
1514
+ # "order": "buy 0.02100000 ETHUSDT @ limit 330.00" # limit orders
1515
+ # "buy 0.12345678 ETHUSDT @ market" # market order
1516
+ # "sell 0.28002676 ETHUSDT @ stop loss 0.0123 -> limit 0.0.1222" # stop order
1517
+ # "sell 0.00100000 ETHUSDT @ stop loss 2677.00 -> limit 2577.00 with 5:1 leverage"
1518
+ # "buy 0.10000000 LTCUSDT @ take profit 75.00000 -> limit 74.00000"
1519
+ # "sell 10.00000000 XRPEUR @ trailing stop +50.0000%" # trailing stop
1520
+ # },
1513
1521
  # "txid": ['OEKVV2-IH52O-TPL6GZ']
1514
1522
  # }
1515
- # {
1516
- # "txid": ["TX_ID_HERE"],
1517
- # "descr": {"order":"buy 0.12345678 ETHEUR @ market"},
1518
- # }
1519
- #
1520
- #
1521
- # createOrder for stop orders
1522
- #
1523
- # {
1524
- # "txid":["OSILNC-VQI5Q-775ZDQ"],
1525
- # "descr":{"order":"sell 167.28002676 ADAXBT @ stop loss 0.00003280 -> limit 0.00003212"}
1526
- # }
1527
- #
1528
- #
1529
- # {
1530
- # "txid":["OVHMJV-BZW2V-6NZFWF"],
1531
- # "descr":{"order":"sell 0.00100000 ETHUSD @ stop loss 2677.00 -> limit 2577.00 with 5:1 leverage"}
1532
- # }
1533
1523
  #
1534
1524
  # editOrder
1535
1525
  #
@@ -1607,24 +1597,29 @@ class kraken(Exchange, ImplicitAPI):
1607
1597
  else:
1608
1598
  orderDescription = self.safe_string(order, 'descr')
1609
1599
  side = None
1610
- type = None
1600
+ rawType = None
1611
1601
  marketId = None
1612
1602
  price = None
1613
1603
  amount = None
1614
- stopPrice = None
1604
+ triggerPrice = None
1615
1605
  if orderDescription is not None:
1616
1606
  parts = orderDescription.split(' ')
1617
1607
  side = self.safe_string(parts, 0)
1618
1608
  amount = self.safe_string(parts, 1)
1619
1609
  marketId = self.safe_string(parts, 2)
1620
- type = self.safe_string(parts, 4)
1621
- if type == 'stop':
1622
- stopPrice = self.safe_string(parts, 6)
1610
+ part4 = self.safe_string(parts, 4)
1611
+ part5 = self.safe_string(parts, 5)
1612
+ if part4 == 'limit' or part4 == 'market':
1613
+ rawType = part4 # eg, limit, market
1614
+ else:
1615
+ rawType = part4 + ' ' + part5 # eg. stop loss, take profit, trailing stop
1616
+ if rawType == 'stop loss' or rawType == 'take profit':
1617
+ triggerPrice = self.safe_string(parts, 6)
1623
1618
  price = self.safe_string(parts, 9)
1624
- elif type == 'limit':
1619
+ elif rawType == 'limit':
1625
1620
  price = self.safe_string(parts, 5)
1626
1621
  side = self.safe_string(description, 'type', side)
1627
- type = self.safe_string(description, 'ordertype', type)
1622
+ rawType = self.safe_string(description, 'ordertype', rawType) # orderType has dash, e.g. trailing-stop
1628
1623
  marketId = self.safe_string(description, 'pair', marketId)
1629
1624
  foundMarket = self.find_market_by_altname_or_id(marketId)
1630
1625
  symbol = None
@@ -1676,15 +1671,28 @@ class kraken(Exchange, ImplicitAPI):
1676
1671
  trades.append(self.safe_trade({'id': rawTrade, 'orderId': id, 'symbol': symbol, 'info': {}}))
1677
1672
  else:
1678
1673
  trades.append(rawTrade)
1679
- stopPrice = self.omit_zero(self.safe_string(order, 'stopprice', stopPrice))
1674
+ # in #24192 PR, self field is not something consistent/actual
1675
+ # triggerPrice = self.omit_zero(self.safe_string(order, 'stopprice', triggerPrice))
1680
1676
  stopLossPrice = None
1681
1677
  takeProfitPrice = None
1682
- if type.startswith('take-profit'):
1678
+ # the dashed strings are not provided from fields(eg. fetch order)
1679
+ # while spaced strings from "order" sentence(when other fields not available)
1680
+ if rawType.startswith('take-profit'):
1683
1681
  takeProfitPrice = self.safe_string(description, 'price')
1684
1682
  price = self.omit_zero(self.safe_string(description, 'price2'))
1685
- elif type.startswith('stop-loss'):
1683
+ elif rawType.startswith('stop-loss'):
1686
1684
  stopLossPrice = self.safe_string(description, 'price')
1687
1685
  price = self.omit_zero(self.safe_string(description, 'price2'))
1686
+ elif rawType == 'take profit':
1687
+ takeProfitPrice = triggerPrice
1688
+ elif rawType == 'stop loss':
1689
+ stopLossPrice = triggerPrice
1690
+ finalType = self.parse_order_type(rawType)
1691
+ # unlike from endpoints which provide eg: "take-profit-limit"
1692
+ # for "space-delimited" orders we dont have market/limit suffixes, their format is
1693
+ # eg: `stop loss > limit 123`, so we need to parse them manually
1694
+ if self.in_array(finalType, ['stop loss', 'take profit']):
1695
+ finalType = 'market' if (price is None) else 'limit'
1688
1696
  return self.safe_order({
1689
1697
  'id': id,
1690
1698
  'clientOrderId': clientOrderId,
@@ -1694,13 +1702,13 @@ class kraken(Exchange, ImplicitAPI):
1694
1702
  'lastTradeTimestamp': None,
1695
1703
  'status': status,
1696
1704
  'symbol': symbol,
1697
- 'type': self.parse_order_type(type),
1705
+ 'type': finalType,
1698
1706
  'timeInForce': None,
1699
1707
  'postOnly': isPostOnly,
1700
1708
  'side': side,
1701
1709
  'price': price,
1702
- 'stopPrice': stopPrice,
1703
- 'triggerPrice': stopPrice,
1710
+ 'stopPrice': triggerPrice,
1711
+ 'triggerPrice': triggerPrice,
1704
1712
  'takeProfitPrice': takeProfitPrice,
1705
1713
  'stopLossPrice': stopLossPrice,
1706
1714
  'cost': None,
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.27'
7
+ __version__ = '4.4.28'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/binance.py CHANGED
@@ -3410,11 +3410,6 @@ class binance(ccxt.async_support.binance):
3410
3410
  if not self.is_empty(symbols):
3411
3411
  market = self.get_market_from_symbols(symbols)
3412
3412
  messageHash = '::' + ','.join(symbols)
3413
- marketTypeObject: dict = {}
3414
- if market is not None:
3415
- marketTypeObject['type'] = market['type']
3416
- marketTypeObject['subType'] = market['subType']
3417
- await self.authenticate(self.extend(marketTypeObject, params))
3418
3413
  type = None
3419
3414
  type, params = self.handle_market_type_and_params('watchPositions', market, params)
3420
3415
  if type == 'spot' or type == 'margin':
@@ -3425,6 +3420,10 @@ class binance(ccxt.async_support.binance):
3425
3420
  type = 'future'
3426
3421
  elif self.isInverse(type, subType):
3427
3422
  type = 'delivery'
3423
+ marketTypeObject: dict = {}
3424
+ marketTypeObject['type'] = type
3425
+ marketTypeObject['subType'] = subType
3426
+ await self.authenticate(self.extend(marketTypeObject, params))
3428
3427
  messageHash = type + ':positions' + messageHash
3429
3428
  isPortfolioMargin = None
3430
3429
  isPortfolioMargin, params = self.handle_option_and_params_2(params, 'watchPositions', 'papi', 'portfolioMargin', False)
ccxt/wavesexchange.py CHANGED
@@ -1442,6 +1442,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1442
1442
  def fetch_order(self, id: str, symbol: Str = None, params={}):
1443
1443
  """
1444
1444
  fetches information on an order made by the user
1445
+ :see: https://matcher.waves.exchange/api-docs/index.html#/status/getOrderStatusByPKAndIdWithSig
1445
1446
  :param str symbol: unified symbol of the market the order was made in
1446
1447
  :param dict [params]: extra parameters specific to the exchange API endpoint
1447
1448
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.4.27
3
+ Version: 4.4.28
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
@@ -273,13 +273,13 @@ console.log(version, Object.keys(exchanges));
273
273
 
274
274
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
275
275
 
276
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.27/dist/ccxt.browser.min.js
277
- * unpkg: https://unpkg.com/ccxt@4.4.27/dist/ccxt.browser.min.js
276
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.4.28/dist/ccxt.browser.min.js
277
+ * unpkg: https://unpkg.com/ccxt@4.4.28/dist/ccxt.browser.min.js
278
278
 
279
279
  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.
280
280
 
281
281
  ```HTML
282
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.27/dist/ccxt.browser.min.js"></script>
282
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.4.28/dist/ccxt.browser.min.js"></script>
283
283
  ```
284
284
 
285
285
  Creates a global `ccxt` object:
@@ -1,10 +1,10 @@
1
- ccxt/__init__.py,sha256=bYG5NVX1PeNwc9dahFA9rwV7-Vrv5SyQxbsnzwk2fQs,16586
1
+ ccxt/__init__.py,sha256=m1FFD2XTiPWujL_H7wux5dgcaeUbt-2BZn6R3JuoBjg,16586
2
2
  ccxt/ace.py,sha256=v7aDhXSxYH0Pk76RiuYERYyiApQTmNumxnHCl1gRI80,42398
3
- ccxt/alpaca.py,sha256=OkBCBel6HYOomWwp4Jpum-mnKYzWTNZWZQG2EACfg7M,66181
3
+ ccxt/alpaca.py,sha256=uMwc5pHi3uZ9C8P6urK1JFhXLxxccJGHeAxrR65NBrY,66538
4
4
  ccxt/ascendex.py,sha256=no-JhCEx-fQjLiQYHJWkgzqHL7d5WtGYyc1clTMQQVM,151655
5
5
  ccxt/bequant.py,sha256=XePxHZlKFJ-2FwVR9hIpdM-Ng9-ZnIhTjemMnap7H0Q,1154
6
6
  ccxt/bigone.py,sha256=FazMyFHol45Bu9p0bY3CpMIz_SYkf_kk5GStt4UNRiY,91369
7
- ccxt/binance.py,sha256=Dtgra0JSUXyiLdZJf5sUF2p7gUlV9RZXjOUCMdsEooA,661585
7
+ ccxt/binance.py,sha256=pkLESy_086BPc6WCKeFossKH3Y0RR2Cr_0cUP2rUqeQ,661929
8
8
  ccxt/binancecoinm.py,sha256=2nFh2PcLqhqQK1uuQjsZa0eFkP-ew3liJ01ctdHcCd4,1681
9
9
  ccxt/binanceus.py,sha256=IT0iDdiWKzRu2ZCUB56YGfaHxCuFEEV4xi40Tp6Emxc,9182
10
10
  ccxt/binanceusdm.py,sha256=yoCcFvGD4MFYkShMpArxk_eLm8RR2ugyYHLk5e2AV08,2611
@@ -71,7 +71,7 @@ ccxt/hyperliquid.py,sha256=eZwjW4Yniel1XnnH9ANVMmNQzXCU_KKaKP5Q8gTIXPM,124612
71
71
  ccxt/idex.py,sha256=2yiYt-w39o3gQs3-byp83GQYSD4DSlZTN1Ixieettt0,73307
72
72
  ccxt/independentreserve.py,sha256=q8wUCbDnhxc_JiOTS7xcGsLp_EdmZTMe3QvLVB6oB-0,37899
73
73
  ccxt/indodax.py,sha256=QPH7sQzhqOFwq6g_xCAMcgnrpVVRl49zf_uolywxuX8,54798
74
- ccxt/kraken.py,sha256=qOJz1jNl7wKqvonYdPCqWIbj7uKfsPY1qSVXllc5w6Y,135904
74
+ ccxt/kraken.py,sha256=kiPbHz6XQYsx22uNQDZVpxhOYhYeJwYS7AgVkX6wI84,137132
75
75
  ccxt/krakenfutures.py,sha256=dbreVGrjMD7AY6xai0eazuvnUpTXTD7wLDVT9VDD5Qk,119839
76
76
  ccxt/kucoin.py,sha256=MIwREJHgbZd_l5hfexCmibSj2aIe9LsWmHJMxuaYLFg,229641
77
77
  ccxt/kucoinfutures.py,sha256=I6cladqgxS2lUfcxBPgt8wrbzF7DQjAFnTJJVe4eIFM,139433
@@ -101,7 +101,7 @@ ccxt/tokocrypto.py,sha256=Lrw_ZKl9S_XbwapC85rrruHXOvoxFq_-ZKbHEBaGMEo,123226
101
101
  ccxt/tradeogre.py,sha256=YoSQQl4jHI2JJShR0k_liI0dCntDdnHDqZmc5a-y7-w,24168
102
102
  ccxt/upbit.py,sha256=JXHH1lG8QCWr7C_E3SWaEaIrk_rpF6NwYDEjcYGHcKE,85546
103
103
  ccxt/vertex.py,sha256=Noyl-spEMawfHqjAboVhDTAya4wrYvDxArY9PU8JKcM,122182
104
- ccxt/wavesexchange.py,sha256=glCVY38zAszPrHl6ORfUlAuxr9ZWYPYSjqO2NXzK5K8,115608
104
+ ccxt/wavesexchange.py,sha256=nW4A9P-rk_9Dpdf87FCOkGRuCoykTrFiNWwXvryWoho,115712
105
105
  ccxt/wazirx.py,sha256=aNKxEFog4dwFfl9Vwoqn8ta6EfpYwzgLo_CsfRDLKdc,53350
106
106
  ccxt/whitebit.py,sha256=sJj75AG4XYT0hAJFfMe3J_GPsq58UGJ3p8C0wgc5bo8,119634
107
107
  ccxt/woo.py,sha256=oWI8fSNqjASn28rxa2BjQMylxv0GTVQQQh4znYDsDrc,155425
@@ -116,10 +116,10 @@ ccxt/abstract/alpaca.py,sha256=1hWhEz1azaNZuSPR1bArGibJ2bB_ilAna7nXDpKtd6k,10797
116
116
  ccxt/abstract/ascendex.py,sha256=5A8Zgq77jsdHlEzlTW_2nDybUUVfNVVOu6BgY3TWqRM,11394
117
117
  ccxt/abstract/bequant.py,sha256=OTBtNu3DQeAqAC_Lbi0NePUs-ZQQllcLrVDI2G04nwQ,15601
118
118
  ccxt/abstract/bigone.py,sha256=ChHXrnz1zHqLHJn162SxjfgbO8ocQppy7lXWGsHEtcI,4887
119
- ccxt/abstract/binance.py,sha256=ODgrj2iZZ8tYwBViqU07Yp921Feror77DliMdU3NLg0,96980
120
- ccxt/abstract/binancecoinm.py,sha256=ODgrj2iZZ8tYwBViqU07Yp921Feror77DliMdU3NLg0,96980
121
- ccxt/abstract/binanceus.py,sha256=kRrVTJ-GeDuFiMWvxsDy-pzsUyTzTSlt3F0SY2mF71Q,103642
122
- ccxt/abstract/binanceusdm.py,sha256=ODgrj2iZZ8tYwBViqU07Yp921Feror77DliMdU3NLg0,96980
119
+ ccxt/abstract/binance.py,sha256=0AP-GY4ojGONFvV5Ge9-s4dDaNj8ZjmvSNVXi2RjCBE,97957
120
+ ccxt/abstract/binancecoinm.py,sha256=0AP-GY4ojGONFvV5Ge9-s4dDaNj8ZjmvSNVXi2RjCBE,97957
121
+ ccxt/abstract/binanceus.py,sha256=hKYY9Zc-xLZ-989OjHcq7BddotH3Ew3ZFnYViANW3rs,104619
122
+ ccxt/abstract/binanceusdm.py,sha256=0AP-GY4ojGONFvV5Ge9-s4dDaNj8ZjmvSNVXi2RjCBE,97957
123
123
  ccxt/abstract/bingx.py,sha256=EdmgcZNDZsycMzn8dbE-aRc-n3i2l_BtdKcYqxwtKA4,20830
124
124
  ccxt/abstract/bit2c.py,sha256=np6i756kSB5dO3Nj6POLKxkWkpYcsGg-4LS8BwPrizI,2830
125
125
  ccxt/abstract/bitbank.py,sha256=hrHsD7Uvtyy2o2lzCHau3-eNq16pnZ3-YDQ6Tq_sxYU,2735
@@ -220,13 +220,13 @@ ccxt/abstract/xt.py,sha256=JkWvsic3L2O968BCr9H5Wd5NIbRE9aTT2A-9WbAtl0c,27146
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=X-hCW0SdX3YKZWixDyW-O2211M58Rno8kKJ6quY7rw4,7183
223
- ccxt/async_support/__init__.py,sha256=7BzTbXk8dWrwLnLPdh32DOymgUR3x6oYuDEyq43ucJ4,16399
223
+ ccxt/async_support/__init__.py,sha256=hyLK6Hz5vrcRtiU_rgt0fsxHtCeN2WuhXmcqPfO4snA,16399
224
224
  ccxt/async_support/ace.py,sha256=zHojiir0FfcIUH7JzyCW2lQeBqMIlDCKS_BmwC0buxc,42622
225
- ccxt/async_support/alpaca.py,sha256=4m1IEDW5g23JlNBIQHfWt0JfTj17b4dfxtmXbxx1N5Y,66537
225
+ ccxt/async_support/alpaca.py,sha256=kXpQdiqlnZEC6xASULArdOSONGuggOKTOk76nknY0jE,66894
226
226
  ccxt/async_support/ascendex.py,sha256=srOTDYSWlKLd1p_RyIp0E4gZf1zcIDsn308tnqvG0mM,152468
227
227
  ccxt/async_support/bequant.py,sha256=bSsnySbxWEjgt-yH1HtyLfky1ypFpb_xKHf52Ru9h5I,1168
228
228
  ccxt/async_support/bigone.py,sha256=1vG3J6By9iv7ZDA1ar2zeG8bED4q-KI3RqUogpsdwvY,91823
229
- ccxt/async_support/binance.py,sha256=1vUh_2XU5tVxJp6DKSUVkegWZ7nTCJlLwpFQ2H5p41c,664438
229
+ ccxt/async_support/binance.py,sha256=yKP2IrqXcVK6S9zsw2GUwimoVKGcZtYGAxs5UOIglx0,664782
230
230
  ccxt/async_support/binancecoinm.py,sha256=9ICnDf1wzSr_SN8HXdjIoheiNmP6isQ8yHT-8a4yQ3Y,1719
231
231
  ccxt/async_support/binanceus.py,sha256=OnMcoIPXyNos7x3Lqerc0wmfPHsGYn7d6nF7tPEscu4,9196
232
232
  ccxt/async_support/binanceusdm.py,sha256=dEN2QxzfmfrQELFE_B8E5sLywnpogUq3R73jENVQMu0,2649
@@ -293,7 +293,7 @@ ccxt/async_support/hyperliquid.py,sha256=d6NpQjIScaAnK9pP_n5Z0tiHui5Oh-TUPDQYSe8
293
293
  ccxt/async_support/idex.py,sha256=kZiSqurgNeXRJC5CQmc_wyIMXn-6c1oL4lJL1PW1l8U,73783
294
294
  ccxt/async_support/independentreserve.py,sha256=3gzNdxXGdCm5JqGjE1vG6kTSsW2PWvCPE2xBgvqPW6s,38197
295
295
  ccxt/async_support/indodax.py,sha256=_7AbcJJmBSPMQ1E-mqOoQJXTjIXldItRMDFCdwhvFuA,55106
296
- ccxt/async_support/kraken.py,sha256=F1NRf8PFqrzM-XQzf81sjpAER8mz1aYIgP4M5kO_DfQ,136560
296
+ ccxt/async_support/kraken.py,sha256=TW6AndqTeLBxwhc4Apg4UnCpwx2tM-Imffy5rKLOdK8,137788
297
297
  ccxt/async_support/krakenfutures.py,sha256=Wcry7ar4Esbi_3Urp8LcnzPMsThN6KcdU6QN5YMxDCk,120327
298
298
  ccxt/async_support/kucoin.py,sha256=b9wO_v_ZoXspkdKfQ6KfBYReJ6_2kpvAYBvnzLot0u0,230802
299
299
  ccxt/async_support/kucoinfutures.py,sha256=nFgYl7bvdmlFW8KYwD1sR6pOVDQSUMwc1hjkR3R4qVI,140215
@@ -323,7 +323,7 @@ ccxt/async_support/tokocrypto.py,sha256=wHqN41XmrFlmy1CpNvb0yZnZvF8WQAZQ98wtwMHa
323
323
  ccxt/async_support/tradeogre.py,sha256=2WdZ9y6osj4usU2aF0Go7LzHyVb6MPRMk6p9uJoyjE0,24362
324
324
  ccxt/async_support/upbit.py,sha256=T1UUNP7VyzOZPheoxOnC5f6U_stotJAU_xQczyNrW6c,86028
325
325
  ccxt/async_support/vertex.py,sha256=L3SmnNn1YErT00VE--AWbLUjm7ZobPxgUmrO1dMViwU,122682
326
- ccxt/async_support/wavesexchange.py,sha256=Bv-d1iqoTsL-J9C8hMDqvzZl7-OhIDf4vhFBJgjbYrQ,116158
326
+ ccxt/async_support/wavesexchange.py,sha256=T9QgPFHKMYVQpBc26b91p7HWE7He4h67EW-6ExWn-u0,116262
327
327
  ccxt/async_support/wazirx.py,sha256=ZHahzytYKnpjbqz4BRT8cLngExQ8SChcdajdYHzqGE0,53652
328
328
  ccxt/async_support/whitebit.py,sha256=Wcwr9ksj07DidTTo0D2olNwgJCJC_g2qEaqwJRx7VN8,120284
329
329
  ccxt/async_support/woo.py,sha256=HAIt2USqBNNq4LnYpLjrYpYpxYZvHfFjSC0WeVaY4BA,156405
@@ -333,7 +333,7 @@ ccxt/async_support/yobit.py,sha256=gMA6Fy7hbcF6ztNBbuow_pW6cwui5n2TWE8RRKMmls0,5
333
333
  ccxt/async_support/zaif.py,sha256=-ZTr8M2JaIRCL90VrbCDXBMAsZwbiwsFChSQ2rWODuQ,29044
334
334
  ccxt/async_support/zonda.py,sha256=Z4gA6o0bF_4MarQ5KiR2Zwi2wpmOuZTHS1JChAtNWjo,83114
335
335
  ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
336
- ccxt/async_support/base/exchange.py,sha256=MaP4MLJhxCGVya-bUwoH-xIIX80zvgn2u2udXZ98QqI,115225
336
+ ccxt/async_support/base/exchange.py,sha256=Y0K7lw9N9SojRyXUgj-DVbsj0QV26oFQVn_Bj-AjKXU,115225
337
337
  ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
338
338
  ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
339
339
  ccxt/async_support/base/ws/aiohttp_client.py,sha256=5IEiT0elWI9a7Vr-KV0jgmlbpLJWBzIlrLaCkTKGaqY,5752
@@ -347,14 +347,14 @@ ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9produGjmB
347
347
  ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
348
348
  ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
349
349
  ccxt/base/errors.py,sha256=Pad-6ugvGUwhoYuKUliX-N7FTrcnKCQGFjsaq2tMn0I,4610
350
- ccxt/base/exchange.py,sha256=nsrO4IIT3oTSXfYxeGSFM12aeAOerYfLCSSECnngO6Q,304787
350
+ ccxt/base/exchange.py,sha256=yKu30cJRPiQrOcVrpQAjBDKU_K3bXZN8XL53aEuMe-o,304787
351
351
  ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
352
352
  ccxt/base/types.py,sha256=qB1o7NbC0Pg4Unmw26pDF5NNreZodEMHtCFQdqpvPJ8,10472
353
- ccxt/pro/__init__.py,sha256=BYfkpjabgrh5Capq-NLiNBRnPx__CuS4CMrZcwjg4DM,7925
353
+ ccxt/pro/__init__.py,sha256=Y2pzqUvYAMp5XNQmRG2eZrNXIPeQ5pD4L9Lxrdk-7DQ,7925
354
354
  ccxt/pro/alpaca.py,sha256=xh1yg1Ok-Zh_Mfx-MBjNrfJDs6MUU0exFfEj3GuQPC4,27631
355
355
  ccxt/pro/ascendex.py,sha256=QueLgISoIxgGSOta2W7En4pwAsEXbTP5q5ef4UjpTQQ,37524
356
356
  ccxt/pro/bequant.py,sha256=33OEUWBi4D9-2w8CmkwN3aF1qS-AlLqX3pxrWwNbXPY,1552
357
- ccxt/pro/binance.py,sha256=zbRh6yAOSFWVOu-Mi83VCFAmjPvYIj-5K1yqNlxfHRM,200372
357
+ ccxt/pro/binance.py,sha256=pew-WuqewaM8jlOASPjZm6iVu4Mf15q6rPnYZ0F3EF4,200313
358
358
  ccxt/pro/binancecoinm.py,sha256=LlgF4rXHHrsQMaklhTEzSiE6U9V25AjHHg_DRat7Mf0,1036
359
359
  ccxt/pro/binanceus.py,sha256=lcRxvQSJ5sJCx1FqzDI9PVOg_vvpFwwlZs4_8QkoPJ0,1995
360
360
  ccxt/pro/binanceusdm.py,sha256=lLdOv0d-lM-1wfCc_y_POb6GdmVIiX7PFzmKTWsVyNw,1512
@@ -655,8 +655,8 @@ ccxt/test/tests_async.py,sha256=8TdpWiswLAVMF85CVBfMRqt8lFByr1Su7w5IgZ_w72w,8620
655
655
  ccxt/test/tests_helpers.py,sha256=2MuN95nTNGgQ5fuk5NAJZxL_8ArphcDhIbcUjjazZn8,9854
656
656
  ccxt/test/tests_init.py,sha256=GodMIrJue4KBHHqD4vSPZxokPWpxbZIuEp19UdxlFAg,1166
657
657
  ccxt/test/tests_sync.py,sha256=EEc20Cjl7u-EJ6S-lR0VXJmjpX1ew-oRS7uYceVxQ4A,85249
658
- ccxt-4.4.27.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
659
- ccxt-4.4.27.dist-info/METADATA,sha256=p2qopmFmzzDc05fKUcJXzxGSaDjmfHYBObufbyCGPpc,114509
660
- ccxt-4.4.27.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
661
- ccxt-4.4.27.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
662
- ccxt-4.4.27.dist-info/RECORD,,
658
+ ccxt-4.4.28.dist-info/LICENSE.txt,sha256=EIb9221AhMHV7xF1_55STFdKTFsnJVJYkRpY2Lnvo5w,1068
659
+ ccxt-4.4.28.dist-info/METADATA,sha256=J8qJIKhSdDuvqQ5neCHX-1NvcC4uCzlR9ZIzIZp5w7c,114509
660
+ ccxt-4.4.28.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
661
+ ccxt-4.4.28.dist-info/top_level.txt,sha256=CkQDuCTDKNcImPV60t36G6MdYfxsAPNiSaEwifVoVMo,5
662
+ ccxt-4.4.28.dist-info/RECORD,,
File without changes