ccxt 4.3.62__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 (46) 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/binance.py +6 -9
  13. ccxt/async_support/bingx.py +451 -151
  14. ccxt/async_support/coinbaseinternational.py +1 -1
  15. ccxt/async_support/cryptocom.py +17 -2
  16. ccxt/async_support/mercado.py +5 -1
  17. ccxt/async_support/woo.py +296 -81
  18. ccxt/async_support/xt.py +3 -3
  19. ccxt/base/errors.py +8 -1
  20. ccxt/base/exchange.py +8 -2
  21. ccxt/binance.py +6 -9
  22. ccxt/bingx.py +451 -151
  23. ccxt/coinbaseinternational.py +1 -1
  24. ccxt/cryptocom.py +17 -2
  25. ccxt/mercado.py +5 -1
  26. ccxt/pro/__init__.py +1 -1
  27. ccxt/pro/binance.py +56 -35
  28. ccxt/pro/bitfinex2.py +6 -4
  29. ccxt/pro/bitget.py +5 -2
  30. ccxt/pro/bitvavo.py +1 -1
  31. ccxt/pro/bybit.py +41 -18
  32. ccxt/pro/cryptocom.py +7 -2
  33. ccxt/pro/gate.py +6 -3
  34. ccxt/pro/htx.py +5 -1
  35. ccxt/pro/independentreserve.py +6 -4
  36. ccxt/pro/kraken.py +79 -6
  37. ccxt/pro/okx.py +4 -4
  38. ccxt/pro/poloniexfutures.py +5 -2
  39. ccxt/pro/woofipro.py +1 -1
  40. ccxt/woo.py +296 -81
  41. ccxt/xt.py +3 -3
  42. {ccxt-4.3.62.dist-info → ccxt-4.3.63.dist-info}/METADATA +4 -4
  43. {ccxt-4.3.62.dist-info → ccxt-4.3.63.dist-info}/RECORD +46 -46
  44. {ccxt-4.3.62.dist-info → ccxt-4.3.63.dist-info}/LICENSE.txt +0 -0
  45. {ccxt-4.3.62.dist-info → ccxt-4.3.63.dist-info}/WHEEL +0 -0
  46. {ccxt-4.3.62.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.62'
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.62'
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.62'
5
+ __version__ = '4.3.63'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -837,7 +837,7 @@ class binance(Exchange, ImplicitAPI):
837
837
  'forceOrders': {'cost': 20, 'noSymbol': 50},
838
838
  'allOrders': 5,
839
839
  'openOrder': 1,
840
- 'openOrders': 1,
840
+ 'openOrders': {'cost': 1, 'noSymbol': 40},
841
841
  'order': 1,
842
842
  'account': 5,
843
843
  'balance': 5,
@@ -1029,18 +1029,18 @@ class binance(Exchange, ImplicitAPI):
1029
1029
  'ping': 1,
1030
1030
  'um/order': 1, # 1
1031
1031
  'um/openOrder': 1, # 1
1032
- 'um/openOrders': 1, # 1
1032
+ 'um/openOrders': {'cost': 1, 'noSymbol': 40},
1033
1033
  'um/allOrders': 5, # 5
1034
1034
  'cm/order': 1, # 1
1035
1035
  'cm/openOrder': 1, # 1
1036
- 'cm/openOrders': 1, # 1
1036
+ 'cm/openOrders': {'cost': 1, 'noSymbol': 40},
1037
1037
  'cm/allOrders': 20, # 20
1038
1038
  'um/conditional/openOrder': 1,
1039
- 'um/conditional/openOrders': 40,
1039
+ 'um/conditional/openOrders': {'cost': 1, 'noSymbol': 40},
1040
1040
  'um/conditional/orderHistory': 1,
1041
1041
  'um/conditional/allOrders': 40,
1042
1042
  'cm/conditional/openOrder': 1,
1043
- 'cm/conditional/openOrders': 40,
1043
+ 'cm/conditional/openOrders': {'cost': 1, 'noSymbol': 40},
1044
1044
  'cm/conditional/orderHistory': 1,
1045
1045
  'cm/conditional/allOrders': 40,
1046
1046
  'margin/order': 5,
@@ -6202,10 +6202,7 @@ class binance(Exchange, ImplicitAPI):
6202
6202
  marketType = market['type'] if ('type' in market) else defaultType
6203
6203
  type = self.safe_string(params, 'type', marketType)
6204
6204
  elif self.options['warnOnFetchOpenOrdersWithoutSymbol']:
6205
- symbols = self.symbols
6206
- numSymbols = len(symbols)
6207
- fetchOpenOrdersRateLimit = self.parse_to_int(numSymbols / 2)
6208
- raise ExchangeError(self.id + ' fetchOpenOrders() WARNING: fetching open orders without specifying a symbol is rate-limited to one call per ' + str(fetchOpenOrdersRateLimit) + ' seconds. Do not call self method frequently to avoid ban. Set ' + self.id + '.options["warnOnFetchOpenOrdersWithoutSymbol"] = False to suppress self warning message.')
6205
+ raise ExchangeError(self.id + ' fetchOpenOrders() WARNING: fetching open orders without specifying a symbol has stricter rate limits(10 times more for spot, 40 times more for other markets) compared to requesting with symbol argument. To acknowledge self warning, set ' + self.id + '.options["warnOnFetchOpenOrdersWithoutSymbol"] = False to suppress self warning message.')
6209
6206
  else:
6210
6207
  defaultType = self.safe_string_2(self.options, 'fetchOpenOrders', 'defaultType', 'spot')
6211
6208
  type = self.safe_string(params, 'type', defaultType)