ccxt 4.3.53__py2.py3-none-any.whl → 4.3.55__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 (254) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/kucoin.py +3 -0
  3. ccxt/abstract/kucoinfutures.py +3 -0
  4. ccxt/ace.py +1 -1
  5. ccxt/alpaca.py +1 -1
  6. ccxt/ascendex.py +6 -4
  7. ccxt/async_support/__init__.py +1 -1
  8. ccxt/async_support/ace.py +1 -1
  9. ccxt/async_support/alpaca.py +1 -1
  10. ccxt/async_support/ascendex.py +6 -4
  11. ccxt/async_support/base/exchange.py +1 -1
  12. ccxt/async_support/bigone.py +1 -1
  13. ccxt/async_support/binance.py +6 -6
  14. ccxt/async_support/bingx.py +4 -4
  15. ccxt/async_support/bit2c.py +1 -1
  16. ccxt/async_support/bitbank.py +1 -1
  17. ccxt/async_support/bitbns.py +1 -1
  18. ccxt/async_support/bitfinex.py +1 -1
  19. ccxt/async_support/bitfinex2.py +1 -1
  20. ccxt/async_support/bitflyer.py +1 -1
  21. ccxt/async_support/bitget.py +2 -2
  22. ccxt/async_support/bithumb.py +1 -1
  23. ccxt/async_support/bitmart.py +3 -3
  24. ccxt/async_support/bitmex.py +1 -1
  25. ccxt/async_support/bitopro.py +1 -1
  26. ccxt/async_support/bitrue.py +1 -1
  27. ccxt/async_support/bitso.py +1 -1
  28. ccxt/async_support/bitstamp.py +1 -1
  29. ccxt/async_support/bitteam.py +1 -1
  30. ccxt/async_support/bitvavo.py +2 -2
  31. ccxt/async_support/bl3p.py +1 -1
  32. ccxt/async_support/blockchaincom.py +28 -28
  33. ccxt/async_support/blofin.py +1 -1
  34. ccxt/async_support/btcalpha.py +4 -11
  35. ccxt/async_support/btcbox.py +1 -1
  36. ccxt/async_support/btcmarkets.py +1 -1
  37. ccxt/async_support/btcturk.py +1 -1
  38. ccxt/async_support/bybit.py +2 -2
  39. ccxt/async_support/cex.py +2 -2
  40. ccxt/async_support/coinbase.py +33 -33
  41. ccxt/async_support/coinbaseexchange.py +1 -1
  42. ccxt/async_support/coinbaseinternational.py +1 -1
  43. ccxt/async_support/coincheck.py +1 -1
  44. ccxt/async_support/coinex.py +2 -2
  45. ccxt/async_support/coinlist.py +2 -2
  46. ccxt/async_support/coinmate.py +1 -1
  47. ccxt/async_support/coinmetro.py +1 -1
  48. ccxt/async_support/coinone.py +1 -1
  49. ccxt/async_support/coinsph.py +1 -1
  50. ccxt/async_support/coinspot.py +1 -1
  51. ccxt/async_support/cryptocom.py +1 -1
  52. ccxt/async_support/currencycom.py +1 -1
  53. ccxt/async_support/delta.py +2 -2
  54. ccxt/async_support/deribit.py +4 -4
  55. ccxt/async_support/digifinex.py +2 -2
  56. ccxt/async_support/exmo.py +2 -2
  57. ccxt/async_support/gate.py +2 -2
  58. ccxt/async_support/gemini.py +1 -1
  59. ccxt/async_support/hitbtc.py +1 -1
  60. ccxt/async_support/hollaex.py +1 -1
  61. ccxt/async_support/htx.py +3 -3
  62. ccxt/async_support/huobijp.py +1 -1
  63. ccxt/async_support/hyperliquid.py +2 -2
  64. ccxt/async_support/idex.py +1 -1
  65. ccxt/async_support/independentreserve.py +1 -1
  66. ccxt/async_support/indodax.py +1 -1
  67. ccxt/async_support/kraken.py +2 -2
  68. ccxt/async_support/kucoin.py +127 -46
  69. ccxt/async_support/kucoinfutures.py +1 -1
  70. ccxt/async_support/kuna.py +1 -1
  71. ccxt/async_support/latoken.py +1 -1
  72. ccxt/async_support/lbank.py +1 -1
  73. ccxt/async_support/luno.py +1 -1
  74. ccxt/async_support/lykke.py +1 -1
  75. ccxt/async_support/mercado.py +1 -1
  76. ccxt/async_support/mexc.py +1 -1
  77. ccxt/async_support/ndax.py +1 -1
  78. ccxt/async_support/novadax.py +1 -1
  79. ccxt/async_support/oceanex.py +1 -1
  80. ccxt/async_support/okcoin.py +1 -1
  81. ccxt/async_support/okx.py +3 -3
  82. ccxt/async_support/onetrading.py +1 -1
  83. ccxt/async_support/oxfun.py +2 -2
  84. ccxt/async_support/p2b.py +1 -1
  85. ccxt/async_support/paymium.py +1 -1
  86. ccxt/async_support/phemex.py +30 -3
  87. ccxt/async_support/poloniex.py +6 -4
  88. ccxt/async_support/poloniexfutures.py +1 -1
  89. ccxt/async_support/probit.py +1 -1
  90. ccxt/async_support/timex.py +1 -1
  91. ccxt/async_support/tokocrypto.py +1 -1
  92. ccxt/async_support/tradeogre.py +1 -1
  93. ccxt/async_support/upbit.py +1 -1
  94. ccxt/async_support/vertex.py +2 -2
  95. ccxt/async_support/wavesexchange.py +1 -1
  96. ccxt/async_support/wazirx.py +1 -1
  97. ccxt/async_support/whitebit.py +2 -2
  98. ccxt/async_support/woo.py +31 -23
  99. ccxt/async_support/woofipro.py +3 -3
  100. ccxt/async_support/yobit.py +1 -1
  101. ccxt/async_support/zaif.py +1 -1
  102. ccxt/async_support/zonda.py +1 -1
  103. ccxt/base/exchange.py +1 -1
  104. ccxt/base/types.py +4 -1
  105. ccxt/bigone.py +1 -1
  106. ccxt/binance.py +6 -6
  107. ccxt/bingx.py +4 -4
  108. ccxt/bit2c.py +1 -1
  109. ccxt/bitbank.py +1 -1
  110. ccxt/bitbns.py +1 -1
  111. ccxt/bitfinex.py +1 -1
  112. ccxt/bitfinex2.py +1 -1
  113. ccxt/bitflyer.py +1 -1
  114. ccxt/bitget.py +2 -2
  115. ccxt/bithumb.py +1 -1
  116. ccxt/bitmart.py +3 -3
  117. ccxt/bitmex.py +1 -1
  118. ccxt/bitopro.py +1 -1
  119. ccxt/bitrue.py +1 -1
  120. ccxt/bitso.py +1 -1
  121. ccxt/bitstamp.py +1 -1
  122. ccxt/bitteam.py +1 -1
  123. ccxt/bitvavo.py +2 -2
  124. ccxt/bl3p.py +1 -1
  125. ccxt/blockchaincom.py +28 -28
  126. ccxt/blofin.py +1 -1
  127. ccxt/btcalpha.py +4 -11
  128. ccxt/btcbox.py +1 -1
  129. ccxt/btcmarkets.py +1 -1
  130. ccxt/btcturk.py +1 -1
  131. ccxt/bybit.py +2 -2
  132. ccxt/cex.py +2 -2
  133. ccxt/coinbase.py +33 -33
  134. ccxt/coinbaseexchange.py +1 -1
  135. ccxt/coinbaseinternational.py +1 -1
  136. ccxt/coincheck.py +1 -1
  137. ccxt/coinex.py +2 -2
  138. ccxt/coinlist.py +2 -2
  139. ccxt/coinmate.py +1 -1
  140. ccxt/coinmetro.py +1 -1
  141. ccxt/coinone.py +1 -1
  142. ccxt/coinsph.py +1 -1
  143. ccxt/coinspot.py +1 -1
  144. ccxt/cryptocom.py +1 -1
  145. ccxt/currencycom.py +1 -1
  146. ccxt/delta.py +2 -2
  147. ccxt/deribit.py +4 -4
  148. ccxt/digifinex.py +2 -2
  149. ccxt/exmo.py +2 -2
  150. ccxt/gate.py +2 -2
  151. ccxt/gemini.py +1 -1
  152. ccxt/hitbtc.py +1 -1
  153. ccxt/hollaex.py +1 -1
  154. ccxt/htx.py +3 -3
  155. ccxt/huobijp.py +1 -1
  156. ccxt/hyperliquid.py +2 -2
  157. ccxt/idex.py +1 -1
  158. ccxt/independentreserve.py +1 -1
  159. ccxt/indodax.py +1 -1
  160. ccxt/kraken.py +2 -2
  161. ccxt/kucoin.py +127 -46
  162. ccxt/kucoinfutures.py +1 -1
  163. ccxt/kuna.py +1 -1
  164. ccxt/latoken.py +1 -1
  165. ccxt/lbank.py +1 -1
  166. ccxt/luno.py +1 -1
  167. ccxt/lykke.py +1 -1
  168. ccxt/mercado.py +1 -1
  169. ccxt/mexc.py +1 -1
  170. ccxt/ndax.py +1 -1
  171. ccxt/novadax.py +1 -1
  172. ccxt/oceanex.py +1 -1
  173. ccxt/okcoin.py +1 -1
  174. ccxt/okx.py +3 -3
  175. ccxt/onetrading.py +1 -1
  176. ccxt/oxfun.py +2 -2
  177. ccxt/p2b.py +1 -1
  178. ccxt/paymium.py +1 -1
  179. ccxt/phemex.py +30 -3
  180. ccxt/poloniex.py +6 -4
  181. ccxt/poloniexfutures.py +1 -1
  182. ccxt/pro/__init__.py +1 -1
  183. ccxt/pro/binance.py +3 -3
  184. ccxt/pro/bitvavo.py +2 -2
  185. ccxt/pro/bybit.py +20 -14
  186. ccxt/pro/cex.py +3 -3
  187. ccxt/pro/coinbase.py +22 -1
  188. ccxt/pro/cryptocom.py +1 -1
  189. ccxt/pro/gate.py +2 -2
  190. ccxt/pro/hitbtc.py +1 -1
  191. ccxt/pro/kraken.py +2 -2
  192. ccxt/pro/kucoin.py +65 -28
  193. ccxt/pro/okx.py +2 -2
  194. ccxt/pro/oxfun.py +2 -2
  195. ccxt/pro/poloniex.py +1 -1
  196. ccxt/pro/vertex.py +2 -2
  197. ccxt/probit.py +1 -1
  198. ccxt/test/{test_async.py → tests_async.py} +27 -280
  199. ccxt/test/tests_helpers.py +284 -0
  200. ccxt/test/tests_init.py +35 -0
  201. ccxt/test/{test_sync.py → tests_sync.py} +27 -282
  202. ccxt/timex.py +1 -1
  203. ccxt/tokocrypto.py +1 -1
  204. ccxt/tradeogre.py +1 -1
  205. ccxt/upbit.py +1 -1
  206. ccxt/vertex.py +2 -2
  207. ccxt/wavesexchange.py +1 -1
  208. ccxt/wazirx.py +1 -1
  209. ccxt/whitebit.py +2 -2
  210. ccxt/woo.py +31 -23
  211. ccxt/woofipro.py +3 -3
  212. ccxt/yobit.py +1 -1
  213. ccxt/zaif.py +1 -1
  214. ccxt/zonda.py +1 -1
  215. {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/METADATA +5 -5
  216. {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/RECORD +219 -252
  217. ccxt/test/base/__init__.py +0 -29
  218. ccxt/test/base/test_account.py +0 -26
  219. ccxt/test/base/test_balance.py +0 -56
  220. ccxt/test/base/test_borrow_interest.py +0 -35
  221. ccxt/test/base/test_borrow_rate.py +0 -32
  222. ccxt/test/base/test_calculate_fee.py +0 -51
  223. ccxt/test/base/test_crypto.py +0 -127
  224. ccxt/test/base/test_currency.py +0 -76
  225. ccxt/test/base/test_datetime.py +0 -109
  226. ccxt/test/base/test_decimal_to_precision.py +0 -392
  227. ccxt/test/base/test_deep_extend.py +0 -68
  228. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  229. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  230. ccxt/test/base/test_funding_rate_history.py +0 -29
  231. ccxt/test/base/test_last_price.py +0 -31
  232. ccxt/test/base/test_ledger_entry.py +0 -45
  233. ccxt/test/base/test_ledger_item.py +0 -48
  234. ccxt/test/base/test_leverage_tier.py +0 -33
  235. ccxt/test/base/test_liquidation.py +0 -50
  236. ccxt/test/base/test_margin_mode.py +0 -24
  237. ccxt/test/base/test_margin_modification.py +0 -35
  238. ccxt/test/base/test_market.py +0 -193
  239. ccxt/test/base/test_number.py +0 -411
  240. ccxt/test/base/test_ohlcv.py +0 -33
  241. ccxt/test/base/test_open_interest.py +0 -32
  242. ccxt/test/base/test_order.py +0 -64
  243. ccxt/test/base/test_order_book.py +0 -69
  244. ccxt/test/base/test_position.py +0 -60
  245. ccxt/test/base/test_shared_methods.py +0 -353
  246. ccxt/test/base/test_status.py +0 -24
  247. ccxt/test/base/test_throttle.py +0 -126
  248. ccxt/test/base/test_ticker.py +0 -92
  249. ccxt/test/base/test_trade.py +0 -47
  250. ccxt/test/base/test_trading_fee.py +0 -26
  251. ccxt/test/base/test_transaction.py +0 -39
  252. {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/LICENSE.txt +0 -0
  253. {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/WHEEL +0 -0
  254. {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/top_level.txt +0 -0
@@ -1,268 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
- import argparse
4
- import json
5
- # import logging
6
- import os
7
- import sys
8
- from traceback import format_tb, format_exception
9
-
10
- import importlib # noqa: E402
11
- import re
12
-
13
- # ------------------------------------------------------------------------------
14
- # logging.basicConfig(level=logging.INFO)
15
- # ------------------------------------------------------------------------------
16
- DIR_NAME = os.path.dirname(os.path.abspath(__file__))
17
- root = os.path.dirname(os.path.dirname(DIR_NAME))
18
- sys.path.append(root)
19
-
20
- import ccxt # noqa: E402
21
- import ccxt.pro as ccxtpro # noqa: E402
22
-
23
- # ------------------------------------------------------------------------------
24
- # from typing import Optional
25
- # from typing import List
26
- from ccxt.base.errors import NotSupported
27
- from ccxt.base.errors import ProxyError
28
- from ccxt.base.errors import OperationFailed
29
- # from ccxt.base.errors import ExchangeError
30
- from ccxt.base.errors import ExchangeNotAvailable
31
- from ccxt.base.errors import OnMaintenance
32
- from ccxt.base.errors import AuthenticationError
33
-
34
- # ------------------------------------------------------------------------------
35
-
36
- class Argv(object):
37
- id_tests = False
38
- static_tests = False
39
- ws_tests = False
40
- request_tests = False
41
- response_tests = False
42
-
43
- sandbox = False
44
- privateOnly = False
45
- private = False
46
- ws = False
47
- verbose = False
48
- nonce = None
49
- exchange = None
50
- symbol = None
51
- info = False
52
- pass
53
-
54
-
55
- argv = Argv()
56
- parser = argparse.ArgumentParser()
57
-
58
- parser.add_argument('--sandbox', action='store_true', help='enable sandbox mode')
59
- parser.add_argument('--privateOnly', action='store_true', help='run private tests only')
60
- parser.add_argument('--private', action='store_true', help='run private tests')
61
- parser.add_argument('--verbose', action='store_true', help='enable verbose output')
62
- parser.add_argument('--ws', action='store_true', help='websockets version')
63
- parser.add_argument('--info', action='store_true', help='enable info output')
64
- parser.add_argument('--static', action='store_true', help='run static tests')
65
- parser.add_argument('--useProxy', action='store_true', help='run static tests')
66
- parser.add_argument('--idTests', action='store_true', help='run brokerId tests')
67
- parser.add_argument('--responseTests', action='store_true', help='run response tests')
68
- parser.add_argument('--requestTests', action='store_true', help='run response tests')
69
- parser.add_argument('--nonce', type=int, help='integer')
70
- parser.add_argument('exchange', type=str, help='exchange id in lowercase', nargs='?')
71
- parser.add_argument('symbol', type=str, help='symbol in uppercase', nargs='?')
72
- parser.parse_args(namespace=argv)
73
-
74
- # ------------------------------------------------------------------------------
75
-
76
- path = os.path.dirname(ccxt.__file__)
77
- if 'site-packages' in os.path.dirname(ccxt.__file__):
78
- raise Exception("You are running test_async.py/test.py against a globally-installed version of the library! It was previously installed into your site-packages folder by pip or pip3. To ensure testing against the local folder uninstall it first with pip uninstall ccxt or pip3 uninstall ccxt")
79
-
80
- # ------------------------------------------------------------------------------
81
-
82
- Error = Exception
83
-
84
- # # print an error string
85
- # def dump_error(*args):
86
- # string = ' '.join([str(arg) for arg in args])
87
- # print(string)
88
- # sys.stderr.write(string + "\n")
89
- # sys.stderr.flush()
90
-
91
-
92
- def handle_all_unhandled_exceptions(type, value, traceback):
93
- dump((type), (value), '\n<UNHANDLED EXCEPTION>\n' + ('\n'.join(format_tb(traceback))))
94
- exit(1) # unrecoverable crash
95
-
96
-
97
- sys.excepthook = handle_all_unhandled_exceptions
98
- # ------------------------------------------------------------------------------
99
-
100
- # non-transpiled part, but shared names among langs
101
-
102
- is_synchronous = 'async' not in os.path.basename(__file__)
103
-
104
- rootDir = DIR_NAME + '/../../../'
105
- rootDirForSkips = DIR_NAME + '/../../../'
106
- envVars = os.environ
107
- LOG_CHARS_LENGTH = 10000
108
- ext = 'py'
109
- proxyTestFileName = 'proxies'
110
-
111
-
112
- def get_cli_arg_value(arg):
113
- arg_exists = getattr(argv, arg) if hasattr(argv, arg) else False
114
- with_hyphen = '--' + arg
115
- arg_exists_with_hyphen = getattr(argv, with_hyphen) if hasattr(argv, with_hyphen) else False
116
- without_hyphen = arg.replace('--', '')
117
- arg_exists_wo_hyphen = getattr(argv, without_hyphen) if hasattr(argv, without_hyphen) else False
118
- return arg_exists or arg_exists_with_hyphen or arg_exists_wo_hyphen
3
+ from tests_helpers import get_cli_arg_value, dump, exit_script, get_test_files, init_exchange, set_exchange_prop, call_method, exception_message, io_file_exists, io_file_read, baseMainTestClass, AuthenticationError, NotSupported, OperationFailed, OnMaintenance, ExchangeNotAvailable, ProxyError, get_exchange_prop, close, json_parse, json_stringify, is_null_value, io_dir_read, convert_ascii, call_exchange_method_dynamically, set_fetch_response, call_exchange_method_dynamically_sync # noqa: F401
119
4
 
120
- isWsTests = get_cli_arg_value('--ws')
121
-
122
-
123
- class baseMainTestClass():
124
- lang = 'PY'
125
- is_synchronous = is_synchronous
126
- request_tests_failed = False
127
- response_tests_failed = False
128
- response_tests = False
129
- ws_tests = False
130
- load_keys = False
131
- skipped_settings_for_exchange = {}
132
- skipped_methods = {}
133
- check_public_tests = {}
134
- test_files = {}
135
- public_tests = {}
136
- new_line = '\n'
137
- root_dir = rootDir
138
- env_vars = envVars
139
- ext = ext
140
- root_dir_for_skips = rootDirForSkips
141
- only_specific_tests = []
142
- proxy_test_file_name = proxyTestFileName
143
- pass
144
-
145
-
146
- def dump(*args):
147
- print(' '.join([str(arg) for arg in args]))
148
-
149
-
150
- def convert_ascii(str):
151
- return str # stub
152
-
153
- def json_parse(elem):
154
- return json.loads(elem)
155
-
156
-
157
- def json_stringify(elem):
158
- return json.dumps(elem)
159
-
160
-
161
- def convert_to_snake_case(content):
162
- res = re.sub(r'(?<!^)(?=[A-Z])', '_', content).lower()
163
- return res.replace('o_h_l_c_v', 'ohlcv')
164
-
165
-
166
- def get_test_name(methodName):
167
- # stub
168
- return methodName
169
-
170
-
171
- def io_file_exists(path):
172
- return os.path.isfile(path)
173
-
174
-
175
- def io_file_read(path, decode=True):
176
- fs = open(path, "r", encoding="utf-8")
177
- content = fs.read()
178
- if decode:
179
- return json.loads(content)
180
- else:
181
- return content
182
-
183
-
184
- def io_dir_read(path):
185
- return os.listdir(path)
186
-
187
-
188
- def call_method(test_files, methodName, exchange, skippedProperties, args):
189
- methodNameToCall = 'test_' + convert_to_snake_case(methodName)
190
- return getattr(test_files[methodName], methodNameToCall)(exchange, skippedProperties, *args)
191
-
192
-
193
- def call_exchange_method_dynamically(exchange, methodName, args):
194
- return getattr(exchange, methodName)(*args)
195
-
196
- def call_overriden_method(exchange, methodName, args):
197
- # needed for php
198
- return call_exchange_method_dynamically(exchange, methodName, args)
199
-
200
- def exception_message(exc):
201
- message = '[' + type(exc).__name__ + '] ' + "".join(format_exception(type(exc), exc, exc.__traceback__, limit=6))
202
- if len(message) > LOG_CHARS_LENGTH:
203
- # Accessing out of range element causes error
204
- message = message[0:LOG_CHARS_LENGTH]
205
- return message
206
-
207
-
208
- def exit_script(code=0):
209
- exit(code)
210
-
211
-
212
- def get_exchange_prop(exchange, prop, defaultValue=None):
213
- if hasattr(exchange, prop):
214
- res = getattr(exchange, prop)
215
- if res is not None and res != '':
216
- return res
217
- return defaultValue
218
-
219
-
220
- def set_exchange_prop(exchange, prop, value):
221
- setattr(exchange, prop, value)
222
- # set snake case too
223
- setattr(exchange, convert_to_snake_case(prop), value)
224
-
225
-
226
- def init_exchange(exchangeId, args, is_ws=False):
227
- if (is_ws):
228
- return getattr(ccxtpro, exchangeId)(args)
229
- return getattr(ccxt, exchangeId)(args)
230
-
231
-
232
- def get_test_files(properties, ws=False):
233
- tests = {}
234
- finalPropList = properties + [proxyTestFileName]
235
- for i in range(0, len(finalPropList)):
236
- methodName = finalPropList[i]
237
- name_snake_case = convert_to_snake_case(methodName)
238
- prefix = 'async' if not is_synchronous else 'sync'
239
- dir_to_test = DIR_NAME + '/' + prefix + '/'
240
- module_string = 'ccxt.test.' + prefix + '.test_' + name_snake_case
241
- if (ws):
242
- prefix = 'pro'
243
- dir_to_test = DIR_NAME + '/../' + prefix + '/test/Exchange/'
244
- module_string = 'ccxt.pro.test.Exchange.test_' + name_snake_case
245
- filePathWithExt = dir_to_test + 'test_' + name_snake_case + '.py'
246
- if (io_file_exists (filePathWithExt)):
247
- imp = importlib.import_module(module_string)
248
- tests[methodName] = imp # getattr(imp, finalName)
249
- return tests
250
-
251
- def close(exchange):
252
- if (not is_synchronous and hasattr(exchange, 'close')):
253
- exchange.close()
254
-
255
- def is_null_value(value):
256
- return value is None
257
-
258
- def set_fetch_response(exchange: ccxt.Exchange, data):
259
- def fetch(url, method='GET', headers=None, body=None):
260
- return data
261
- exchange.fetch = fetch
262
- return exchange
263
-
264
- # *********************************
265
- # ***** AUTO-TRANSPILER-START *****
266
5
  class testMainClass(baseMainTestClass):
267
6
  def parse_cli_args(self):
268
7
  self.response_tests = get_cli_arg_value('--responseTests')
@@ -451,7 +190,9 @@ class testMainClass(baseMainTestClass):
451
190
  args_stringified = '(' + exchange.json(args) + ')' # args.join() breaks when we provide a list of symbols or multidimensional array; "args.toString()" breaks bcz of "array to string conversion"
452
191
  dump(self.add_padding('[INFO] TESTING', 25), self.exchange_hint(exchange), method_name, args_stringified)
453
192
  call_method(self.test_files, method_name, exchange, skipped_properties_for_method, args)
454
- # if it was passed successfully, add to the list of successfull tests
193
+ if self.info:
194
+ dump(self.add_padding('[INFO] TESTING DONE', 25), self.exchange_hint(exchange), method_name)
195
+ # add to the list of successed tests
455
196
  if is_public:
456
197
  self.checked_public_tests[method_name] = True
457
198
  return
@@ -506,7 +247,7 @@ class testMainClass(baseMainTestClass):
506
247
  # formatted message "[TEST_FAILURE] ..." and that output is then regex-matched by
507
248
  # run-tests.js, so the exceptions are still printed out to console from there.
508
249
  max_retries = 3
509
- args_stringified = exchange.json(args) # args.join() breaks when we provide a list of symbols | "args.toString()" breaks bcz of "array to string conversion"
250
+ args_stringified = exchange.json(args) # args.join() breaks when we provide a list of symbols or multidimensional array; "args.toString()" breaks bcz of "array to string conversion"
510
251
  for i in range(0, max_retries):
511
252
  try:
512
253
  self.test_method(method_name, exchange, args, is_public)
@@ -835,12 +576,16 @@ class testMainClass(baseMainTestClass):
835
576
  for j in range(0, max_retries):
836
577
  try:
837
578
  self.test_method(proxy_test_name, exchange, [], True)
838
- break # if successfull, then break
579
+ return # if successfull, then end the test
839
580
  except Exception as e:
840
581
  exception = e
582
+ exchange.sleep(j * 1000)
841
583
  # if exception was set, then throw it
842
- if exception:
584
+ if exception is not None:
843
585
  error_message = '[TEST_FAILURE] Failed ' + proxy_test_name + ' : ' + exception_message(exception)
586
+ # temporary comment the below, because c# transpilation failure
587
+ # throw new ExchangeError (errorMessage.toString ());
588
+ dump('[TEST_WARNING]' + str(error_message))
844
589
 
845
590
  def start_test(self, exchange, symbol):
846
591
  # we do not need to test aliases
@@ -1074,7 +819,10 @@ class testMainClass(baseMainTestClass):
1074
819
  output = None
1075
820
  request_url = None
1076
821
  try:
1077
- call_exchange_method_dynamically(exchange, method, self.sanitize_data_input(data['input']))
822
+ if not self.is_synchronous:
823
+ call_exchange_method_dynamically(exchange, method, self.sanitize_data_input(data['input']))
824
+ else:
825
+ call_exchange_method_dynamically_sync(exchange, method, self.sanitize_data_input(data['input']))
1078
826
  except Exception as e:
1079
827
  if not (isinstance(e, ProxyError)):
1080
828
  raise e
@@ -1092,8 +840,12 @@ class testMainClass(baseMainTestClass):
1092
840
  expected_result = exchange.safe_value(data, 'parsedResponse')
1093
841
  mocked_exchange = set_fetch_response(exchange, data['httpResponse'])
1094
842
  try:
1095
- unified_result = call_exchange_method_dynamically(exchange, method, self.sanitize_data_input(data['input']))
1096
- self.assert_static_response_output(mocked_exchange, skip_keys, unified_result, expected_result)
843
+ if not self.is_synchronous:
844
+ unified_result = call_exchange_method_dynamically(exchange, method, self.sanitize_data_input(data['input']))
845
+ self.assert_static_response_output(mocked_exchange, skip_keys, unified_result, expected_result)
846
+ else:
847
+ unified_result_sync = call_exchange_method_dynamically_sync(exchange, method, self.sanitize_data_input(data['input']))
848
+ self.assert_static_response_output(mocked_exchange, skip_keys, unified_result_sync, expected_result)
1097
849
  except Exception as e:
1098
850
  self.request_tests_failed = True
1099
851
  error_message = '[' + self.lang + '][STATIC_RESPONSE_TEST_FAILURE]' + '[' + self.exchange_hint(exchange) + ']' + '[' + method + ']' + '[' + data['description'] + ']' + str(e)
@@ -1178,7 +930,8 @@ class testMainClass(baseMainTestClass):
1178
930
  # reset options
1179
931
  # exchange.options = exchange.deepExtend (oldExchangeOptions, {});
1180
932
  exchange.extend_exchange_options(exchange.deep_extend(old_exchange_options, {}))
1181
- close(exchange)
933
+ if not self.is_synchronous:
934
+ close(exchange)
1182
935
  return True # in c# methods that will be used with promiseAll need to return something
1183
936
 
1184
937
  def test_exchange_response_statically(self, exchange_name, exchange_data, test_name=None):
@@ -1227,7 +980,8 @@ class testMainClass(baseMainTestClass):
1227
980
  # reset options
1228
981
  # exchange.options = exchange.deepExtend (oldExchangeOptions, {});
1229
982
  exchange.extend_exchange_options(exchange.deep_extend(old_exchange_options, {}))
1230
- close(exchange)
983
+ if not self.is_synchronous:
984
+ close(exchange)
1231
985
  return True # in c# methods that will be used with promiseAll need to return something
1232
986
 
1233
987
  def get_number_of_tests_from_exchange(self, exchange, exchange_data, test_name=None):
@@ -1272,7 +1026,8 @@ class testMainClass(baseMainTestClass):
1272
1026
  if self.request_tests_failed or self.response_tests_failed:
1273
1027
  exit_script(1)
1274
1028
  else:
1275
- success_message = '[' + self.lang + '][TEST_SUCCESS] ' + str(sum) + ' static ' + type + ' tests passed.'
1029
+ prefix = '[SYNC]' if (self.is_synchronous) else ''
1030
+ success_message = '[' + self.lang + ']' + prefix + '[TEST_SUCCESS] ' + str(sum) + ' static ' + type + ' tests passed.'
1276
1031
  dump('[INFO]' + success_message)
1277
1032
 
1278
1033
  def run_static_response_tests(self, exchange_name=None, test=None):
@@ -1670,13 +1425,3 @@ class testMainClass(baseMainTestClass):
1670
1425
  assert broker_id == id, 'vertex - id: ' + str(id) + ' different from broker_id: ' + str(broker_id)
1671
1426
  close(exchange)
1672
1427
  return True
1673
-
1674
- # ***** AUTO-TRANSPILER-END *****
1675
- # *******************************
1676
-
1677
-
1678
- if __name__ == '__main__':
1679
- argvSymbol = argv.symbol if argv.symbol and '/' in argv.symbol else None
1680
- # in python, we check it through "symbol" arg (as opposed to JS/PHP) because argvs were already built above
1681
- argvMethod = argv.symbol if argv.symbol and '()' in argv.symbol else None
1682
- (testMainClass().init(argv.exchange, argvSymbol, argvMethod))
ccxt/timex.py CHANGED
@@ -723,7 +723,7 @@ class timex(Exchange, ImplicitAPI):
723
723
  :param str type: 'market' or 'limit'
724
724
  :param str side: 'buy' or 'sell'
725
725
  :param float amount: how much of currency you want to trade in units of base currency
726
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
726
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
727
727
  :param dict [params]: extra parameters specific to the exchange API endpoint
728
728
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
729
729
  """
ccxt/tokocrypto.py CHANGED
@@ -1564,7 +1564,7 @@ class tokocrypto(Exchange, ImplicitAPI):
1564
1564
  :param str type: 'market' or 'limit'
1565
1565
  :param str side: 'buy' or 'sell'
1566
1566
  :param float amount: how much of currency you want to trade in units of base currency
1567
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1567
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1568
1568
  :param dict [params]: extra parameters specific to the exchange API endpoint
1569
1569
  :param float [params.triggerPrice]: the price at which a trigger order would be triggered
1570
1570
  :param float [params.cost]: for spot market buy orders, the quote quantity that can be used alternative for the amount
ccxt/tradeogre.py CHANGED
@@ -445,7 +445,7 @@ class tradeogre(Exchange, ImplicitAPI):
445
445
  :param str type: must be 'limit'
446
446
  :param str side: 'buy' or 'sell'
447
447
  :param float amount: how much of currency you want to trade in units of base currency
448
- :param float price: the price at which the order is to be fullfilled, in units of the quote currency
448
+ :param float price: the price at which the order is to be fulfilled, in units of the quote currency
449
449
  :param dict [params]: extra parameters specific to the exchange API endpoint
450
450
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
451
451
  """
ccxt/upbit.py CHANGED
@@ -997,7 +997,7 @@ class upbit(Exchange, ImplicitAPI):
997
997
  :param str type: 'market' or 'limit'
998
998
  :param str side: 'buy' or 'sell'
999
999
  :param float amount: how much you want to trade in units of the base currency
1000
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1000
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1001
1001
  :param dict [params]: extra parameters specific to the exchange API endpoint
1002
1002
  :param float [params.cost]: for market buy orders, the quote quantity that can be used alternative for the amount
1003
1003
  :param str [params.timeInForce]: 'IOC' or 'FOK'
ccxt/vertex.py CHANGED
@@ -1565,7 +1565,7 @@ class vertex(Exchange, ImplicitAPI):
1565
1565
  :param str type: 'market' or 'limit'
1566
1566
  :param str side: 'buy' or 'sell'
1567
1567
  :param float amount: how much of currency you want to trade in units of base currency
1568
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1568
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1569
1569
  :param dict [params]: extra parameters specific to the exchange API endpoint
1570
1570
  :param str [params.timeInForce]: ioc, fok
1571
1571
  :param bool [params.postOnly]: True or False whether the order is post-only
@@ -1660,7 +1660,7 @@ class vertex(Exchange, ImplicitAPI):
1660
1660
  :param str type: 'market' or 'limit'
1661
1661
  :param str side: 'buy' or 'sell'
1662
1662
  :param float amount: how much of currency you want to trade in units of base currency
1663
- :param float [price]: the price at which the order is to be fullfilled, in units of the base currency, ignored in market orders
1663
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1664
1664
  :param dict [params]: extra parameters specific to the exchange API endpoint
1665
1665
  :param str [params.timeInForce]: ioc, fok
1666
1666
  :param bool [params.postOnly]: True or False whether the order is post-only
ccxt/wavesexchange.py CHANGED
@@ -1220,7 +1220,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1220
1220
  :param str type: 'market' or 'limit'
1221
1221
  :param str side: 'buy' or 'sell'
1222
1222
  :param float amount: how much of currency you want to trade in units of base currency
1223
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1223
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1224
1224
  :param dict [params]: extra parameters specific to the exchange API endpoint
1225
1225
  :param float [params.stopPrice]: The price at which a stop order is triggered at
1226
1226
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
ccxt/wazirx.py CHANGED
@@ -812,7 +812,7 @@ class wazirx(Exchange, ImplicitAPI):
812
812
  :param str type: 'market' or 'limit'
813
813
  :param str side: 'buy' or 'sell'
814
814
  :param float amount: how much of currency you want to trade in units of base currency
815
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
815
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
816
816
  :param dict [params]: extra parameters specific to the exchange API endpoint
817
817
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
818
818
  """
ccxt/whitebit.py CHANGED
@@ -1200,7 +1200,7 @@ class whitebit(Exchange, ImplicitAPI):
1200
1200
  :param str type: 'market' or 'limit'
1201
1201
  :param str side: 'buy' or 'sell'
1202
1202
  :param float amount: how much of currency you want to trade in units of base currency
1203
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1203
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1204
1204
  :param dict [params]: extra parameters specific to the exchange API endpoint
1205
1205
  :param float [params.cost]: *market orders only* the cost of the order in units of the base currency
1206
1206
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1281,7 +1281,7 @@ class whitebit(Exchange, ImplicitAPI):
1281
1281
  :param str type: 'market' or 'limit'
1282
1282
  :param str side: 'buy' or 'sell'
1283
1283
  :param float amount: how much of currency you want to trade in units of base currency
1284
- :param float price: the price at which the order is to be fullfilled, in units of the base currency, ignored in market orders
1284
+ :param float price: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1285
1285
  :param dict [params]: extra parameters specific to the exchange API endpoint
1286
1286
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1287
1287
  """
ccxt/woo.py CHANGED
@@ -52,7 +52,7 @@ class woo(Exchange, ImplicitAPI):
52
52
  'createMarketBuyOrderWithCost': True,
53
53
  'createMarketOrder': False,
54
54
  'createMarketOrderWithCost': False,
55
- 'createMarketSellOrderWithCost': False,
55
+ 'createMarketSellOrderWithCost': True,
56
56
  'createOrder': True,
57
57
  'createOrderWithTakeProfitAndStopLoss': True,
58
58
  'createReduceOnlyOrder': True,
@@ -832,8 +832,22 @@ class woo(Exchange, ImplicitAPI):
832
832
  market = self.market(symbol)
833
833
  if not market['spot']:
834
834
  raise NotSupported(self.id + ' createMarketBuyOrderWithCost() supports spot orders only')
835
- params['createMarketBuyOrderRequiresPrice'] = False
836
- return self.create_order(symbol, 'market', 'buy', cost, None, params)
835
+ return self.create_order(symbol, 'market', 'buy', cost, 1, params)
836
+
837
+ def create_market_sell_order_with_cost(self, symbol: str, cost: float, params={}):
838
+ """
839
+ create a market sell order by providing the symbol and cost
840
+ :see: https://docs.woo.org/#send-order
841
+ :param str symbol: unified symbol of the market to create an order in
842
+ :param float cost: how much you want to trade in units of the quote currency
843
+ :param dict [params]: extra parameters specific to the exchange API endpoint
844
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
845
+ """
846
+ self.load_markets()
847
+ market = self.market(symbol)
848
+ if not market['spot']:
849
+ raise NotSupported(self.id + ' createMarketSellOrderWithCost() supports spot orders only')
850
+ return self.create_order(symbol, 'market', 'sell', cost, 1, params)
837
851
 
838
852
  def create_trailing_amount_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, trailingAmount=None, trailingTriggerPrice=None, params={}) -> Order:
839
853
  """
@@ -888,7 +902,7 @@ class woo(Exchange, ImplicitAPI):
888
902
  :param str type: 'market' or 'limit'
889
903
  :param str side: 'buy' or 'sell'
890
904
  :param float amount: how much of currency you want to trade in units of base currency
891
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
905
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
892
906
  :param dict [params]: extra parameters specific to the exchange API endpoint
893
907
  :param float [params.triggerPrice]: The price a trigger order is triggered at
894
908
  :param dict [params.takeProfit]: *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered(perpetual swap markets only)
@@ -941,28 +955,22 @@ class woo(Exchange, ImplicitAPI):
941
955
  request['order_type'] = 'IOC'
942
956
  if reduceOnly:
943
957
  request[reduceOnlyKey] = reduceOnly
944
- if price is not None:
958
+ if not isMarket and price is not None:
945
959
  request[priceKey] = self.price_to_precision(symbol, price)
946
960
  if isMarket and not isStop:
947
961
  # for market buy it requires the amount of quote currency to spend
948
- if market['spot'] and orderSide == 'BUY':
962
+ cost = self.safe_string_2(params, 'cost', 'order_amount')
963
+ params = self.omit(params, ['cost', 'order_amount'])
964
+ isPriceProvided = price is not None
965
+ if market['spot'] and (isPriceProvided or (cost is not None)):
949
966
  quoteAmount = None
950
- createMarketBuyOrderRequiresPrice = True
951
- createMarketBuyOrderRequiresPrice, params = self.handle_option_and_params(params, 'createOrder', 'createMarketBuyOrderRequiresPrice', True)
952
- cost = self.safe_number_2(params, 'cost', 'order_amount')
953
- params = self.omit(params, ['cost', 'order_amount'])
954
967
  if cost is not None:
955
968
  quoteAmount = self.cost_to_precision(symbol, cost)
956
- elif createMarketBuyOrderRequiresPrice:
957
- if price is None:
958
- raise InvalidOrder(self.id + ' createOrder() requires the price argument for market buy orders to calculate the total cost to spend(amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to False and pass the cost to spend(quote quantity) in the amount argument')
959
- else:
960
- amountString = self.number_to_string(amount)
961
- priceString = self.number_to_string(price)
962
- costRequest = Precise.string_mul(amountString, priceString)
963
- quoteAmount = self.cost_to_precision(symbol, costRequest)
964
969
  else:
965
- quoteAmount = self.cost_to_precision(symbol, amount)
970
+ amountString = self.number_to_string(amount)
971
+ priceString = self.number_to_string(price)
972
+ costRequest = Precise.string_mul(amountString, priceString)
973
+ quoteAmount = self.cost_to_precision(symbol, costRequest)
966
974
  request['order_amount'] = quoteAmount
967
975
  else:
968
976
  request['order_quantity'] = self.amount_to_precision(symbol, amount)
@@ -1066,7 +1074,7 @@ class woo(Exchange, ImplicitAPI):
1066
1074
  :param str type: 'market' or 'limit'
1067
1075
  :param str side: 'buy' or 'sell'
1068
1076
  :param float amount: how much of currency you want to trade in units of base currency
1069
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1077
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1070
1078
  :param dict [params]: extra parameters specific to the exchange API endpoint
1071
1079
  :param float [params.triggerPrice]: The price a trigger order is triggered at
1072
1080
  :param float [params.stopLossPrice]: price to trigger stop-loss orders
@@ -1496,8 +1504,8 @@ class woo(Exchange, ImplicitAPI):
1496
1504
  side = self.safe_string_lower(order, 'side')
1497
1505
  filled = self.omit_zero(self.safe_value_2(order, 'executed', 'totalExecutedQuantity'))
1498
1506
  average = self.omit_zero(self.safe_string_2(order, 'average_executed_price', 'averageExecutedPrice'))
1499
- remaining = Precise.string_sub(cost, filled)
1500
- fee = self.safe_value_2(order, 'total_fee', 'totalFee')
1507
+ # remaining = Precise.string_sub(cost, filled)
1508
+ fee = self.safe_number_2(order, 'total_fee', 'totalFee')
1501
1509
  feeCurrency = self.safe_string_2(order, 'fee_asset', 'feeAsset')
1502
1510
  transactions = self.safe_value(order, 'Transactions')
1503
1511
  stopPrice = self.safe_number(order, 'triggerPrice')
@@ -1536,7 +1544,7 @@ class woo(Exchange, ImplicitAPI):
1536
1544
  'average': average,
1537
1545
  'amount': amount,
1538
1546
  'filled': filled,
1539
- 'remaining': remaining, # TO_DO
1547
+ 'remaining': None, # TO_DO
1540
1548
  'cost': cost,
1541
1549
  'trades': transactions,
1542
1550
  'fee': {
ccxt/woofipro.py CHANGED
@@ -1196,7 +1196,7 @@ class woofipro(Exchange, ImplicitAPI):
1196
1196
  :param str type: 'market' or 'limit'
1197
1197
  :param str side: 'buy' or 'sell'
1198
1198
  :param float amount: how much you want to trade in units of the base currency
1199
- :param float [price]: the price that the order is to be fullfilled, in units of the quote currency, ignored in market orders
1199
+ :param float [price]: the price that the order is to be fulfilled, in units of the quote currency, ignored in market orders
1200
1200
  :param dict [params]: extra parameters specific to the exchange API endpoint
1201
1201
  :returns dict: request to be sent to the exchange
1202
1202
  """
@@ -1283,7 +1283,7 @@ class woofipro(Exchange, ImplicitAPI):
1283
1283
  :param str type: 'market' or 'limit'
1284
1284
  :param str side: 'buy' or 'sell'
1285
1285
  :param float amount: how much of currency you want to trade in units of base currency
1286
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1286
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1287
1287
  :param dict [params]: extra parameters specific to the exchange API endpoint
1288
1288
  :param float [params.triggerPrice]: The price a trigger order is triggered at
1289
1289
  :param dict [params.takeProfit]: *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered(perpetual swap markets only)
@@ -1400,7 +1400,7 @@ class woofipro(Exchange, ImplicitAPI):
1400
1400
  :param str type: 'market' or 'limit'
1401
1401
  :param str side: 'buy' or 'sell'
1402
1402
  :param float amount: how much of currency you want to trade in units of base currency
1403
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1403
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1404
1404
  :param dict [params]: extra parameters specific to the exchange API endpoint
1405
1405
  :param float [params.triggerPrice]: The price a trigger order is triggered at
1406
1406
  :param float [params.stopLossPrice]: price to trigger stop-loss orders
ccxt/yobit.py CHANGED
@@ -760,7 +760,7 @@ class yobit(Exchange, ImplicitAPI):
760
760
  :param str type: must be 'limit'
761
761
  :param str side: 'buy' or 'sell'
762
762
  :param float amount: how much of currency you want to trade in units of base currency
763
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
763
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
764
764
  :param dict [params]: extra parameters specific to the exchange API endpoint
765
765
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
766
766
  """
ccxt/zaif.py CHANGED
@@ -429,7 +429,7 @@ class zaif(Exchange, ImplicitAPI):
429
429
  :param str type: must be 'limit'
430
430
  :param str side: 'buy' or 'sell'
431
431
  :param float amount: how much of currency you want to trade in units of base currency
432
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
432
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
433
433
  :param dict [params]: extra parameters specific to the exchange API endpoint
434
434
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
435
435
  """
ccxt/zonda.py CHANGED
@@ -1323,7 +1323,7 @@ class zonda(Exchange, ImplicitAPI):
1323
1323
  :param str type: 'market' or 'limit'
1324
1324
  :param str side: 'buy' or 'sell'
1325
1325
  :param float amount: how much of currency you want to trade in units of base currency
1326
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1326
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1327
1327
  :param dict [params]: extra parameters specific to the exchange API endpoint
1328
1328
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1329
1329
  """