ccxt 4.3.40__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.
- ccxt/__init__.py +1 -1
- ccxt/abstract/binance.py +2 -0
- ccxt/abstract/binancecoinm.py +2 -0
- ccxt/abstract/binanceus.py +2 -0
- ccxt/abstract/binanceusdm.py +2 -0
- ccxt/abstract/okx.py +7 -0
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/binance.py +3 -0
- ccxt/async_support/bitfinex2.py +1 -1
- ccxt/async_support/bithumb.py +9 -1
- ccxt/async_support/bitstamp.py +38 -2
- ccxt/async_support/coinlist.py +19 -1
- ccxt/async_support/coinmate.py +19 -3
- ccxt/async_support/coinone.py +1 -1
- ccxt/async_support/coinspot.py +11 -2
- ccxt/async_support/independentreserve.py +33 -1
- ccxt/async_support/indodax.py +43 -2
- ccxt/async_support/okx.py +7 -0
- ccxt/async_support/upbit.py +13 -8
- ccxt/async_support/woo.py +6 -2
- ccxt/base/exchange.py +1 -1
- ccxt/binance.py +3 -0
- ccxt/bitfinex2.py +1 -1
- ccxt/bithumb.py +9 -1
- ccxt/bitstamp.py +38 -2
- ccxt/coinlist.py +19 -1
- ccxt/coinmate.py +19 -3
- ccxt/coinone.py +1 -1
- ccxt/coinspot.py +11 -2
- ccxt/independentreserve.py +33 -1
- ccxt/indodax.py +43 -2
- ccxt/okx.py +7 -0
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/alpaca.py +5 -5
- ccxt/pro/ascendex.py +3 -3
- ccxt/pro/bingx.py +258 -42
- ccxt/pro/bitget.py +6 -5
- ccxt/pro/bitrue.py +3 -4
- ccxt/pro/currencycom.py +6 -5
- ccxt/pro/exmo.py +5 -6
- ccxt/pro/gemini.py +4 -3
- ccxt/pro/independentreserve.py +7 -7
- ccxt/pro/lbank.py +4 -4
- ccxt/pro/phemex.py +5 -5
- ccxt/pro/probit.py +4 -4
- ccxt/pro/upbit.py +295 -4
- ccxt/pro/wazirx.py +12 -12
- ccxt/upbit.py +13 -8
- ccxt/woo.py +6 -2
- {ccxt-4.3.40.dist-info → ccxt-4.3.41.dist-info}/METADATA +4 -4
- {ccxt-4.3.40.dist-info → ccxt-4.3.41.dist-info}/RECORD +54 -54
- {ccxt-4.3.40.dist-info → ccxt-4.3.41.dist-info}/WHEEL +0 -0
- {ccxt-4.3.40.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://
|
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
|
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
|
-
|
512
|
-
self.orderbooks[symbol] = orderBook
|
511
|
+
self.orderbooks[symbol] = self.order_book(snapshot)
|
513
512
|
else:
|
514
|
-
|
515
|
-
|
516
|
-
self.
|
517
|
-
self.handle_deltas(
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
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
|
-
|
1791
|
-
|
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
|
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
|
1242
|
+
return [
|
1243
|
+
self.safe_order(response),
|
1244
|
+
]
|
1241
1245
|
|
1242
1246
|
def fetch_order(self, id: str, symbol: Str = None, params={}):
|
1243
1247
|
"""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ccxt
|
3
|
-
Version: 4.3.
|
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.
|
270
|
-
* unpkg: https://unpkg.com/ccxt@4.3.
|
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.
|
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:
|