ccxt 4.4.26__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.
Files changed (103) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/alpaca.py +2 -0
  3. ccxt/abstract/binance.py +7 -0
  4. ccxt/abstract/binancecoinm.py +7 -0
  5. ccxt/abstract/binanceus.py +7 -0
  6. ccxt/abstract/binanceusdm.py +7 -0
  7. ccxt/abstract/hyperliquid.py +1 -1
  8. ccxt/ace.py +1 -1
  9. ccxt/alpaca.py +186 -6
  10. ccxt/ascendex.py +1 -1
  11. ccxt/async_support/__init__.py +1 -1
  12. ccxt/async_support/ace.py +1 -1
  13. ccxt/async_support/alpaca.py +186 -6
  14. ccxt/async_support/ascendex.py +1 -1
  15. ccxt/async_support/base/exchange.py +19 -1
  16. ccxt/async_support/bequant.py +1 -1
  17. ccxt/async_support/bigone.py +1 -1
  18. ccxt/async_support/binance.py +8 -1
  19. ccxt/async_support/binancecoinm.py +1 -1
  20. ccxt/async_support/binanceus.py +1 -1
  21. ccxt/async_support/binanceusdm.py +1 -1
  22. ccxt/async_support/bingx.py +23 -28
  23. ccxt/async_support/bit2c.py +1 -1
  24. ccxt/async_support/bitbank.py +1 -1
  25. ccxt/async_support/bitbns.py +1 -1
  26. ccxt/async_support/bitfinex.py +1 -1
  27. ccxt/async_support/bitfinex2.py +1 -1
  28. ccxt/async_support/bitflyer.py +1 -1
  29. ccxt/async_support/bitget.py +1 -1
  30. ccxt/async_support/bithumb.py +1 -1
  31. ccxt/async_support/bitmart.py +1 -1
  32. ccxt/async_support/bitmex.py +1 -1
  33. ccxt/async_support/bitopro.py +1 -1
  34. ccxt/async_support/bitrue.py +1 -1
  35. ccxt/async_support/bitso.py +1 -1
  36. ccxt/async_support/bitstamp.py +1 -1
  37. ccxt/async_support/bitteam.py +1 -1
  38. ccxt/async_support/bitvavo.py +1 -1
  39. ccxt/async_support/bl3p.py +1 -1
  40. ccxt/async_support/blockchaincom.py +1 -1
  41. ccxt/async_support/blofin.py +1 -1
  42. ccxt/async_support/btcalpha.py +1 -1
  43. ccxt/async_support/btcbox.py +1 -1
  44. ccxt/async_support/btcmarkets.py +1 -1
  45. ccxt/async_support/btcturk.py +1 -1
  46. ccxt/async_support/bybit.py +4 -1
  47. ccxt/async_support/coinbase.py +89 -11
  48. ccxt/async_support/coinex.py +1 -1
  49. ccxt/async_support/gate.py +20 -16
  50. ccxt/async_support/hyperliquid.py +19 -1
  51. ccxt/async_support/kraken.py +43 -35
  52. ccxt/async_support/lbank.py +97 -2
  53. ccxt/async_support/wavesexchange.py +14 -2
  54. ccxt/base/exchange.py +19 -1
  55. ccxt/bequant.py +1 -1
  56. ccxt/bigone.py +1 -1
  57. ccxt/binance.py +8 -1
  58. ccxt/binancecoinm.py +1 -1
  59. ccxt/binanceus.py +1 -1
  60. ccxt/binanceusdm.py +1 -1
  61. ccxt/bingx.py +23 -28
  62. ccxt/bit2c.py +1 -1
  63. ccxt/bitbank.py +1 -1
  64. ccxt/bitbns.py +1 -1
  65. ccxt/bitfinex.py +1 -1
  66. ccxt/bitfinex2.py +1 -1
  67. ccxt/bitflyer.py +1 -1
  68. ccxt/bitget.py +1 -1
  69. ccxt/bithumb.py +1 -1
  70. ccxt/bitmart.py +1 -1
  71. ccxt/bitmex.py +1 -1
  72. ccxt/bitopro.py +1 -1
  73. ccxt/bitrue.py +1 -1
  74. ccxt/bitso.py +1 -1
  75. ccxt/bitstamp.py +1 -1
  76. ccxt/bitteam.py +1 -1
  77. ccxt/bitvavo.py +1 -1
  78. ccxt/bl3p.py +1 -1
  79. ccxt/blockchaincom.py +1 -1
  80. ccxt/blofin.py +1 -1
  81. ccxt/btcalpha.py +1 -1
  82. ccxt/btcbox.py +1 -1
  83. ccxt/btcmarkets.py +1 -1
  84. ccxt/btcturk.py +1 -1
  85. ccxt/bybit.py +4 -1
  86. ccxt/coinbase.py +89 -11
  87. ccxt/coinex.py +1 -1
  88. ccxt/gate.py +20 -16
  89. ccxt/hyperliquid.py +19 -1
  90. ccxt/kraken.py +43 -35
  91. ccxt/lbank.py +97 -2
  92. ccxt/pro/__init__.py +1 -1
  93. ccxt/pro/binance.py +6 -7
  94. ccxt/pro/bybit.py +1 -1
  95. ccxt/pro/lbank.py +7 -4
  96. ccxt/pro/okx.py +1 -1
  97. ccxt/wavesexchange.py +14 -2
  98. ccxt-4.4.28.dist-info/METADATA +637 -0
  99. {ccxt-4.4.26.dist-info → ccxt-4.4.28.dist-info}/RECORD +102 -102
  100. ccxt-4.4.26.dist-info/METADATA +0 -636
  101. {ccxt-4.4.26.dist-info → ccxt-4.4.28.dist-info}/LICENSE.txt +0 -0
  102. {ccxt-4.4.26.dist-info → ccxt-4.4.28.dist-info}/WHEEL +0 -0
  103. {ccxt-4.4.26.dist-info → ccxt-4.4.28.dist-info}/top_level.txt +0 -0
ccxt/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.4.26'
25
+ __version__ = '4.4.28'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
ccxt/abstract/alpaca.py CHANGED
@@ -21,10 +21,12 @@ class ImplicitAPI:
21
21
  trader_private_get_v2_corporate_actions_announcements_id = traderPrivateGetV2CorporateActionsAnnouncementsId = Entry('v2/corporate_actions/announcements/{id}', ['trader', 'private'], 'GET', {})
22
22
  trader_private_get_v2_corporate_actions_announcements = traderPrivateGetV2CorporateActionsAnnouncements = Entry('v2/corporate_actions/announcements', ['trader', 'private'], 'GET', {})
23
23
  trader_private_get_v2_wallets = traderPrivateGetV2Wallets = Entry('v2/wallets', ['trader', 'private'], 'GET', {})
24
+ trader_private_get_v2_wallets_transfers = traderPrivateGetV2WalletsTransfers = Entry('v2/wallets/transfers', ['trader', 'private'], 'GET', {})
24
25
  trader_private_post_v2_orders = traderPrivatePostV2Orders = Entry('v2/orders', ['trader', 'private'], 'POST', {})
25
26
  trader_private_post_v2_watchlists = traderPrivatePostV2Watchlists = Entry('v2/watchlists', ['trader', 'private'], 'POST', {})
26
27
  trader_private_post_v2_watchlists_watchlist_id = traderPrivatePostV2WatchlistsWatchlistId = Entry('v2/watchlists/{watchlist_id}', ['trader', 'private'], 'POST', {})
27
28
  trader_private_post_v2_watchlists_by_name = traderPrivatePostV2WatchlistsByName = Entry('v2/watchlists:by_name', ['trader', 'private'], 'POST', {})
29
+ trader_private_post_v2_wallets_transfers = traderPrivatePostV2WalletsTransfers = Entry('v2/wallets/transfers', ['trader', 'private'], 'POST', {})
28
30
  trader_private_put_v2_watchlists_watchlist_id = traderPrivatePutV2WatchlistsWatchlistId = Entry('v2/watchlists/{watchlist_id}', ['trader', 'private'], 'PUT', {})
29
31
  trader_private_put_v2_watchlists_by_name = traderPrivatePutV2WatchlistsByName = Entry('v2/watchlists:by_name', ['trader', 'private'], 'PUT', {})
30
32
  trader_private_patch_v2_orders_order_id = traderPrivatePatchV2OrdersOrderId = Entry('v2/orders/{order_id}', ['trader', 'private'], 'PATCH', {})
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]]})
@@ -2,5 +2,5 @@ from ccxt.base.types import Entry
2
2
 
3
3
 
4
4
  class ImplicitAPI:
5
- public_post_info = publicPostInfo = Entry('info', 'public', 'POST', {'cost': 1})
5
+ public_post_info = publicPostInfo = Entry('info', 'public', 'POST', {'cost': 20, 'byType': {'l2Book': 2, 'allMids': 2, 'clearinghouseState': 2, 'orderStatus': 2, 'spotClearinghouseState': 2, 'exchangeStatus': 2}})
6
6
  private_post_exchange = privatePostExchange = Entry('exchange', 'private', 'POST', {'cost': 1})
ccxt/ace.py CHANGED
@@ -108,7 +108,7 @@ class ace(Exchange, ImplicitAPI):
108
108
  '1M': 31,
109
109
  },
110
110
  'urls': {
111
- 'logo': 'https://user-images.githubusercontent.com/1294454/216908003-fb314cf6-e66e-471c-b91d-1d86e4baaa90.jpg',
111
+ 'logo': 'https://github.com/user-attachments/assets/115f1e4a-0fd0-4b76-85d5-a49ebf64d1c8',
112
112
  'api': {
113
113
  'public': 'https://ace.io/polarisex',
114
114
  'private': 'https://ace.io/polarisex/open',
ccxt/alpaca.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.alpaca import ImplicitAPI
8
- from ccxt.base.types import Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
8
+ from ccxt.base.types import Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import PermissionDenied
@@ -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):
@@ -33,7 +34,7 @@ class alpaca(Exchange, ImplicitAPI):
33
34
  'hostname': 'alpaca.markets',
34
35
  'pro': True,
35
36
  'urls': {
36
- 'logo': 'https://user-images.githubusercontent.com/1294454/187234005-b864db3d-f1e3-447a-aaf9-a9fc7b955d07.jpg',
37
+ 'logo': 'https://github.com/user-attachments/assets/e9476df8-a450-4c3e-ab9a-1a7794219e1b',
37
38
  'www': 'https://alpaca.markets',
38
39
  'api': {
39
40
  'broker': 'https://broker-api.{hostname}',
@@ -66,8 +67,8 @@ class alpaca(Exchange, ImplicitAPI):
66
67
  'fetchCurrencies': False,
67
68
  'fetchDepositAddress': True,
68
69
  'fetchDepositAddressesByNetwork': False,
69
- 'fetchDeposits': False,
70
- 'fetchDepositsWithdrawals': False,
70
+ 'fetchDeposits': True,
71
+ 'fetchDepositsWithdrawals': True,
71
72
  'fetchFundingHistory': False,
72
73
  'fetchFundingRate': False,
73
74
  'fetchFundingRateHistory': False,
@@ -99,12 +100,12 @@ class alpaca(Exchange, ImplicitAPI):
99
100
  'fetchTransactionFees': False,
100
101
  'fetchTransactions': False,
101
102
  'fetchTransfers': False,
102
- 'fetchWithdrawals': False,
103
+ 'fetchWithdrawals': True,
103
104
  'sandbox': True,
104
105
  'setLeverage': False,
105
106
  'setMarginMode': False,
106
107
  'transfer': False,
107
- 'withdraw': False,
108
+ 'withdraw': True,
108
109
  },
109
110
  'api': {
110
111
  'broker': {
@@ -131,12 +132,14 @@ class alpaca(Exchange, ImplicitAPI):
131
132
  'v2/corporate_actions/announcements/{id}',
132
133
  'v2/corporate_actions/announcements',
133
134
  'v2/wallets',
135
+ 'v2/wallets/transfers',
134
136
  ],
135
137
  'post': [
136
138
  'v2/orders',
137
139
  'v2/watchlists',
138
140
  'v2/watchlists/{watchlist_id}',
139
141
  'v2/watchlists:by_name',
142
+ 'v2/wallets/transfers',
140
143
  ],
141
144
  'put': [
142
145
  'v2/watchlists/{watchlist_id}',
@@ -1286,6 +1289,183 @@ class alpaca(Exchange, ImplicitAPI):
1286
1289
  'tag': None,
1287
1290
  }
1288
1291
 
1292
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1293
+ """
1294
+ make a withdrawal
1295
+ :see: https://docs.alpaca.markets/reference/createcryptotransferforaccount
1296
+ :param str code: unified currency code
1297
+ :param float amount: the amount to withdraw
1298
+ :param str address: the address to withdraw to
1299
+ :param str tag: a memo for the transaction
1300
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1301
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1302
+ """
1303
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
1304
+ self.check_address(address)
1305
+ self.load_markets()
1306
+ currency = self.currency(code)
1307
+ if tag:
1308
+ address = address + ':' + tag
1309
+ request: dict = {
1310
+ 'asset': currency['id'],
1311
+ 'address': address,
1312
+ 'amount': self.number_to_string(amount),
1313
+ }
1314
+ response = self.traderPrivatePostV2WalletsTransfers(self.extend(request, params))
1315
+ #
1316
+ # {
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",
1326
+ # "status": "PROCESSING",
1327
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1328
+ # "network_fee": "4",
1329
+ # "fees": "0.1"
1330
+ # }
1331
+ #
1332
+ return self.parse_transaction(response, currency)
1333
+
1334
+ def fetch_transactions_helper(self, type, code, since, limit, params):
1335
+ self.load_markets()
1336
+ currency = None
1337
+ if code is not None:
1338
+ currency = self.currency(code)
1339
+ response = self.traderPrivateGetV2WalletsTransfers(params)
1340
+ #
1341
+ # {
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",
1351
+ # "status": "PROCESSING",
1352
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1353
+ # "network_fee": "4",
1354
+ # "fees": "0.1"
1355
+ # }
1356
+ #
1357
+ results = []
1358
+ for i in range(0, len(response)):
1359
+ entry = response[i]
1360
+ direction = self.safe_string(entry, 'direction')
1361
+ if direction == type:
1362
+ results.append(entry)
1363
+ elif type == 'BOTH':
1364
+ results.append(entry)
1365
+ return self.parse_transactions(results, currency, since, limit, params)
1366
+
1367
+ def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1368
+ """
1369
+ fetch history of deposits and withdrawals
1370
+ :see: https://docs.alpaca.markets/reference/listcryptofundingtransfers
1371
+ :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
1372
+ :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
1373
+ :param int [limit]: max number of deposit/withdrawals to return, default is None
1374
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1375
+ :returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1376
+ """
1377
+ return self.fetch_transactions_helper('BOTH', code, since, limit, params)
1378
+
1379
+ def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1380
+ """
1381
+ fetch all deposits made to an account
1382
+ :see: https://docs.alpaca.markets/reference/listcryptofundingtransfers
1383
+ :param str [code]: unified currency code
1384
+ :param int [since]: the earliest time in ms to fetch deposits for
1385
+ :param int [limit]: the maximum number of deposit structures to retrieve
1386
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1387
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
1388
+ """
1389
+ return self.fetch_transactions_helper('INCOMING', code, since, limit, params)
1390
+
1391
+ def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1392
+ """
1393
+ fetch all withdrawals made from an account
1394
+ :see: https://docs.alpaca.markets/reference/listcryptofundingtransfers
1395
+ :param str [code]: unified currency code
1396
+ :param int [since]: the earliest time in ms to fetch withdrawals for
1397
+ :param int [limit]: the maximum number of withdrawal structures to retrieve
1398
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1399
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
1400
+ """
1401
+ return self.fetch_transactions_helper('OUTGOING', code, since, limit, params)
1402
+
1403
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1404
+ #
1405
+ # {
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",
1415
+ # "status": "PROCESSING",
1416
+ # "created_at": "2024-11-07T02:39:01.775495Z",
1417
+ # "network_fee": "4",
1418
+ # "fees": "0.1"
1419
+ # }
1420
+ #
1421
+ datetime = self.safe_string(transaction, 'created_at')
1422
+ currencyId = self.safe_string(transaction, 'asset')
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)
1427
+ fee = {
1428
+ 'cost': self.parse_number(totalFee),
1429
+ 'currency': code,
1430
+ }
1431
+ return {
1432
+ 'info': transaction,
1433
+ 'id': self.safe_string(transaction, 'id'),
1434
+ 'txid': self.safe_string(transaction, 'tx_hash'),
1435
+ 'timestamp': self.parse8601(datetime),
1436
+ 'datetime': datetime,
1437
+ 'network': self.safe_string(transaction, 'chain'),
1438
+ 'address': self.safe_string(transaction, 'to_address'),
1439
+ 'addressTo': self.safe_string(transaction, 'to_address'),
1440
+ 'addressFrom': self.safe_string(transaction, 'from_address'),
1441
+ 'tag': None,
1442
+ 'tagTo': None,
1443
+ 'tagFrom': None,
1444
+ 'type': self.parse_transaction_type(self.safe_string(transaction, 'direction')),
1445
+ 'amount': self.safe_number(transaction, 'amount'),
1446
+ 'currency': code,
1447
+ 'status': self.parse_transaction_status(self.safe_string(transaction, 'status')),
1448
+ 'updated': None,
1449
+ 'fee': fee,
1450
+ 'comment': None,
1451
+ 'internal': None,
1452
+ }
1453
+
1454
+ def parse_transaction_status(self, status: Str):
1455
+ statuses: dict = {
1456
+ 'PROCESSING': 'pending',
1457
+ 'FAILED': 'failed',
1458
+ 'COMPLETE': 'ok',
1459
+ }
1460
+ return self.safe_string(statuses, status, status)
1461
+
1462
+ def parse_transaction_type(self, type):
1463
+ types: dict = {
1464
+ 'INCOMING': 'deposit',
1465
+ 'OUTGOING': 'withdrawal',
1466
+ }
1467
+ return self.safe_string(types, type, type)
1468
+
1289
1469
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1290
1470
  endpoint = '/' + self.implode_params(path, params)
1291
1471
  url = self.implode_hostname(self.urls['api'][api[0]])
ccxt/ascendex.py CHANGED
@@ -124,7 +124,7 @@ class ascendex(Exchange, ImplicitAPI):
124
124
  },
125
125
  'version': 'v2',
126
126
  'urls': {
127
- 'logo': 'https://user-images.githubusercontent.com/1294454/112027508-47984600-8b48-11eb-9e17-d26459cc36c6.jpg',
127
+ 'logo': 'https://github.com/user-attachments/assets/55bab6b9-d4ca-42a8-a0e6-fac81ae557f1',
128
128
  'api': {
129
129
  'rest': 'https://ascendex.com',
130
130
  },
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.26'
7
+ __version__ = '4.4.28'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
ccxt/async_support/ace.py CHANGED
@@ -108,7 +108,7 @@ class ace(Exchange, ImplicitAPI):
108
108
  '1M': 31,
109
109
  },
110
110
  'urls': {
111
- 'logo': 'https://user-images.githubusercontent.com/1294454/216908003-fb314cf6-e66e-471c-b91d-1d86e4baaa90.jpg',
111
+ 'logo': 'https://github.com/user-attachments/assets/115f1e4a-0fd0-4b76-85d5-a49ebf64d1c8',
112
112
  'api': {
113
113
  'public': 'https://ace.io/polarisex',
114
114
  'private': 'https://ace.io/polarisex/open',