ccxt 4.3.11__py2.py3-none-any.whl → 4.3.12__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/async_support/__init__.py +1 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/bigone.py +22 -22
- ccxt/async_support/binance.py +7 -7
- ccxt/async_support/bingx.py +2 -2
- ccxt/async_support/bitget.py +10 -8
- ccxt/async_support/bitmart.py +7 -11
- ccxt/async_support/bitmex.py +2 -2
- ccxt/async_support/bybit.py +75 -65
- ccxt/async_support/coinbase.py +8 -8
- ccxt/async_support/coinbaseinternational.py +2 -2
- ccxt/async_support/coinex.py +501 -445
- ccxt/async_support/coinlist.py +12 -12
- ccxt/async_support/coinmetro.py +2 -2
- ccxt/async_support/cryptocom.py +16 -16
- ccxt/async_support/digifinex.py +3 -3
- ccxt/async_support/gate.py +2 -2
- ccxt/async_support/hitbtc.py +3 -3
- ccxt/async_support/htx.py +6 -9
- ccxt/async_support/indodax.py +2 -2
- ccxt/async_support/kraken.py +3 -1
- ccxt/async_support/kucoin.py +4 -4
- ccxt/async_support/kucoinfutures.py +6 -6
- ccxt/async_support/mexc.py +5 -5
- ccxt/async_support/okx.py +9 -9
- ccxt/async_support/poloniexfutures.py +4 -4
- ccxt/async_support/probit.py +2 -2
- ccxt/async_support/whitebit.py +72 -1
- ccxt/async_support/woo.py +2 -2
- ccxt/base/exchange.py +14 -2
- ccxt/base/types.py +25 -0
- ccxt/bigone.py +22 -22
- ccxt/binance.py +7 -7
- ccxt/bingx.py +2 -2
- ccxt/bitget.py +10 -8
- ccxt/bitmart.py +7 -11
- ccxt/bitmex.py +2 -2
- ccxt/bybit.py +75 -65
- ccxt/coinbase.py +8 -8
- ccxt/coinbaseinternational.py +2 -2
- ccxt/coinex.py +501 -445
- ccxt/coinlist.py +12 -12
- ccxt/coinmetro.py +2 -2
- ccxt/cryptocom.py +16 -16
- ccxt/digifinex.py +3 -3
- ccxt/gate.py +2 -2
- ccxt/hitbtc.py +3 -3
- ccxt/htx.py +6 -9
- ccxt/indodax.py +2 -2
- ccxt/kraken.py +3 -1
- ccxt/kucoin.py +4 -4
- ccxt/kucoinfutures.py +6 -6
- ccxt/mexc.py +5 -5
- ccxt/okx.py +9 -9
- ccxt/poloniexfutures.py +4 -4
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/bitget.py +139 -87
- ccxt/pro/bybit.py +192 -12
- ccxt/pro/coinbase.py +90 -20
- ccxt/pro/mexc.py +21 -1
- ccxt/probit.py +2 -2
- ccxt/test/base/test_datetime.py +6 -0
- ccxt/test/base/test_ledger_entry.py +2 -2
- ccxt/whitebit.py +72 -1
- ccxt/woo.py +2 -2
- {ccxt-4.3.11.dist-info → ccxt-4.3.12.dist-info}/METADATA +4 -4
- {ccxt-4.3.11.dist-info → ccxt-4.3.12.dist-info}/RECORD +70 -72
- ccxt/async_support/flowbtc.py +0 -34
- ccxt/flowbtc.py +0 -34
- {ccxt-4.3.11.dist-info → ccxt-4.3.12.dist-info}/WHEEL +0 -0
- {ccxt-4.3.11.dist-info → ccxt-4.3.12.dist-info}/top_level.txt +0 -0
ccxt/pro/coinbase.py
CHANGED
@@ -31,10 +31,12 @@ class coinbase(ccxt.async_support.coinbase):
|
|
31
31
|
'watchMyTrades': False,
|
32
32
|
'watchOHLCV': False,
|
33
33
|
'watchOrderBook': True,
|
34
|
+
'watchOrderBookForSymbols': True,
|
34
35
|
'watchOrders': True,
|
35
36
|
'watchTicker': True,
|
36
37
|
'watchTickers': True,
|
37
38
|
'watchTrades': True,
|
39
|
+
'watchTradesForSymbols': True,
|
38
40
|
},
|
39
41
|
'urls': {
|
40
42
|
'api': {
|
@@ -76,7 +78,6 @@ class coinbase(ccxt.async_support.coinbase):
|
|
76
78
|
messageHash = name + '::' + market['id']
|
77
79
|
productIds = [market['id']]
|
78
80
|
url = self.urls['api']['ws']
|
79
|
-
timestamp = self.number_to_string(self.seconds())
|
80
81
|
subscribe = {
|
81
82
|
'type': 'subscribe',
|
82
83
|
'product_ids': productIds,
|
@@ -86,27 +87,63 @@ class coinbase(ccxt.async_support.coinbase):
|
|
86
87
|
# 'signature': self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256),
|
87
88
|
}
|
88
89
|
if isPrivate:
|
89
|
-
self.
|
90
|
-
isCloudAPiKey = (self.apiKey.find('organizations/') >= 0) or (self.secret.startswith('-----BEGIN'))
|
91
|
-
auth = timestamp + name + ','.join(productIds)
|
92
|
-
if not isCloudAPiKey:
|
93
|
-
subscribe['api_key'] = self.apiKey
|
94
|
-
subscribe['timestamp'] = timestamp
|
95
|
-
subscribe['signature'] = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
|
96
|
-
else:
|
97
|
-
if self.apiKey.startswith('-----BEGIN'):
|
98
|
-
raise ArgumentsRequired(self.id + ' apiKey should contain the name(eg: organizations/3b910e93....) and not the public key')
|
99
|
-
currentToken = self.safe_string(self.options, 'wsToken')
|
100
|
-
tokenTimestamp = self.safe_integer(self.options, 'wsTokenTimestamp', 0)
|
101
|
-
seconds = self.seconds()
|
102
|
-
if currentToken is None or tokenTimestamp + 120 < seconds:
|
103
|
-
# we should generate new token
|
104
|
-
token = self.create_auth_token(seconds)
|
105
|
-
self.options['wsToken'] = token
|
106
|
-
self.options['wsTokenTimestamp'] = seconds
|
107
|
-
subscribe['jwt'] = self.safe_string(self.options, 'wsToken')
|
90
|
+
subscribe = self.extend(subscribe, self.create_ws_auth(name, productIds))
|
108
91
|
return await self.watch(url, messageHash, subscribe, messageHash)
|
109
92
|
|
93
|
+
async def subscribe_multiple(self, name: str, isPrivate: bool, symbols: Strings = None, params={}):
|
94
|
+
"""
|
95
|
+
* @ignore
|
96
|
+
subscribes to a websocket channel
|
97
|
+
:see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
|
98
|
+
:param str name: the name of the channel
|
99
|
+
:param str[] [symbols]: unified market symbol
|
100
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
101
|
+
:returns dict: subscription to a websocket channel
|
102
|
+
"""
|
103
|
+
await self.load_markets()
|
104
|
+
productIds = []
|
105
|
+
messageHashes = []
|
106
|
+
symbols = self.market_symbols(symbols, None, False)
|
107
|
+
for i in range(0, len(symbols)):
|
108
|
+
symbol = symbols[i]
|
109
|
+
market = self.market(symbol)
|
110
|
+
marketId = market['id']
|
111
|
+
productIds.append(marketId)
|
112
|
+
messageHashes.append(name + '::' + marketId)
|
113
|
+
url = self.urls['api']['ws']
|
114
|
+
subscribe = {
|
115
|
+
'type': 'subscribe',
|
116
|
+
'product_ids': productIds,
|
117
|
+
'channel': name,
|
118
|
+
}
|
119
|
+
if isPrivate:
|
120
|
+
subscribe = self.extend(subscribe, self.create_ws_auth(name, productIds))
|
121
|
+
return await self.watch_multiple(url, messageHashes, subscribe, messageHashes)
|
122
|
+
|
123
|
+
def create_ws_auth(self, name: str, productIds: List[str]):
|
124
|
+
subscribe = {}
|
125
|
+
timestamp = self.number_to_string(self.seconds())
|
126
|
+
self.check_required_credentials()
|
127
|
+
isCloudAPiKey = (self.apiKey.find('organizations/') >= 0) or (self.secret.startswith('-----BEGIN'))
|
128
|
+
auth = timestamp + name + ','.join(productIds)
|
129
|
+
if not isCloudAPiKey:
|
130
|
+
subscribe['api_key'] = self.apiKey
|
131
|
+
subscribe['timestamp'] = timestamp
|
132
|
+
subscribe['signature'] = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
|
133
|
+
else:
|
134
|
+
if self.apiKey.startswith('-----BEGIN'):
|
135
|
+
raise ArgumentsRequired(self.id + ' apiKey should contain the name(eg: organizations/3b910e93....) and not the public key')
|
136
|
+
currentToken = self.safe_string(self.options, 'wsToken')
|
137
|
+
tokenTimestamp = self.safe_integer(self.options, 'wsTokenTimestamp', 0)
|
138
|
+
seconds = self.seconds()
|
139
|
+
if currentToken is None or tokenTimestamp + 120 < seconds:
|
140
|
+
# we should generate new token
|
141
|
+
token = self.create_auth_token(seconds)
|
142
|
+
self.options['wsToken'] = token
|
143
|
+
self.options['wsTokenTimestamp'] = seconds
|
144
|
+
subscribe['jwt'] = self.safe_string(self.options, 'wsToken')
|
145
|
+
return subscribe
|
146
|
+
|
110
147
|
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
111
148
|
"""
|
112
149
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
@@ -289,6 +326,25 @@ class coinbase(ccxt.async_support.coinbase):
|
|
289
326
|
limit = trades.getLimit(symbol, limit)
|
290
327
|
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
291
328
|
|
329
|
+
async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
330
|
+
"""
|
331
|
+
get the list of most recent trades for a particular symbol
|
332
|
+
:see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
|
333
|
+
:param str[] symbols: unified symbol of the market to fetch trades for
|
334
|
+
:param int [since]: timestamp in ms of the earliest trade to fetch
|
335
|
+
:param int [limit]: the maximum amount of trades to fetch
|
336
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
337
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
338
|
+
"""
|
339
|
+
await self.load_markets()
|
340
|
+
name = 'market_trades'
|
341
|
+
trades = await self.subscribe_multiple(name, False, symbols, params)
|
342
|
+
if self.newUpdates:
|
343
|
+
first = self.safe_dict(trades, 0)
|
344
|
+
tradeSymbol = self.safe_string(first, 'symbol')
|
345
|
+
limit = trades.getLimit(tradeSymbol, limit)
|
346
|
+
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
347
|
+
|
292
348
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
293
349
|
"""
|
294
350
|
watches information on multiple orders made by the user
|
@@ -322,6 +378,20 @@ class coinbase(ccxt.async_support.coinbase):
|
|
322
378
|
orderbook = await self.subscribe(name, False, symbol, params)
|
323
379
|
return orderbook.limit()
|
324
380
|
|
381
|
+
async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
|
382
|
+
"""
|
383
|
+
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
384
|
+
:see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
|
385
|
+
:param str[] symbols: unified array of symbols
|
386
|
+
:param int [limit]: the maximum amount of order book entries to return
|
387
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
388
|
+
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
389
|
+
"""
|
390
|
+
await self.load_markets()
|
391
|
+
name = 'level2'
|
392
|
+
orderbook = await self.subscribe_multiple(name, False, symbols, params)
|
393
|
+
return orderbook.limit()
|
394
|
+
|
325
395
|
def handle_trade(self, client, message):
|
326
396
|
#
|
327
397
|
# {
|
ccxt/pro/mexc.py
CHANGED
@@ -665,6 +665,21 @@ class mexc(ccxt.async_support.mexc):
|
|
665
665
|
# "v": "5"
|
666
666
|
# }
|
667
667
|
#
|
668
|
+
#
|
669
|
+
# d: {
|
670
|
+
# p: '1.0005',
|
671
|
+
# v: '5.71',
|
672
|
+
# a: '5.712855',
|
673
|
+
# S: 1,
|
674
|
+
# T: 1714325698237,
|
675
|
+
# t: 'edafcd9fdc2f426e82443d114691f724',
|
676
|
+
# c: '',
|
677
|
+
# i: 'C02__413321238354677760043',
|
678
|
+
# m: 0,
|
679
|
+
# st: 0,
|
680
|
+
# n: '0.005712855',
|
681
|
+
# N: 'USDT'
|
682
|
+
# }
|
668
683
|
timestamp = self.safe_integer(trade, 'T')
|
669
684
|
tradeId = self.safe_string(trade, 't')
|
670
685
|
if timestamp is None:
|
@@ -675,6 +690,8 @@ class mexc(ccxt.async_support.mexc):
|
|
675
690
|
rawSide = self.safe_string(trade, 'S')
|
676
691
|
side = 'buy' if (rawSide == '1') else 'sell'
|
677
692
|
isMaker = self.safe_integer(trade, 'm')
|
693
|
+
feeAmount = self.safe_number(trade, 'n')
|
694
|
+
feeCurrencyId = self.safe_string(trade, 'N')
|
678
695
|
return self.safe_trade({
|
679
696
|
'info': trade,
|
680
697
|
'id': tradeId,
|
@@ -688,7 +705,10 @@ class mexc(ccxt.async_support.mexc):
|
|
688
705
|
'price': priceString,
|
689
706
|
'amount': amountString,
|
690
707
|
'cost': None,
|
691
|
-
'fee':
|
708
|
+
'fee': {
|
709
|
+
'cost': feeAmount,
|
710
|
+
'currency': self.safe_currency_code(feeCurrencyId),
|
711
|
+
},
|
692
712
|
}, market)
|
693
713
|
|
694
714
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
ccxt/probit.py
CHANGED
@@ -1428,10 +1428,10 @@ class probit(Exchange, ImplicitAPI):
|
|
1428
1428
|
request['start_time'] = self.iso8601(since)
|
1429
1429
|
else:
|
1430
1430
|
request['start_time'] = self.iso8601(1)
|
1431
|
-
until = self.
|
1431
|
+
until = self.safe_integer(params, 'until')
|
1432
1432
|
if until is not None:
|
1433
1433
|
request['end_time'] = self.iso8601(until)
|
1434
|
-
params = self.omit(params, ['until'
|
1434
|
+
params = self.omit(params, ['until'])
|
1435
1435
|
else:
|
1436
1436
|
request['end_time'] = self.iso8601(self.milliseconds())
|
1437
1437
|
if limit is not None:
|
ccxt/test/base/test_datetime.py
CHANGED
@@ -62,6 +62,12 @@ assert exchange.parse8601(33) is None
|
|
62
62
|
assert exchange.parse_date('1986-04-26 00:00:00') == 514857600000
|
63
63
|
assert exchange.parse_date('1986-04-26T01:23:47.000Z') == 514862627000
|
64
64
|
assert exchange.parse_date('1986-13-13 00:00:00') is None
|
65
|
+
# GMT formats
|
66
|
+
assert exchange.parse_date('Mon, 29 Apr 2024 14:00:17 GMT') == 1714399217000
|
67
|
+
assert exchange.parse_date('Mon, 29 Apr 2024 14:09:17 GMT') == 1714399757000
|
68
|
+
assert exchange.parse_date('Sun, 29 Dec 2024 01:01:10 GMT') == 1735434070000
|
69
|
+
assert exchange.parse_date('Sun, 29 Dec 2024 02:11:10 GMT') == 1735438270000
|
70
|
+
assert exchange.parse_date('Sun, 08 Dec 2024 02:03:04 GMT') == 1733623384000
|
65
71
|
|
66
72
|
|
67
73
|
assert exchange.roundTimeframe('5m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_DOWN) == exchange.parse8601('2019-08-12 13:20:00')
|
@@ -20,8 +20,8 @@ def test_ledger_entry(exchange, skipped_properties, method, entry, requested_cod
|
|
20
20
|
'id': 'x1234',
|
21
21
|
'currency': 'BTC',
|
22
22
|
'account': 'spot',
|
23
|
-
'referenceId': '',
|
24
|
-
'referenceAccount': '',
|
23
|
+
'referenceId': 'foo',
|
24
|
+
'referenceAccount': 'bar',
|
25
25
|
'status': 'ok',
|
26
26
|
'amount': exchange.parse_number('22'),
|
27
27
|
'before': exchange.parse_number('111'),
|
ccxt/whitebit.py
CHANGED
@@ -60,6 +60,7 @@ class whitebit(Exchange, ImplicitAPI):
|
|
60
60
|
'fetchDeposit': True,
|
61
61
|
'fetchDepositAddress': True,
|
62
62
|
'fetchDeposits': True,
|
63
|
+
'fetchDepositsWithdrawals': True,
|
63
64
|
'fetchDepositWithdrawFee': 'emulated',
|
64
65
|
'fetchDepositWithdrawFees': True,
|
65
66
|
'fetchFundingHistory': False,
|
@@ -1852,6 +1853,7 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1852
1853
|
# {
|
1853
1854
|
# "address": "3ApEASLcrQtZpg1TsssFgYF5V5YQJAKvuE", # deposit address
|
1854
1855
|
# "uniqueId": null, # unique Id of deposit
|
1856
|
+
# "transactionId": "a6d71d69-2b17-4ad8-8b15-2d686c54a1a5",
|
1855
1857
|
# "createdAt": 1593437922, # timestamp of deposit
|
1856
1858
|
# "currency": "Bitcoin", # deposit currency
|
1857
1859
|
# "ticker": "BTC", # deposit currency ticker
|
@@ -1875,6 +1877,7 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1875
1877
|
# "actual": 1, # current block confirmations
|
1876
1878
|
# "required": 2 # required block confirmation for successful deposit
|
1877
1879
|
# }
|
1880
|
+
# "centralized": False,
|
1878
1881
|
# }
|
1879
1882
|
#
|
1880
1883
|
currency = self.safe_currency(None, currency)
|
@@ -1885,7 +1888,7 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1885
1888
|
method = self.safe_string(transaction, 'method')
|
1886
1889
|
return {
|
1887
1890
|
'id': self.safe_string(transaction, 'uniqueId'),
|
1888
|
-
'txid': self.safe_string(transaction, '
|
1891
|
+
'txid': self.safe_string(transaction, 'transactionId'),
|
1889
1892
|
'timestamp': timestamp,
|
1890
1893
|
'datetime': self.iso8601(timestamp),
|
1891
1894
|
'network': self.safe_string(transaction, 'network'),
|
@@ -2263,6 +2266,74 @@ class whitebit(Exchange, ImplicitAPI):
|
|
2263
2266
|
'previousFundingDatetime': None,
|
2264
2267
|
}
|
2265
2268
|
|
2269
|
+
def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
2270
|
+
"""
|
2271
|
+
fetch history of deposits and withdrawals
|
2272
|
+
:see: https://github.com/whitebit-exchange/api-docs/blob/main/pages/private/http-main-v4.md#get-depositwithdraw-history
|
2273
|
+
:param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
|
2274
|
+
:param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
|
2275
|
+
:param int [limit]: max number of deposit/withdrawals to return, default = 50, Min: 1, Max: 100
|
2276
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2277
|
+
*
|
2278
|
+
* EXCHANGE SPECIFIC PARAMETERS
|
2279
|
+
:param number [params.transactionMethod]: Method. Example: 1 to display deposits / 2 to display withdraws. Do not send self parameter in order to receive both deposits and withdraws.
|
2280
|
+
:param str [params.address]: Can be used for filtering transactions by specific address or memo.
|
2281
|
+
:param str[] [params.addresses]: Can be used for filtering transactions by specific addresses or memos(max: 20).
|
2282
|
+
:param str [params.uniqueId]: Can be used for filtering transactions by specific unique id
|
2283
|
+
:param int [params.offset]: If you want the request to return entries starting from a particular line, you can use OFFSET clause to tell it where it should start. Default: 0, Min: 0, Max: 10000
|
2284
|
+
:param str[] [params.status]: Can be used for filtering transactions by status codes. Caution: You must use self parameter with appropriate transactionMethod and use valid status codes for self method. You can find them below. Example: "status": [3,7]
|
2285
|
+
:returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
|
2286
|
+
"""
|
2287
|
+
self.load_markets()
|
2288
|
+
request = {}
|
2289
|
+
currency = None
|
2290
|
+
if code is not None:
|
2291
|
+
currency = self.currency(code)
|
2292
|
+
request['ticker'] = currency['id']
|
2293
|
+
if limit is not None:
|
2294
|
+
request['limit'] = limit # default 1000
|
2295
|
+
response = self.v4PrivatePostMainAccountHistory(self.extend(request, params))
|
2296
|
+
#
|
2297
|
+
# {
|
2298
|
+
# "limit": 100,
|
2299
|
+
# "offset": 0,
|
2300
|
+
# "records": [
|
2301
|
+
# {
|
2302
|
+
# "address": "3ApEASLcrQtZpg1TsssFgYF5V5YQJAKvuE", # deposit address
|
2303
|
+
# "uniqueId": null, # unique Id of deposit
|
2304
|
+
# "createdAt": 1593437922, # timestamp of deposit
|
2305
|
+
# "currency": "Bitcoin", # deposit currency
|
2306
|
+
# "ticker": "BTC", # deposit currency ticker
|
2307
|
+
# "method": 1, # called method 1 - deposit, 2 - withdraw
|
2308
|
+
# "amount": "0.0006", # amount of deposit
|
2309
|
+
# "description": "", # deposit description
|
2310
|
+
# "memo": "", # deposit memo
|
2311
|
+
# "fee": "0", # deposit fee
|
2312
|
+
# "status": 15, # transactions status
|
2313
|
+
# "network": null, # if currency is multinetwork
|
2314
|
+
# "transactionHash": "a275a514013e4e0f927fd0d1bed215e7f6f2c4c6ce762836fe135ec22529d886", # deposit transaction hash
|
2315
|
+
# "transactionId": "5e112b38-9652-11ed-a1eb-0242ac120002", # transaction id
|
2316
|
+
# "details": {
|
2317
|
+
# "partial": { # details about partially successful withdrawals
|
2318
|
+
# "requestAmount": "50000", # requested withdrawal amount
|
2319
|
+
# "processedAmount": "39000", # processed withdrawal amount
|
2320
|
+
# "processedFee": "273", # fee for processed withdrawal amount
|
2321
|
+
# "normalizeTransaction": "" # deposit id
|
2322
|
+
# }
|
2323
|
+
# },
|
2324
|
+
# "confirmations": { # if transaction status == 15(Pending) you can see self object
|
2325
|
+
# "actual": 1, # current block confirmations
|
2326
|
+
# "required": 2 # required block confirmation for successful deposit
|
2327
|
+
# }
|
2328
|
+
# },
|
2329
|
+
# {...},
|
2330
|
+
# ],
|
2331
|
+
# "total": 300 # total number of transactions, use self for calculating ‘limit’ and ‘offset'
|
2332
|
+
# }
|
2333
|
+
#
|
2334
|
+
records = self.safe_list(response, 'records')
|
2335
|
+
return self.parse_transactions(records, currency, since, limit)
|
2336
|
+
|
2266
2337
|
def is_fiat(self, currency):
|
2267
2338
|
fiatCurrencies = self.safe_value(self.options, 'fiatCurrencies', [])
|
2268
2339
|
return self.in_array(currency, fiatCurrencies)
|
ccxt/woo.py
CHANGED
@@ -2156,8 +2156,8 @@ class woo(Exchange, ImplicitAPI):
|
|
2156
2156
|
request['size'] = limit
|
2157
2157
|
if since is not None:
|
2158
2158
|
request['start_t'] = since
|
2159
|
-
until = self.
|
2160
|
-
params = self.omit(params, ['until'
|
2159
|
+
until = self.safe_integer(params, 'until') # unified in milliseconds
|
2160
|
+
params = self.omit(params, ['until'])
|
2161
2161
|
if until is not None:
|
2162
2162
|
request['end_t'] = until
|
2163
2163
|
response = self.v1PrivateGetAssetMainSubTransferHistory(self.extend(request, params))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ccxt
|
3
|
-
Version: 4.3.
|
3
|
+
Version: 4.3.12
|
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
|
@@ -262,13 +262,13 @@ console.log(version, Object.keys(exchanges));
|
|
262
262
|
|
263
263
|
All-in-one browser bundle (dependencies included), served from a CDN of your choice:
|
264
264
|
|
265
|
-
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.
|
266
|
-
* unpkg: https://unpkg.com/ccxt@4.3.
|
265
|
+
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.12/dist/ccxt.browser.js
|
266
|
+
* unpkg: https://unpkg.com/ccxt@4.3.12/dist/ccxt.browser.js
|
267
267
|
|
268
268
|
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.
|
269
269
|
|
270
270
|
```HTML
|
271
|
-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.
|
271
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.12/dist/ccxt.browser.js"></script>
|
272
272
|
```
|
273
273
|
|
274
274
|
Creates a global `ccxt` object:
|