ccxt 4.3.39__py2.py3-none-any.whl → 4.3.41__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 (58) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/binance.py +2 -0
  3. ccxt/abstract/binancecoinm.py +2 -0
  4. ccxt/abstract/binanceus.py +2 -0
  5. ccxt/abstract/binanceusdm.py +2 -0
  6. ccxt/abstract/okx.py +7 -0
  7. ccxt/async_support/__init__.py +1 -1
  8. ccxt/async_support/base/exchange.py +1 -1
  9. ccxt/async_support/binance.py +4 -0
  10. ccxt/async_support/bitfinex2.py +1 -1
  11. ccxt/async_support/bithumb.py +9 -1
  12. ccxt/async_support/bitstamp.py +38 -2
  13. ccxt/async_support/coinlist.py +19 -1
  14. ccxt/async_support/coinmate.py +19 -3
  15. ccxt/async_support/coinone.py +1 -1
  16. ccxt/async_support/coinspot.py +11 -2
  17. ccxt/async_support/hitbtc.py +2 -2
  18. ccxt/async_support/independentreserve.py +33 -1
  19. ccxt/async_support/indodax.py +43 -2
  20. ccxt/async_support/okx.py +7 -0
  21. ccxt/async_support/upbit.py +13 -8
  22. ccxt/async_support/woo.py +6 -2
  23. ccxt/async_support/woofipro.py +8 -2
  24. ccxt/base/exchange.py +1 -1
  25. ccxt/binance.py +4 -0
  26. ccxt/bitfinex2.py +1 -1
  27. ccxt/bithumb.py +9 -1
  28. ccxt/bitstamp.py +38 -2
  29. ccxt/coinlist.py +19 -1
  30. ccxt/coinmate.py +19 -3
  31. ccxt/coinone.py +1 -1
  32. ccxt/coinspot.py +11 -2
  33. ccxt/hitbtc.py +2 -2
  34. ccxt/independentreserve.py +33 -1
  35. ccxt/indodax.py +43 -2
  36. ccxt/okx.py +7 -0
  37. ccxt/pro/__init__.py +1 -1
  38. ccxt/pro/alpaca.py +5 -5
  39. ccxt/pro/ascendex.py +3 -3
  40. ccxt/pro/bingx.py +258 -42
  41. ccxt/pro/bitget.py +6 -5
  42. ccxt/pro/bitrue.py +3 -4
  43. ccxt/pro/currencycom.py +6 -5
  44. ccxt/pro/exmo.py +5 -6
  45. ccxt/pro/gemini.py +4 -3
  46. ccxt/pro/independentreserve.py +7 -7
  47. ccxt/pro/lbank.py +4 -4
  48. ccxt/pro/phemex.py +5 -5
  49. ccxt/pro/probit.py +4 -4
  50. ccxt/pro/upbit.py +295 -4
  51. ccxt/pro/wazirx.py +12 -12
  52. ccxt/upbit.py +13 -8
  53. ccxt/woo.py +6 -2
  54. ccxt/woofipro.py +8 -2
  55. {ccxt-4.3.39.dist-info → ccxt-4.3.41.dist-info}/METADATA +4 -4
  56. {ccxt-4.3.39.dist-info → ccxt-4.3.41.dist-info}/RECORD +58 -58
  57. {ccxt-4.3.39.dist-info → ccxt-4.3.41.dist-info}/WHEEL +0 -0
  58. {ccxt-4.3.39.dist-info → ccxt-4.3.41.dist-info}/top_level.txt +0 -0
ccxt/pro/upbit.py CHANGED
@@ -4,8 +4,8 @@
4
4
  # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
5
 
6
6
  import ccxt.async_support
7
- from ccxt.async_support.base.ws.cache import ArrayCache
8
- from ccxt.base.types import Int, OrderBook, Ticker, Trade
7
+ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById
8
+ from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Ticker, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
11
 
@@ -19,10 +19,13 @@ class upbit(ccxt.async_support.upbit):
19
19
  'watchOrderBook': True,
20
20
  'watchTicker': True,
21
21
  'watchTrades': True,
22
+ 'watchOrders': True,
23
+ 'watchMyTrades': True,
24
+ 'watchBalance': True,
22
25
  },
23
26
  'urls': {
24
27
  'api': {
25
- 'ws': 'wss://api.upbit.com/websocket/v1',
28
+ 'ws': 'wss://{hostname}/websocket/v1',
26
29
  },
27
30
  },
28
31
  'options': {
@@ -35,7 +38,9 @@ class upbit(ccxt.async_support.upbit):
35
38
  market = self.market(symbol)
36
39
  symbol = market['symbol']
37
40
  marketId = market['id']
38
- url = self.urls['api']['ws']
41
+ url = self.implode_params(self.urls['api']['ws'], {
42
+ 'hostname': self.hostname,
43
+ })
39
44
  self.options[channel] = self.safe_value(self.options, channel, {})
40
45
  self.options[channel][symbol] = True
41
46
  symbols = list(self.options[channel].keys())
@@ -57,6 +62,7 @@ class upbit(ccxt.async_support.upbit):
57
62
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
58
63
  """
59
64
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
65
+ :see: https://global-docs.upbit.com/reference/websocket-ticker
60
66
  :param str symbol: unified symbol of the market to fetch the ticker for
61
67
  :param dict [params]: extra parameters specific to the exchange API endpoint
62
68
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -66,6 +72,7 @@ class upbit(ccxt.async_support.upbit):
66
72
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
67
73
  """
68
74
  get the list of most recent trades for a particular symbol
75
+ :see: https://global-docs.upbit.com/reference/websocket-trade
69
76
  :param str symbol: unified symbol of the market to fetch trades for
70
77
  :param int [since]: timestamp in ms of the earliest trade to fetch
71
78
  :param int [limit]: the maximum amount of trades to fetch
@@ -82,6 +89,7 @@ class upbit(ccxt.async_support.upbit):
82
89
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
83
90
  """
84
91
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
92
+ :see: https://global-docs.upbit.com/reference/websocket-orderbook
85
93
  :param str symbol: unified symbol of the market to fetch the order book for
86
94
  :param int [limit]: the maximum amount of order book entries to return
87
95
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -213,11 +221,294 @@ class upbit(ccxt.async_support.upbit):
213
221
  messageHash = 'trade:' + marketId
214
222
  client.resolve(stored, messageHash)
215
223
 
224
+ async def authenticate(self, params={}):
225
+ self.check_required_credentials()
226
+ authenticated = self.options['ws']['token']
227
+ if authenticated is None:
228
+ auth: dict = {
229
+ 'access_key': self.apiKey,
230
+ 'nonce': self.uuid(),
231
+ }
232
+ token = self.jwt(auth, self.encode(self.secret), 'sha256', False)
233
+ self.options['ws']['token'] = token
234
+ self.options['ws']['options']['headers'] = {
235
+ 'authorization': 'Bearer ' + token,
236
+ }
237
+ url = self.urls['api']['ws'] + '/private'
238
+ client = self.client(url)
239
+ return client
240
+
241
+ async def watch_private(self, symbol, channel, messageHash, params={}):
242
+ await self.authenticate()
243
+ request = {
244
+ 'type': channel,
245
+ }
246
+ if symbol is not None:
247
+ await self.load_markets()
248
+ market = self.market(symbol)
249
+ symbol = market['symbol']
250
+ symbols = [symbol]
251
+ marketIds = self.market_ids(symbols)
252
+ request['codes'] = marketIds
253
+ messageHash = messageHash + ':' + symbol
254
+ url = self.implode_params(self.urls['api']['ws'], {
255
+ 'hostname': self.hostname,
256
+ })
257
+ url += '/private'
258
+ message = [
259
+ {
260
+ 'ticket': self.uuid(),
261
+ },
262
+ request,
263
+ ]
264
+ return await self.watch(url, messageHash, message, messageHash)
265
+
266
+ async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
267
+ """
268
+ watches information on multiple orders made by the user
269
+ :see: https://global-docs.upbit.com/reference/websocket-myorder
270
+ :param str symbol: unified market symbol of the market orders were made in
271
+ :param int [since]: the earliest time in ms to fetch orders for
272
+ :param int [limit]: the maximum number of order structures to retrieve
273
+ :param dict [params]: extra parameters specific to the exchange API endpoint
274
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
275
+ """
276
+ await self.load_markets()
277
+ channel = 'myOrder'
278
+ messageHash = 'myOrder'
279
+ orders = await self.watch_private(symbol, channel, messageHash)
280
+ if self.newUpdates:
281
+ limit = orders.getLimit(symbol, limit)
282
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
283
+
284
+ async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
285
+ """
286
+ watches information on multiple trades made by the user
287
+ :see: https://global-docs.upbit.com/reference/websocket-myorder
288
+ :param str symbol: unified market symbol of the market orders were made in
289
+ :param int [since]: the earliest time in ms to fetch orders for
290
+ :param int [limit]: the maximum number of order structures to retrieve
291
+ :param dict [params]: extra parameters specific to the exchange API endpoint
292
+ :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
293
+ """
294
+ await self.load_markets()
295
+ channel = 'myOrder'
296
+ messageHash = 'myTrades'
297
+ trades = await self.watch_private(symbol, channel, messageHash)
298
+ if self.newUpdates:
299
+ limit = trades.getLimit(symbol, limit)
300
+ return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
301
+
302
+ def parse_ws_order_status(self, status: Str):
303
+ statuses: dict = {
304
+ 'wait': 'open',
305
+ 'done': 'closed',
306
+ 'cancel': 'canceled',
307
+ 'watch': 'open', # not sure what self status means
308
+ 'trade': 'open',
309
+ }
310
+ return self.safe_string(statuses, status, status)
311
+
312
+ def parse_ws_order(self, order, market=None):
313
+ #
314
+ # {
315
+ # "type": "myOrder",
316
+ # "code": "SGD-XRP",
317
+ # "uuid": "ac2dc2a3-fce9-40a2-a4f6-5987c25c438f",
318
+ # "ask_bid": "BID",
319
+ # "order_type": "limit",
320
+ # "state": "trade",
321
+ # "price": 0.001453,
322
+ # "avg_price": 0.00145372,
323
+ # "volume": 30925891.29839369,
324
+ # "remaining_volume": 29968038.09235948,
325
+ # "executed_volume": 30925891.29839369,
326
+ # "trades_count": 1,
327
+ # "reserved_fee": 44.23943970238218,
328
+ # "remaining_fee": 21.77177967409916,
329
+ # "paid_fee": 22.467660028283017,
330
+ # "locked": 43565.33112787242,
331
+ # "executed_funds": 44935.32005656603,
332
+ # "order_timestamp": 1710751590000,
333
+ # "timestamp": 1710751597500,
334
+ # "stream_type": "REALTIME"
335
+ # }
336
+ #
337
+ id = self.safe_string(order, 'uuid')
338
+ side = self.safe_string_lower(order, 'ask_bid')
339
+ if side == 'bid':
340
+ side = 'buy'
341
+ else:
342
+ side = 'sell'
343
+ timestamp = self.parse8601(self.safe_string(order, 'order_timestamp'))
344
+ status = self.parse_ws_order_status(self.safe_string(order, 'state'))
345
+ marketId = self.safe_string(order, 'code')
346
+ market = self.safe_market(marketId, market)
347
+ fee = None
348
+ feeCost = self.safe_string(order, 'paid_fee')
349
+ if feeCost is not None:
350
+ fee = {
351
+ 'currency': market['quote'],
352
+ 'cost': feeCost,
353
+ }
354
+ return self.safe_order({
355
+ 'info': order,
356
+ 'id': id,
357
+ 'clientOrderId': None,
358
+ 'timestamp': timestamp,
359
+ 'datetime': self.iso8601(timestamp),
360
+ 'lastTradeTimestamp': self.safe_string(order, 'trade_timestamp'),
361
+ 'symbol': market['symbol'],
362
+ 'type': self.safe_string(order, 'order_type'),
363
+ 'timeInForce': self.safe_string(order, 'time_in_force'),
364
+ 'postOnly': None,
365
+ 'side': side,
366
+ 'price': self.safe_string(order, 'price'),
367
+ 'stopPrice': None,
368
+ 'triggerPrice': None,
369
+ 'cost': self.safe_string(order, 'executed_funds'),
370
+ 'average': self.safe_string(order, 'avg_price'),
371
+ 'amount': self.safe_string(order, 'volume'),
372
+ 'filled': self.safe_string(order, 'executed_volume'),
373
+ 'remaining': self.safe_string(order, 'remaining_volume'),
374
+ 'status': status,
375
+ 'fee': fee,
376
+ 'trades': None,
377
+ })
378
+
379
+ def parse_ws_trade(self, trade, market=None):
380
+ # see: parseWsOrder
381
+ side = self.safe_string_lower(trade, 'ask_bid')
382
+ if side == 'bid':
383
+ side = 'buy'
384
+ else:
385
+ side = 'sell'
386
+ timestamp = self.parse8601(self.safe_string(trade, 'trade_timestamp'))
387
+ marketId = self.safe_string(trade, 'code')
388
+ market = self.safe_market(marketId, market)
389
+ fee = None
390
+ feeCost = self.safe_string(trade, 'paid_fee')
391
+ if feeCost is not None:
392
+ fee = {
393
+ 'currency': market['quote'],
394
+ 'cost': feeCost,
395
+ }
396
+ return self.safe_trade({
397
+ 'id': self.safe_string(trade, 'trade_uuid'),
398
+ 'timestamp': timestamp,
399
+ 'datetime': self.iso8601(timestamp),
400
+ 'symbol': market['symbol'],
401
+ 'side': side,
402
+ 'price': self.safe_string(trade, 'price'),
403
+ 'amount': self.safe_string(trade, 'volume'),
404
+ 'cost': self.safe_string(trade, 'executed_funds'),
405
+ 'order': self.safe_string(trade, 'uuid'),
406
+ 'takerOrMaker': None,
407
+ 'type': self.safe_string(trade, 'order_type'),
408
+ 'fee': fee,
409
+ 'info': trade,
410
+ }, market)
411
+
412
+ def handle_my_order(self, client: Client, message):
413
+ # see: parseWsOrder
414
+ tradeId = self.safe_string(message, 'trade_uuid')
415
+ if tradeId is not None:
416
+ self.handle_my_trade(client, message)
417
+ self.handle_order(client, message)
418
+
419
+ def handle_my_trade(self, client: Client, message):
420
+ # see: parseWsOrder
421
+ myTrades = self.myTrades
422
+ if myTrades is None:
423
+ limit = self.safe_integer(self.options, 'tradesLimit', 1000)
424
+ myTrades = ArrayCacheBySymbolById(limit)
425
+ trade = self.parse_ws_trade(message)
426
+ myTrades.append(trade)
427
+ messageHash = 'myTrades'
428
+ client.resolve(myTrades, messageHash)
429
+ messageHash = 'myTrades:' + trade['symbol']
430
+ client.resolve(myTrades, messageHash)
431
+
432
+ def handle_order(self, client: Client, message):
433
+ parsed = self.parse_ws_order(message)
434
+ symbol = self.safe_string(parsed, 'symbol')
435
+ orderId = self.safe_string(parsed, 'id')
436
+ if self.orders is None:
437
+ limit = self.safe_integer(self.options, 'ordersLimit', 1000)
438
+ self.orders = ArrayCacheBySymbolById(limit)
439
+ cachedOrders = self.orders
440
+ orders = self.safe_value(cachedOrders.hashmap, symbol, {})
441
+ order = self.safe_value(orders, orderId)
442
+ if order is not None:
443
+ fee = self.safe_value(order, 'fee')
444
+ if fee is not None:
445
+ parsed['fee'] = fee
446
+ fees = self.safe_value(order, 'fees')
447
+ if fees is not None:
448
+ parsed['fees'] = fees
449
+ parsed['trades'] = self.safe_value(order, 'trades')
450
+ parsed['timestamp'] = self.safe_integer(order, 'timestamp')
451
+ parsed['datetime'] = self.safe_string(order, 'datetime')
452
+ cachedOrders.append(parsed)
453
+ messageHash = 'myOrder'
454
+ client.resolve(self.orders, messageHash)
455
+ messageHash = messageHash + ':' + symbol
456
+ client.resolve(self.orders, messageHash)
457
+
458
+ async def watch_balance(self, params={}) -> Balances:
459
+ """
460
+ :see: https://global-docs.upbit.com/reference/websocket-myasset
461
+ query for balance and get the amount of funds available for trading or funds locked in orders
462
+ :param dict [params]: extra parameters specific to the exchange API endpoint
463
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
464
+ """
465
+ await self.load_markets()
466
+ channel = 'myAsset'
467
+ messageHash = 'myAsset'
468
+ return await self.watch_private(None, channel, messageHash)
469
+
470
+ def handle_balance(self, client: Client, message):
471
+ #
472
+ # {
473
+ # "type": "myAsset",
474
+ # "asset_uuid": "e635f223-1609-4969-8fb6-4376937baad6",
475
+ # "assets": [
476
+ # {
477
+ # "currency": "SGD",
478
+ # "balance": 1386929.37231066771348207123,
479
+ # "locked": 10329.670127489597585685
480
+ # }
481
+ # ],
482
+ # "asset_timestamp": 1710146517259,
483
+ # "timestamp": 1710146517267,
484
+ # "stream_type": "REALTIME"
485
+ # }
486
+ #
487
+ data = self.safe_list(message, 'assets', [])
488
+ timestamp = self.safe_integer(message, 'timestamp')
489
+ self.balance['timestamp'] = timestamp
490
+ self.balance['datetime'] = self.iso8601(timestamp)
491
+ for i in range(0, len(data)):
492
+ balance = data[i]
493
+ currencyId = self.safe_string(balance, 'currency')
494
+ code = self.safe_currency_code(currencyId)
495
+ available = self.safe_string(balance, 'balance')
496
+ frozen = self.safe_string(balance, 'locked')
497
+ account = self.account()
498
+ account['free'] = available
499
+ account['used'] = frozen
500
+ self.balance[code] = account
501
+ self.balance = self.safe_balance(self.balance)
502
+ messageHash = self.safe_string(message, 'type')
503
+ client.resolve(self.balance, messageHash)
504
+
216
505
  def handle_message(self, client: Client, message):
217
506
  methods: dict = {
218
507
  'ticker': self.handle_ticker,
219
508
  'orderbook': self.handle_order_book,
220
509
  'trade': self.handle_trades,
510
+ 'myOrder': self.handle_my_order,
511
+ 'myAsset': self.handle_balance,
221
512
  }
222
513
  methodName = self.safe_string(message, 'type')
223
514
  method = self.safe_value(methods, methodName)
ccxt/pro/wazirx.py CHANGED
@@ -505,20 +505,20 @@ class wazirx(ccxt.async_support.wazirx):
505
505
  market = self.safe_market(marketId)
506
506
  symbol = market['symbol']
507
507
  messageHash = 'orderbook:' + symbol
508
- currentOrderBook = self.safe_value(self.orderbooks, symbol)
509
- if currentOrderBook is None:
508
+ # currentOrderBook = self.safe_value(self.orderbooks, symbol)
509
+ if not (symbol in self.orderbooks):
510
510
  snapshot = self.parse_order_book(data, symbol, timestamp, 'b', 'a')
511
- orderBook = self.order_book(snapshot)
512
- self.orderbooks[symbol] = orderBook
511
+ self.orderbooks[symbol] = self.order_book(snapshot)
513
512
  else:
514
- asks = self.safe_value(data, 'a', [])
515
- bids = self.safe_value(data, 'b', [])
516
- self.handle_deltas(currentOrderBook['asks'], asks)
517
- self.handle_deltas(currentOrderBook['bids'], bids)
518
- currentOrderBook['nonce'] = timestamp
519
- currentOrderBook['timestamp'] = timestamp
520
- currentOrderBook['datetime'] = self.iso8601(timestamp)
521
- self.orderbooks[symbol] = currentOrderBook
513
+ orderbook = self.orderbooks[symbol]
514
+ asks = self.safe_list(data, 'a', [])
515
+ bids = self.safe_list(data, 'b', [])
516
+ self.handle_deltas(orderbook['asks'], asks)
517
+ self.handle_deltas(orderbook['bids'], bids)
518
+ orderbook['nonce'] = timestamp
519
+ orderbook['timestamp'] = timestamp
520
+ orderbook['datetime'] = self.iso8601(timestamp)
521
+ self.orderbooks[symbol] = orderbook
522
522
  client.resolve(self.orderbooks[symbol], messageHash)
523
523
 
524
524
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
ccxt/upbit.py CHANGED
@@ -1782,23 +1782,28 @@ class upbit(Exchange, ImplicitAPI):
1782
1782
  url += '?' + self.urlencode(query)
1783
1783
  if api == 'private':
1784
1784
  self.check_required_credentials()
1785
+ headers = {}
1785
1786
  nonce = self.uuid()
1786
1787
  request: dict = {
1787
1788
  'access_key': self.apiKey,
1788
1789
  'nonce': nonce,
1789
1790
  }
1790
- if query:
1791
- auth = self.urlencode(query)
1791
+ hasQuery = query
1792
+ auth = None
1793
+ if (method != 'GET') and (method != 'DELETE'):
1794
+ body = self.json(params)
1795
+ headers['Content-Type'] = 'application/json'
1796
+ if hasQuery:
1797
+ auth = self.urlencode(query)
1798
+ else:
1799
+ if hasQuery:
1800
+ auth = self.urlencode(self.keysort(query))
1801
+ if auth is not None:
1792
1802
  hash = self.hash(self.encode(auth), 'sha512')
1793
1803
  request['query_hash'] = hash
1794
1804
  request['query_hash_alg'] = 'SHA512'
1795
1805
  token = self.jwt(request, self.encode(self.secret), 'sha256')
1796
- headers = {
1797
- 'Authorization': 'Bearer ' + token,
1798
- }
1799
- if (method != 'GET') and (method != 'DELETE'):
1800
- body = self.json(params)
1801
- headers['Content-Type'] = 'application/json'
1806
+ headers['Authorization'] = 'Bearer ' + token
1802
1807
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
1803
1808
 
1804
1809
  def handle_errors(self, httpCode: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
ccxt/woo.py CHANGED
@@ -1212,7 +1212,9 @@ class woo(Exchange, ImplicitAPI):
1212
1212
  # "status":"CANCEL_ALL_SENT"
1213
1213
  # }
1214
1214
  #
1215
- return response
1215
+ return [
1216
+ self.safe_order(response),
1217
+ ]
1216
1218
 
1217
1219
  def cancel_all_orders_after(self, timeout: Int, params={}):
1218
1220
  """
@@ -1237,7 +1239,9 @@ class woo(Exchange, ImplicitAPI):
1237
1239
  # "timestamp": 1711534302943
1238
1240
  # }
1239
1241
  #
1240
- return response
1242
+ return [
1243
+ self.safe_order(response),
1244
+ ]
1241
1245
 
1242
1246
  def fetch_order(self, id: str, symbol: Str = None, params={}):
1243
1247
  """
ccxt/woofipro.py CHANGED
@@ -1561,7 +1561,9 @@ class woofipro(Exchange, ImplicitAPI):
1561
1561
  # }
1562
1562
  # }
1563
1563
  #
1564
- return response
1564
+ return [self.safe_order({
1565
+ 'info': response,
1566
+ })]
1565
1567
 
1566
1568
  def cancel_all_orders(self, symbol: Str = None, params={}):
1567
1569
  """
@@ -1600,7 +1602,11 @@ class woofipro(Exchange, ImplicitAPI):
1600
1602
  # }
1601
1603
  # }
1602
1604
  #
1603
- return response
1605
+ return [
1606
+ {
1607
+ 'info': response,
1608
+ },
1609
+ ]
1604
1610
 
1605
1611
  def fetch_order(self, id: str, symbol: Str = None, params={}):
1606
1612
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.3.39
3
+ Version: 4.3.41
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -266,13 +266,13 @@ console.log(version, Object.keys(exchanges));
266
266
 
267
267
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
268
268
 
269
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.39/dist/ccxt.browser.min.js
270
- * unpkg: https://unpkg.com/ccxt@4.3.39/dist/ccxt.browser.min.js
269
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.41/dist/ccxt.browser.min.js
270
+ * unpkg: https://unpkg.com/ccxt@4.3.41/dist/ccxt.browser.min.js
271
271
 
272
272
  CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
273
273
 
274
274
  ```HTML
275
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.39/dist/ccxt.browser.min.js"></script>
275
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.41/dist/ccxt.browser.min.js"></script>
276
276
  ```
277
277
 
278
278
  Creates a global `ccxt` object: