ccxt 4.3.61__py2.py3-none-any.whl → 4.3.63__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 (69) hide show
  1. ccxt/__init__.py +2 -1
  2. ccxt/abstract/binance.py +5 -5
  3. ccxt/abstract/binancecoinm.py +5 -5
  4. ccxt/abstract/binanceus.py +5 -5
  5. ccxt/abstract/binanceusdm.py +5 -5
  6. ccxt/abstract/cryptocom.py +11 -0
  7. ccxt/abstract/woo.py +3 -0
  8. ccxt/ace.py +33 -15
  9. ccxt/async_support/__init__.py +2 -1
  10. ccxt/async_support/ace.py +33 -15
  11. ccxt/async_support/base/exchange.py +1 -1
  12. ccxt/async_support/base/ws/fast_client.py +2 -2
  13. ccxt/async_support/binance.py +43 -38
  14. ccxt/async_support/bingx.py +492 -184
  15. ccxt/async_support/bybit.py +1 -1
  16. ccxt/async_support/coinbaseinternational.py +1 -1
  17. ccxt/async_support/cryptocom.py +17 -2
  18. ccxt/async_support/mercado.py +5 -1
  19. ccxt/async_support/tradeogre.py +1 -1
  20. ccxt/async_support/woo.py +296 -81
  21. ccxt/async_support/xt.py +4 -4
  22. ccxt/base/errors.py +8 -1
  23. ccxt/base/exchange.py +8 -2
  24. ccxt/binance.py +43 -38
  25. ccxt/bingx.py +492 -184
  26. ccxt/bybit.py +1 -1
  27. ccxt/coinbaseinternational.py +1 -1
  28. ccxt/cryptocom.py +17 -2
  29. ccxt/mercado.py +5 -1
  30. ccxt/pro/__init__.py +1 -1
  31. ccxt/pro/alpaca.py +3 -3
  32. ccxt/pro/binance.py +58 -39
  33. ccxt/pro/bingx.py +2 -2
  34. ccxt/pro/bitfinex2.py +8 -6
  35. ccxt/pro/bitget.py +6 -3
  36. ccxt/pro/bitmex.py +1 -1
  37. ccxt/pro/bitopro.py +1 -1
  38. ccxt/pro/bitvavo.py +1 -1
  39. ccxt/pro/bybit.py +46 -23
  40. ccxt/pro/coinbaseexchange.py +2 -2
  41. ccxt/pro/coincheck.py +1 -1
  42. ccxt/pro/coinone.py +1 -1
  43. ccxt/pro/cryptocom.py +8 -3
  44. ccxt/pro/deribit.py +1 -1
  45. ccxt/pro/gate.py +8 -5
  46. ccxt/pro/hollaex.py +1 -1
  47. ccxt/pro/htx.py +6 -2
  48. ccxt/pro/hyperliquid.py +3 -3
  49. ccxt/pro/independentreserve.py +6 -4
  50. ccxt/pro/kraken.py +80 -7
  51. ccxt/pro/kucoin.py +1 -1
  52. ccxt/pro/mexc.py +1 -1
  53. ccxt/pro/okx.py +5 -5
  54. ccxt/pro/oxfun.py +1 -1
  55. ccxt/pro/phemex.py +1 -1
  56. ccxt/pro/poloniexfutures.py +5 -2
  57. ccxt/pro/upbit.py +1 -1
  58. ccxt/pro/vertex.py +2 -2
  59. ccxt/pro/whitebit.py +1 -1
  60. ccxt/pro/woo.py +1 -1
  61. ccxt/pro/woofipro.py +1 -1
  62. ccxt/tradeogre.py +1 -1
  63. ccxt/woo.py +296 -81
  64. ccxt/xt.py +4 -4
  65. {ccxt-4.3.61.dist-info → ccxt-4.3.63.dist-info}/METADATA +4 -4
  66. {ccxt-4.3.61.dist-info → ccxt-4.3.63.dist-info}/RECORD +69 -69
  67. {ccxt-4.3.61.dist-info → ccxt-4.3.63.dist-info}/LICENSE.txt +0 -0
  68. {ccxt-4.3.61.dist-info → ccxt-4.3.63.dist-info}/WHEEL +0 -0
  69. {ccxt-4.3.61.dist-info → ccxt-4.3.63.dist-info}/top_level.txt +0 -0
ccxt/__init__.py CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.3.61'
25
+ __version__ = '4.3.63'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -74,6 +74,7 @@ from ccxt.base.errors import RateLimitExceeded # noqa: F4
74
74
  from ccxt.base.errors import ExchangeNotAvailable # noqa: F401
75
75
  from ccxt.base.errors import OnMaintenance # noqa: F401
76
76
  from ccxt.base.errors import InvalidNonce # noqa: F401
77
+ from ccxt.base.errors import ChecksumError # noqa: F401
77
78
  from ccxt.base.errors import RequestTimeout # noqa: F401
78
79
  from ccxt.base.errors import BadResponse # noqa: F401
79
80
  from ccxt.base.errors import NullResponse # noqa: F401
ccxt/abstract/binance.py CHANGED
@@ -491,7 +491,7 @@ class ImplicitAPI:
491
491
  fapiprivate_get_forceorders = fapiPrivateGetForceOrders = Entry('forceOrders', 'fapiPrivate', 'GET', {'cost': 20, 'noSymbol': 50})
492
492
  fapiprivate_get_allorders = fapiPrivateGetAllOrders = Entry('allOrders', 'fapiPrivate', 'GET', {'cost': 5})
493
493
  fapiprivate_get_openorder = fapiPrivateGetOpenOrder = Entry('openOrder', 'fapiPrivate', 'GET', {'cost': 1})
494
- fapiprivate_get_openorders = fapiPrivateGetOpenOrders = Entry('openOrders', 'fapiPrivate', 'GET', {'cost': 1})
494
+ fapiprivate_get_openorders = fapiPrivateGetOpenOrders = Entry('openOrders', 'fapiPrivate', 'GET', {'cost': 1, 'noSymbol': 40})
495
495
  fapiprivate_get_order = fapiPrivateGetOrder = Entry('order', 'fapiPrivate', 'GET', {'cost': 1})
496
496
  fapiprivate_get_account = fapiPrivateGetAccount = Entry('account', 'fapiPrivate', 'GET', {'cost': 5})
497
497
  fapiprivate_get_balance = fapiPrivateGetBalance = Entry('balance', 'fapiPrivate', 'GET', {'cost': 5})
@@ -629,18 +629,18 @@ class ImplicitAPI:
629
629
  papi_get_ping = papiGetPing = Entry('ping', 'papi', 'GET', {'cost': 1})
630
630
  papi_get_um_order = papiGetUmOrder = Entry('um/order', 'papi', 'GET', {'cost': 1})
631
631
  papi_get_um_openorder = papiGetUmOpenOrder = Entry('um/openOrder', 'papi', 'GET', {'cost': 1})
632
- papi_get_um_openorders = papiGetUmOpenOrders = Entry('um/openOrders', 'papi', 'GET', {'cost': 1})
632
+ papi_get_um_openorders = papiGetUmOpenOrders = Entry('um/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
633
633
  papi_get_um_allorders = papiGetUmAllOrders = Entry('um/allOrders', 'papi', 'GET', {'cost': 5})
634
634
  papi_get_cm_order = papiGetCmOrder = Entry('cm/order', 'papi', 'GET', {'cost': 1})
635
635
  papi_get_cm_openorder = papiGetCmOpenOrder = Entry('cm/openOrder', 'papi', 'GET', {'cost': 1})
636
- papi_get_cm_openorders = papiGetCmOpenOrders = Entry('cm/openOrders', 'papi', 'GET', {'cost': 1})
636
+ papi_get_cm_openorders = papiGetCmOpenOrders = Entry('cm/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
637
637
  papi_get_cm_allorders = papiGetCmAllOrders = Entry('cm/allOrders', 'papi', 'GET', {'cost': 20})
638
638
  papi_get_um_conditional_openorder = papiGetUmConditionalOpenOrder = Entry('um/conditional/openOrder', 'papi', 'GET', {'cost': 1})
639
- papi_get_um_conditional_openorders = papiGetUmConditionalOpenOrders = Entry('um/conditional/openOrders', 'papi', 'GET', {'cost': 40})
639
+ papi_get_um_conditional_openorders = papiGetUmConditionalOpenOrders = Entry('um/conditional/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
640
640
  papi_get_um_conditional_orderhistory = papiGetUmConditionalOrderHistory = Entry('um/conditional/orderHistory', 'papi', 'GET', {'cost': 1})
641
641
  papi_get_um_conditional_allorders = papiGetUmConditionalAllOrders = Entry('um/conditional/allOrders', 'papi', 'GET', {'cost': 40})
642
642
  papi_get_cm_conditional_openorder = papiGetCmConditionalOpenOrder = Entry('cm/conditional/openOrder', 'papi', 'GET', {'cost': 1})
643
- papi_get_cm_conditional_openorders = papiGetCmConditionalOpenOrders = Entry('cm/conditional/openOrders', 'papi', 'GET', {'cost': 40})
643
+ papi_get_cm_conditional_openorders = papiGetCmConditionalOpenOrders = Entry('cm/conditional/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
644
644
  papi_get_cm_conditional_orderhistory = papiGetCmConditionalOrderHistory = Entry('cm/conditional/orderHistory', 'papi', 'GET', {'cost': 1})
645
645
  papi_get_cm_conditional_allorders = papiGetCmConditionalAllOrders = Entry('cm/conditional/allOrders', 'papi', 'GET', {'cost': 40})
646
646
  papi_get_margin_order = papiGetMarginOrder = Entry('margin/order', 'papi', 'GET', {'cost': 5})
@@ -491,7 +491,7 @@ class ImplicitAPI:
491
491
  fapiprivate_get_forceorders = fapiPrivateGetForceOrders = Entry('forceOrders', 'fapiPrivate', 'GET', {'cost': 20, 'noSymbol': 50})
492
492
  fapiprivate_get_allorders = fapiPrivateGetAllOrders = Entry('allOrders', 'fapiPrivate', 'GET', {'cost': 5})
493
493
  fapiprivate_get_openorder = fapiPrivateGetOpenOrder = Entry('openOrder', 'fapiPrivate', 'GET', {'cost': 1})
494
- fapiprivate_get_openorders = fapiPrivateGetOpenOrders = Entry('openOrders', 'fapiPrivate', 'GET', {'cost': 1})
494
+ fapiprivate_get_openorders = fapiPrivateGetOpenOrders = Entry('openOrders', 'fapiPrivate', 'GET', {'cost': 1, 'noSymbol': 40})
495
495
  fapiprivate_get_order = fapiPrivateGetOrder = Entry('order', 'fapiPrivate', 'GET', {'cost': 1})
496
496
  fapiprivate_get_account = fapiPrivateGetAccount = Entry('account', 'fapiPrivate', 'GET', {'cost': 5})
497
497
  fapiprivate_get_balance = fapiPrivateGetBalance = Entry('balance', 'fapiPrivate', 'GET', {'cost': 5})
@@ -629,18 +629,18 @@ class ImplicitAPI:
629
629
  papi_get_ping = papiGetPing = Entry('ping', 'papi', 'GET', {'cost': 1})
630
630
  papi_get_um_order = papiGetUmOrder = Entry('um/order', 'papi', 'GET', {'cost': 1})
631
631
  papi_get_um_openorder = papiGetUmOpenOrder = Entry('um/openOrder', 'papi', 'GET', {'cost': 1})
632
- papi_get_um_openorders = papiGetUmOpenOrders = Entry('um/openOrders', 'papi', 'GET', {'cost': 1})
632
+ papi_get_um_openorders = papiGetUmOpenOrders = Entry('um/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
633
633
  papi_get_um_allorders = papiGetUmAllOrders = Entry('um/allOrders', 'papi', 'GET', {'cost': 5})
634
634
  papi_get_cm_order = papiGetCmOrder = Entry('cm/order', 'papi', 'GET', {'cost': 1})
635
635
  papi_get_cm_openorder = papiGetCmOpenOrder = Entry('cm/openOrder', 'papi', 'GET', {'cost': 1})
636
- papi_get_cm_openorders = papiGetCmOpenOrders = Entry('cm/openOrders', 'papi', 'GET', {'cost': 1})
636
+ papi_get_cm_openorders = papiGetCmOpenOrders = Entry('cm/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
637
637
  papi_get_cm_allorders = papiGetCmAllOrders = Entry('cm/allOrders', 'papi', 'GET', {'cost': 20})
638
638
  papi_get_um_conditional_openorder = papiGetUmConditionalOpenOrder = Entry('um/conditional/openOrder', 'papi', 'GET', {'cost': 1})
639
- papi_get_um_conditional_openorders = papiGetUmConditionalOpenOrders = Entry('um/conditional/openOrders', 'papi', 'GET', {'cost': 40})
639
+ papi_get_um_conditional_openorders = papiGetUmConditionalOpenOrders = Entry('um/conditional/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
640
640
  papi_get_um_conditional_orderhistory = papiGetUmConditionalOrderHistory = Entry('um/conditional/orderHistory', 'papi', 'GET', {'cost': 1})
641
641
  papi_get_um_conditional_allorders = papiGetUmConditionalAllOrders = Entry('um/conditional/allOrders', 'papi', 'GET', {'cost': 40})
642
642
  papi_get_cm_conditional_openorder = papiGetCmConditionalOpenOrder = Entry('cm/conditional/openOrder', 'papi', 'GET', {'cost': 1})
643
- papi_get_cm_conditional_openorders = papiGetCmConditionalOpenOrders = Entry('cm/conditional/openOrders', 'papi', 'GET', {'cost': 40})
643
+ papi_get_cm_conditional_openorders = papiGetCmConditionalOpenOrders = Entry('cm/conditional/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
644
644
  papi_get_cm_conditional_orderhistory = papiGetCmConditionalOrderHistory = Entry('cm/conditional/orderHistory', 'papi', 'GET', {'cost': 1})
645
645
  papi_get_cm_conditional_allorders = papiGetCmConditionalAllOrders = Entry('cm/conditional/allOrders', 'papi', 'GET', {'cost': 40})
646
646
  papi_get_margin_order = papiGetMarginOrder = Entry('margin/order', 'papi', 'GET', {'cost': 5})
@@ -543,7 +543,7 @@ class ImplicitAPI:
543
543
  fapiprivate_get_forceorders = fapiPrivateGetForceOrders = Entry('forceOrders', 'fapiPrivate', 'GET', {'cost': 20, 'noSymbol': 50})
544
544
  fapiprivate_get_allorders = fapiPrivateGetAllOrders = Entry('allOrders', 'fapiPrivate', 'GET', {'cost': 5})
545
545
  fapiprivate_get_openorder = fapiPrivateGetOpenOrder = Entry('openOrder', 'fapiPrivate', 'GET', {'cost': 1})
546
- fapiprivate_get_openorders = fapiPrivateGetOpenOrders = Entry('openOrders', 'fapiPrivate', 'GET', {'cost': 1})
546
+ fapiprivate_get_openorders = fapiPrivateGetOpenOrders = Entry('openOrders', 'fapiPrivate', 'GET', {'cost': 1, 'noSymbol': 40})
547
547
  fapiprivate_get_order = fapiPrivateGetOrder = Entry('order', 'fapiPrivate', 'GET', {'cost': 1})
548
548
  fapiprivate_get_account = fapiPrivateGetAccount = Entry('account', 'fapiPrivate', 'GET', {'cost': 5})
549
549
  fapiprivate_get_balance = fapiPrivateGetBalance = Entry('balance', 'fapiPrivate', 'GET', {'cost': 5})
@@ -681,18 +681,18 @@ class ImplicitAPI:
681
681
  papi_get_ping = papiGetPing = Entry('ping', 'papi', 'GET', {'cost': 1})
682
682
  papi_get_um_order = papiGetUmOrder = Entry('um/order', 'papi', 'GET', {'cost': 1})
683
683
  papi_get_um_openorder = papiGetUmOpenOrder = Entry('um/openOrder', 'papi', 'GET', {'cost': 1})
684
- papi_get_um_openorders = papiGetUmOpenOrders = Entry('um/openOrders', 'papi', 'GET', {'cost': 1})
684
+ papi_get_um_openorders = papiGetUmOpenOrders = Entry('um/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
685
685
  papi_get_um_allorders = papiGetUmAllOrders = Entry('um/allOrders', 'papi', 'GET', {'cost': 5})
686
686
  papi_get_cm_order = papiGetCmOrder = Entry('cm/order', 'papi', 'GET', {'cost': 1})
687
687
  papi_get_cm_openorder = papiGetCmOpenOrder = Entry('cm/openOrder', 'papi', 'GET', {'cost': 1})
688
- papi_get_cm_openorders = papiGetCmOpenOrders = Entry('cm/openOrders', 'papi', 'GET', {'cost': 1})
688
+ papi_get_cm_openorders = papiGetCmOpenOrders = Entry('cm/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
689
689
  papi_get_cm_allorders = papiGetCmAllOrders = Entry('cm/allOrders', 'papi', 'GET', {'cost': 20})
690
690
  papi_get_um_conditional_openorder = papiGetUmConditionalOpenOrder = Entry('um/conditional/openOrder', 'papi', 'GET', {'cost': 1})
691
- papi_get_um_conditional_openorders = papiGetUmConditionalOpenOrders = Entry('um/conditional/openOrders', 'papi', 'GET', {'cost': 40})
691
+ papi_get_um_conditional_openorders = papiGetUmConditionalOpenOrders = Entry('um/conditional/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
692
692
  papi_get_um_conditional_orderhistory = papiGetUmConditionalOrderHistory = Entry('um/conditional/orderHistory', 'papi', 'GET', {'cost': 1})
693
693
  papi_get_um_conditional_allorders = papiGetUmConditionalAllOrders = Entry('um/conditional/allOrders', 'papi', 'GET', {'cost': 40})
694
694
  papi_get_cm_conditional_openorder = papiGetCmConditionalOpenOrder = Entry('cm/conditional/openOrder', 'papi', 'GET', {'cost': 1})
695
- papi_get_cm_conditional_openorders = papiGetCmConditionalOpenOrders = Entry('cm/conditional/openOrders', 'papi', 'GET', {'cost': 40})
695
+ papi_get_cm_conditional_openorders = papiGetCmConditionalOpenOrders = Entry('cm/conditional/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
696
696
  papi_get_cm_conditional_orderhistory = papiGetCmConditionalOrderHistory = Entry('cm/conditional/orderHistory', 'papi', 'GET', {'cost': 1})
697
697
  papi_get_cm_conditional_allorders = papiGetCmConditionalAllOrders = Entry('cm/conditional/allOrders', 'papi', 'GET', {'cost': 40})
698
698
  papi_get_margin_order = papiGetMarginOrder = Entry('margin/order', 'papi', 'GET', {'cost': 5})
@@ -491,7 +491,7 @@ class ImplicitAPI:
491
491
  fapiprivate_get_forceorders = fapiPrivateGetForceOrders = Entry('forceOrders', 'fapiPrivate', 'GET', {'cost': 20, 'noSymbol': 50})
492
492
  fapiprivate_get_allorders = fapiPrivateGetAllOrders = Entry('allOrders', 'fapiPrivate', 'GET', {'cost': 5})
493
493
  fapiprivate_get_openorder = fapiPrivateGetOpenOrder = Entry('openOrder', 'fapiPrivate', 'GET', {'cost': 1})
494
- fapiprivate_get_openorders = fapiPrivateGetOpenOrders = Entry('openOrders', 'fapiPrivate', 'GET', {'cost': 1})
494
+ fapiprivate_get_openorders = fapiPrivateGetOpenOrders = Entry('openOrders', 'fapiPrivate', 'GET', {'cost': 1, 'noSymbol': 40})
495
495
  fapiprivate_get_order = fapiPrivateGetOrder = Entry('order', 'fapiPrivate', 'GET', {'cost': 1})
496
496
  fapiprivate_get_account = fapiPrivateGetAccount = Entry('account', 'fapiPrivate', 'GET', {'cost': 5})
497
497
  fapiprivate_get_balance = fapiPrivateGetBalance = Entry('balance', 'fapiPrivate', 'GET', {'cost': 5})
@@ -629,18 +629,18 @@ class ImplicitAPI:
629
629
  papi_get_ping = papiGetPing = Entry('ping', 'papi', 'GET', {'cost': 1})
630
630
  papi_get_um_order = papiGetUmOrder = Entry('um/order', 'papi', 'GET', {'cost': 1})
631
631
  papi_get_um_openorder = papiGetUmOpenOrder = Entry('um/openOrder', 'papi', 'GET', {'cost': 1})
632
- papi_get_um_openorders = papiGetUmOpenOrders = Entry('um/openOrders', 'papi', 'GET', {'cost': 1})
632
+ papi_get_um_openorders = papiGetUmOpenOrders = Entry('um/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
633
633
  papi_get_um_allorders = papiGetUmAllOrders = Entry('um/allOrders', 'papi', 'GET', {'cost': 5})
634
634
  papi_get_cm_order = papiGetCmOrder = Entry('cm/order', 'papi', 'GET', {'cost': 1})
635
635
  papi_get_cm_openorder = papiGetCmOpenOrder = Entry('cm/openOrder', 'papi', 'GET', {'cost': 1})
636
- papi_get_cm_openorders = papiGetCmOpenOrders = Entry('cm/openOrders', 'papi', 'GET', {'cost': 1})
636
+ papi_get_cm_openorders = papiGetCmOpenOrders = Entry('cm/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
637
637
  papi_get_cm_allorders = papiGetCmAllOrders = Entry('cm/allOrders', 'papi', 'GET', {'cost': 20})
638
638
  papi_get_um_conditional_openorder = papiGetUmConditionalOpenOrder = Entry('um/conditional/openOrder', 'papi', 'GET', {'cost': 1})
639
- papi_get_um_conditional_openorders = papiGetUmConditionalOpenOrders = Entry('um/conditional/openOrders', 'papi', 'GET', {'cost': 40})
639
+ papi_get_um_conditional_openorders = papiGetUmConditionalOpenOrders = Entry('um/conditional/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
640
640
  papi_get_um_conditional_orderhistory = papiGetUmConditionalOrderHistory = Entry('um/conditional/orderHistory', 'papi', 'GET', {'cost': 1})
641
641
  papi_get_um_conditional_allorders = papiGetUmConditionalAllOrders = Entry('um/conditional/allOrders', 'papi', 'GET', {'cost': 40})
642
642
  papi_get_cm_conditional_openorder = papiGetCmConditionalOpenOrder = Entry('cm/conditional/openOrder', 'papi', 'GET', {'cost': 1})
643
- papi_get_cm_conditional_openorders = papiGetCmConditionalOpenOrders = Entry('cm/conditional/openOrders', 'papi', 'GET', {'cost': 40})
643
+ papi_get_cm_conditional_openorders = papiGetCmConditionalOpenOrders = Entry('cm/conditional/openOrders', 'papi', 'GET', {'cost': 1, 'noSymbol': 40})
644
644
  papi_get_cm_conditional_orderhistory = papiGetCmConditionalOrderHistory = Entry('cm/conditional/orderHistory', 'papi', 'GET', {'cost': 1})
645
645
  papi_get_cm_conditional_allorders = papiGetCmConditionalAllOrders = Entry('cm/conditional/allOrders', 'papi', 'GET', {'cost': 40})
646
646
  papi_get_margin_order = papiGetMarginOrder = Entry('margin/order', 'papi', 'GET', {'cost': 5})
@@ -11,6 +11,7 @@ class ImplicitAPI:
11
11
  v1_public_get_public_get_valuations = v1PublicGetPublicGetValuations = Entry('public/get-valuations', ['v1', 'public'], 'GET', {'cost': 1})
12
12
  v1_public_get_public_get_expired_settlement_price = v1PublicGetPublicGetExpiredSettlementPrice = Entry('public/get-expired-settlement-price', ['v1', 'public'], 'GET', {'cost': 3.3333333333333335})
13
13
  v1_public_get_public_get_insurance = v1PublicGetPublicGetInsurance = Entry('public/get-insurance', ['v1', 'public'], 'GET', {'cost': 1})
14
+ v1_public_post_public_staking_get_conversion_rate = v1PublicPostPublicStakingGetConversionRate = Entry('public/staking/get-conversion-rate', ['v1', 'public'], 'POST', {'cost': 2})
14
15
  v1_private_post_private_set_cancel_on_disconnect = v1PrivatePostPrivateSetCancelOnDisconnect = Entry('private/set-cancel-on-disconnect', ['v1', 'private'], 'POST', {'cost': 3.3333333333333335})
15
16
  v1_private_post_private_get_cancel_on_disconnect = v1PrivatePostPrivateGetCancelOnDisconnect = Entry('private/get-cancel-on-disconnect', ['v1', 'private'], 'POST', {'cost': 3.3333333333333335})
16
17
  v1_private_post_private_user_balance = v1PrivatePostPrivateUserBalance = Entry('private/user-balance', ['v1', 'private'], 'POST', {'cost': 3.3333333333333335})
@@ -37,6 +38,16 @@ class ImplicitAPI:
37
38
  v1_private_post_private_get_accounts = v1PrivatePostPrivateGetAccounts = Entry('private/get-accounts', ['v1', 'private'], 'POST', {'cost': 3.3333333333333335})
38
39
  v1_private_post_private_get_withdrawal_history = v1PrivatePostPrivateGetWithdrawalHistory = Entry('private/get-withdrawal-history', ['v1', 'private'], 'POST', {'cost': 3.3333333333333335})
39
40
  v1_private_post_private_get_deposit_history = v1PrivatePostPrivateGetDepositHistory = Entry('private/get-deposit-history', ['v1', 'private'], 'POST', {'cost': 3.3333333333333335})
41
+ v1_private_post_private_staking_stake = v1PrivatePostPrivateStakingStake = Entry('private/staking/stake', ['v1', 'private'], 'POST', {'cost': 2})
42
+ v1_private_post_private_staking_unstake = v1PrivatePostPrivateStakingUnstake = Entry('private/staking/unstake', ['v1', 'private'], 'POST', {'cost': 2})
43
+ v1_private_post_private_staking_get_staking_position = v1PrivatePostPrivateStakingGetStakingPosition = Entry('private/staking/get-staking-position', ['v1', 'private'], 'POST', {'cost': 2})
44
+ v1_private_post_private_staking_get_staking_instruments = v1PrivatePostPrivateStakingGetStakingInstruments = Entry('private/staking/get-staking-instruments', ['v1', 'private'], 'POST', {'cost': 2})
45
+ v1_private_post_private_staking_get_open_stake = v1PrivatePostPrivateStakingGetOpenStake = Entry('private/staking/get-open-stake', ['v1', 'private'], 'POST', {'cost': 2})
46
+ v1_private_post_private_staking_get_stake_history = v1PrivatePostPrivateStakingGetStakeHistory = Entry('private/staking/get-stake-history', ['v1', 'private'], 'POST', {'cost': 2})
47
+ v1_private_post_private_staking_get_reward_history = v1PrivatePostPrivateStakingGetRewardHistory = Entry('private/staking/get-reward-history', ['v1', 'private'], 'POST', {'cost': 2})
48
+ v1_private_post_private_staking_convert = v1PrivatePostPrivateStakingConvert = Entry('private/staking/convert', ['v1', 'private'], 'POST', {'cost': 2})
49
+ v1_private_post_private_staking_get_open_convert = v1PrivatePostPrivateStakingGetOpenConvert = Entry('private/staking/get-open-convert', ['v1', 'private'], 'POST', {'cost': 2})
50
+ v1_private_post_private_staking_get_convert_history = v1PrivatePostPrivateStakingGetConvertHistory = Entry('private/staking/get-convert-history', ['v1', 'private'], 'POST', {'cost': 2})
40
51
  v2_public_get_public_auth = v2PublicGetPublicAuth = Entry('public/auth', ['v2', 'public'], 'GET', {'cost': 1})
41
52
  v2_public_get_public_get_instruments = v2PublicGetPublicGetInstruments = Entry('public/get-instruments', ['v2', 'public'], 'GET', {'cost': 1})
42
53
  v2_public_get_public_get_book = v2PublicGetPublicGetBook = Entry('public/get-book', ['v2', 'public'], 'GET', {'cost': 1})
ccxt/abstract/woo.py CHANGED
@@ -42,6 +42,7 @@ class ImplicitAPI:
42
42
  v1_private_get_positions = v1PrivateGetPositions = Entry('positions', ['v1', 'private'], 'GET', {'cost': 3.33})
43
43
  v1_private_get_position_symbol = v1PrivateGetPositionSymbol = Entry('position/{symbol}', ['v1', 'private'], 'GET', {'cost': 3.33})
44
44
  v1_private_get_client_transaction_history = v1PrivateGetClientTransactionHistory = Entry('client/transaction_history', ['v1', 'private'], 'GET', {'cost': 60})
45
+ v1_private_get_client_futures_leverage = v1PrivateGetClientFuturesLeverage = Entry('client/futures_leverage', ['v1', 'private'], 'GET', {'cost': 60})
45
46
  v1_private_post_order = v1PrivatePostOrder = Entry('order', ['v1', 'private'], 'POST', {'cost': 5})
46
47
  v1_private_post_order_cancel_all_after = v1PrivatePostOrderCancelAllAfter = Entry('order/cancel_all_after', ['v1', 'private'], 'POST', {'cost': 1})
47
48
  v1_private_post_asset_main_sub_transfer = v1PrivatePostAssetMainSubTransfer = Entry('asset/main_sub_transfer', ['v1', 'private'], 'POST', {'cost': 30})
@@ -52,6 +53,8 @@ class ImplicitAPI:
52
53
  v1_private_post_client_account_mode = v1PrivatePostClientAccountMode = Entry('client/account_mode', ['v1', 'private'], 'POST', {'cost': 120})
53
54
  v1_private_post_client_position_mode = v1PrivatePostClientPositionMode = Entry('client/position_mode', ['v1', 'private'], 'POST', {'cost': 5})
54
55
  v1_private_post_client_leverage = v1PrivatePostClientLeverage = Entry('client/leverage', ['v1', 'private'], 'POST', {'cost': 120})
56
+ v1_private_post_client_futures_leverage = v1PrivatePostClientFuturesLeverage = Entry('client/futures_leverage', ['v1', 'private'], 'POST', {'cost': 30})
57
+ v1_private_post_client_isolated_margin = v1PrivatePostClientIsolatedMargin = Entry('client/isolated_margin', ['v1', 'private'], 'POST', {'cost': 30})
55
58
  v1_private_delete_order = v1PrivateDeleteOrder = Entry('order', ['v1', 'private'], 'DELETE', {'cost': 1})
56
59
  v1_private_delete_client_order = v1PrivateDeleteClientOrder = Entry('client/order', ['v1', 'private'], 'DELETE', {'cost': 1})
57
60
  v1_private_delete_orders = v1PrivateDeleteOrders = Entry('orders', ['v1', 'private'], 'DELETE', {'cost': 1})
ccxt/ace.py CHANGED
@@ -203,10 +203,23 @@ class ace(Exchange, ImplicitAPI):
203
203
  return self.parse_markets(response)
204
204
 
205
205
  def parse_market(self, market: dict) -> Market:
206
- baseId = self.safe_string(market, 'base')
207
- base = self.safe_currency_code(baseId)
208
- quoteId = self.safe_string(market, 'quote')
209
- quote = self.safe_currency_code(quoteId)
206
+ #
207
+ # {
208
+ # "symbol": "ADA/TWD",
209
+ # "base": "ADA",
210
+ # "baseCurrencyId": "122",
211
+ # "quote": "TWD",
212
+ # "quoteCurrencyId": "1",
213
+ # "basePrecision": "2",
214
+ # "quotePrecision": "3",
215
+ # "minLimitBaseAmount": "1.0",
216
+ # "maxLimitBaseAmount": "150000.0"
217
+ # }
218
+ #
219
+ baseId = self.safe_string(market, 'baseCurrencyId')
220
+ base = self.safe_currency_code(self.safe_string(market, 'base'))
221
+ quoteId = self.safe_string(market, 'quoteCurrencyId')
222
+ quote = self.safe_currency_code(self.safe_string(market, 'quote'))
210
223
  symbol = base + '/' + quote
211
224
  return {
212
225
  'id': self.safe_string(market, 'symbol'),
@@ -304,7 +317,7 @@ class ace(Exchange, ImplicitAPI):
304
317
  market = self.market(symbol)
305
318
  response = self.publicGetOapiV2ListTradePrice(params)
306
319
  marketId = market['id']
307
- ticker = self.safe_value(response, marketId, {})
320
+ ticker = self.safe_dict(response, marketId, {})
308
321
  #
309
322
  # {
310
323
  # "BTC/USDT":{
@@ -340,7 +353,7 @@ class ace(Exchange, ImplicitAPI):
340
353
  for i in range(0, len(pairs)):
341
354
  marketId = pairs[i]
342
355
  market = self.safe_market(marketId)
343
- rawTicker = self.safe_value(response, marketId)
356
+ rawTicker = self.safe_dict(response, marketId)
344
357
  ticker = self.parse_ticker(rawTicker, market)
345
358
  tickers.append(ticker)
346
359
  return self.filter_by_array_tickers(tickers, 'symbol', symbols)
@@ -454,7 +467,7 @@ class ace(Exchange, ImplicitAPI):
454
467
  if since is not None:
455
468
  request['startTime'] = since
456
469
  response = self.privatePostV2KlineGetKline(self.extend(request, params))
457
- data = self.safe_value(response, 'attachment', [])
470
+ data = self.safe_list(response, 'attachment', [])
458
471
  #
459
472
  # {
460
473
  # "attachment":[
@@ -533,18 +546,18 @@ class ace(Exchange, ImplicitAPI):
533
546
  if dateTime is not None:
534
547
  timestamp = self.parse8601(dateTime)
535
548
  timestamp = timestamp - 28800000 # 8 hours
536
- orderSide = self.safe_number(order, 'buyOrSell')
549
+ orderSide = self.safe_string(order, 'buyOrSell')
537
550
  if orderSide is not None:
538
- side = 'buy' if (orderSide == 1) else 'sell'
551
+ side = 'buy' if (orderSide == '1') else 'sell'
539
552
  amount = self.safe_string(order, 'num')
540
553
  price = self.safe_string(order, 'price')
541
554
  quoteId = self.safe_string(order, 'quoteCurrencyName')
542
555
  baseId = self.safe_string(order, 'baseCurrencyName')
543
556
  if quoteId is not None and baseId is not None:
544
557
  symbol = baseId + '/' + quoteId
545
- orderType = self.safe_number(order, 'type')
558
+ orderType = self.safe_string(order, 'type')
546
559
  if orderType is not None:
547
- type = 'limit' if (orderType == 1) else 'market'
560
+ type = 'limit' if (orderType == '1') else 'market'
548
561
  filled = self.safe_string(order, 'tradeNum')
549
562
  remaining = self.safe_string(order, 'remainNum')
550
563
  status = self.parse_order_status(self.safe_string(order, 'status'))
@@ -694,7 +707,7 @@ class ace(Exchange, ImplicitAPI):
694
707
  if limit is not None:
695
708
  request['size'] = limit
696
709
  response = self.privatePostV2OrderGetOrderList(self.extend(request, params))
697
- orders = self.safe_value(response, 'attachment')
710
+ orders = self.safe_list(response, 'attachment')
698
711
  #
699
712
  # {
700
713
  # "attachment": [
@@ -851,7 +864,7 @@ class ace(Exchange, ImplicitAPI):
851
864
  # "status": 200
852
865
  # }
853
866
  #
854
- data = self.safe_value(response, 'attachment')
867
+ data = self.safe_dict(response, 'attachment')
855
868
  trades = self.safe_list(data, 'trades', [])
856
869
  return self.parse_trades(trades, market, since, limit)
857
870
 
@@ -947,7 +960,7 @@ class ace(Exchange, ImplicitAPI):
947
960
  """
948
961
  self.load_markets()
949
962
  response = self.privatePostV2CoinCustomerAccount(params)
950
- balances = self.safe_value(response, 'attachment', [])
963
+ balances = self.safe_list(response, 'attachment', [])
951
964
  #
952
965
  # {
953
966
  # "attachment":[
@@ -981,7 +994,12 @@ class ace(Exchange, ImplicitAPI):
981
994
  }, params)
982
995
  sortedData = self.keysort(data)
983
996
  values = list(sortedData.values())
984
- auth += ''.join(values)
997
+ stringifiedValues = []
998
+ for i in range(0, len(values)):
999
+ value = values[i]
1000
+ strValue = str(value)
1001
+ stringifiedValues.append(strValue)
1002
+ auth += ''.join(stringifiedValues)
985
1003
  signature = self.hash(self.encode(auth), 'sha256', 'hex')
986
1004
  data['signKey'] = signature
987
1005
  headers = {
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.3.61'
7
+ __version__ = '4.3.63'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -53,6 +53,7 @@ from ccxt.base.errors import RateLimitExceeded # noqa: F4
53
53
  from ccxt.base.errors import ExchangeNotAvailable # noqa: F401
54
54
  from ccxt.base.errors import OnMaintenance # noqa: F401
55
55
  from ccxt.base.errors import InvalidNonce # noqa: F401
56
+ from ccxt.base.errors import ChecksumError # noqa: F401
56
57
  from ccxt.base.errors import RequestTimeout # noqa: F401
57
58
  from ccxt.base.errors import BadResponse # noqa: F401
58
59
  from ccxt.base.errors import NullResponse # noqa: F401
ccxt/async_support/ace.py CHANGED
@@ -203,10 +203,23 @@ class ace(Exchange, ImplicitAPI):
203
203
  return self.parse_markets(response)
204
204
 
205
205
  def parse_market(self, market: dict) -> Market:
206
- baseId = self.safe_string(market, 'base')
207
- base = self.safe_currency_code(baseId)
208
- quoteId = self.safe_string(market, 'quote')
209
- quote = self.safe_currency_code(quoteId)
206
+ #
207
+ # {
208
+ # "symbol": "ADA/TWD",
209
+ # "base": "ADA",
210
+ # "baseCurrencyId": "122",
211
+ # "quote": "TWD",
212
+ # "quoteCurrencyId": "1",
213
+ # "basePrecision": "2",
214
+ # "quotePrecision": "3",
215
+ # "minLimitBaseAmount": "1.0",
216
+ # "maxLimitBaseAmount": "150000.0"
217
+ # }
218
+ #
219
+ baseId = self.safe_string(market, 'baseCurrencyId')
220
+ base = self.safe_currency_code(self.safe_string(market, 'base'))
221
+ quoteId = self.safe_string(market, 'quoteCurrencyId')
222
+ quote = self.safe_currency_code(self.safe_string(market, 'quote'))
210
223
  symbol = base + '/' + quote
211
224
  return {
212
225
  'id': self.safe_string(market, 'symbol'),
@@ -304,7 +317,7 @@ class ace(Exchange, ImplicitAPI):
304
317
  market = self.market(symbol)
305
318
  response = await self.publicGetOapiV2ListTradePrice(params)
306
319
  marketId = market['id']
307
- ticker = self.safe_value(response, marketId, {})
320
+ ticker = self.safe_dict(response, marketId, {})
308
321
  #
309
322
  # {
310
323
  # "BTC/USDT":{
@@ -340,7 +353,7 @@ class ace(Exchange, ImplicitAPI):
340
353
  for i in range(0, len(pairs)):
341
354
  marketId = pairs[i]
342
355
  market = self.safe_market(marketId)
343
- rawTicker = self.safe_value(response, marketId)
356
+ rawTicker = self.safe_dict(response, marketId)
344
357
  ticker = self.parse_ticker(rawTicker, market)
345
358
  tickers.append(ticker)
346
359
  return self.filter_by_array_tickers(tickers, 'symbol', symbols)
@@ -454,7 +467,7 @@ class ace(Exchange, ImplicitAPI):
454
467
  if since is not None:
455
468
  request['startTime'] = since
456
469
  response = await self.privatePostV2KlineGetKline(self.extend(request, params))
457
- data = self.safe_value(response, 'attachment', [])
470
+ data = self.safe_list(response, 'attachment', [])
458
471
  #
459
472
  # {
460
473
  # "attachment":[
@@ -533,18 +546,18 @@ class ace(Exchange, ImplicitAPI):
533
546
  if dateTime is not None:
534
547
  timestamp = self.parse8601(dateTime)
535
548
  timestamp = timestamp - 28800000 # 8 hours
536
- orderSide = self.safe_number(order, 'buyOrSell')
549
+ orderSide = self.safe_string(order, 'buyOrSell')
537
550
  if orderSide is not None:
538
- side = 'buy' if (orderSide == 1) else 'sell'
551
+ side = 'buy' if (orderSide == '1') else 'sell'
539
552
  amount = self.safe_string(order, 'num')
540
553
  price = self.safe_string(order, 'price')
541
554
  quoteId = self.safe_string(order, 'quoteCurrencyName')
542
555
  baseId = self.safe_string(order, 'baseCurrencyName')
543
556
  if quoteId is not None and baseId is not None:
544
557
  symbol = baseId + '/' + quoteId
545
- orderType = self.safe_number(order, 'type')
558
+ orderType = self.safe_string(order, 'type')
546
559
  if orderType is not None:
547
- type = 'limit' if (orderType == 1) else 'market'
560
+ type = 'limit' if (orderType == '1') else 'market'
548
561
  filled = self.safe_string(order, 'tradeNum')
549
562
  remaining = self.safe_string(order, 'remainNum')
550
563
  status = self.parse_order_status(self.safe_string(order, 'status'))
@@ -694,7 +707,7 @@ class ace(Exchange, ImplicitAPI):
694
707
  if limit is not None:
695
708
  request['size'] = limit
696
709
  response = await self.privatePostV2OrderGetOrderList(self.extend(request, params))
697
- orders = self.safe_value(response, 'attachment')
710
+ orders = self.safe_list(response, 'attachment')
698
711
  #
699
712
  # {
700
713
  # "attachment": [
@@ -851,7 +864,7 @@ class ace(Exchange, ImplicitAPI):
851
864
  # "status": 200
852
865
  # }
853
866
  #
854
- data = self.safe_value(response, 'attachment')
867
+ data = self.safe_dict(response, 'attachment')
855
868
  trades = self.safe_list(data, 'trades', [])
856
869
  return self.parse_trades(trades, market, since, limit)
857
870
 
@@ -947,7 +960,7 @@ class ace(Exchange, ImplicitAPI):
947
960
  """
948
961
  await self.load_markets()
949
962
  response = await self.privatePostV2CoinCustomerAccount(params)
950
- balances = self.safe_value(response, 'attachment', [])
963
+ balances = self.safe_list(response, 'attachment', [])
951
964
  #
952
965
  # {
953
966
  # "attachment":[
@@ -981,7 +994,12 @@ class ace(Exchange, ImplicitAPI):
981
994
  }, params)
982
995
  sortedData = self.keysort(data)
983
996
  values = list(sortedData.values())
984
- auth += ''.join(values)
997
+ stringifiedValues = []
998
+ for i in range(0, len(values)):
999
+ value = values[i]
1000
+ strValue = str(value)
1001
+ stringifiedValues.append(strValue)
1002
+ auth += ''.join(stringifiedValues)
985
1003
  signature = self.hash(self.encode(auth), 'sha256', 'hex')
986
1004
  data['signKey'] = signature
987
1005
  headers = {
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.3.61'
5
+ __version__ = '4.3.63'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -35,7 +35,7 @@ class FastClient(AiohttpClient):
35
35
  self.stack.append(message)
36
36
 
37
37
  def feed_eof():
38
- if self._close_code == 1000: # OK close
38
+ if self.connection._close_code == 1000: # OK close
39
39
  self.on_close(1000)
40
40
  else:
41
41
  self.on_error(1006) # ABNORMAL_CLOSURE
@@ -58,7 +58,7 @@ class FastClient(AiohttpClient):
58
58
  try:
59
59
  await _self._writer.close(code, message)
60
60
  _self._response.close()
61
- self._close_code = 1000
61
+ _self._close_code = 1000
62
62
  except asyncio.CancelledError:
63
63
  _self._response.close()
64
64
  _self._close_code = 1006