ccxt 4.4.2__py2.py3-none-any.whl → 4.4.4__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 (87) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/bitmart.py +1 -0
  3. ccxt/async_support/__init__.py +1 -1
  4. ccxt/async_support/base/exchange.py +24 -13
  5. ccxt/async_support/base/ws/cache.py +1 -0
  6. ccxt/async_support/binance.py +50 -25
  7. ccxt/async_support/bingx.py +1 -0
  8. ccxt/async_support/bitfinex2.py +10 -9
  9. ccxt/async_support/bitget.py +13 -9
  10. ccxt/async_support/bitmart.py +3 -1
  11. ccxt/async_support/bitmex.py +14 -13
  12. ccxt/async_support/bitso.py +8 -7
  13. ccxt/async_support/bitstamp.py +36 -48
  14. ccxt/async_support/blofin.py +24 -26
  15. ccxt/async_support/bybit.py +26 -23
  16. ccxt/async_support/coinbase.py +31 -10
  17. ccxt/async_support/coinbaseexchange.py +14 -14
  18. ccxt/async_support/coinlist.py +9 -8
  19. ccxt/async_support/coinmetro.py +6 -6
  20. ccxt/async_support/cryptocom.py +12 -9
  21. ccxt/async_support/currencycom.py +9 -9
  22. ccxt/async_support/delta.py +8 -8
  23. ccxt/async_support/digifinex.py +11 -9
  24. ccxt/async_support/gate.py +9 -8
  25. ccxt/async_support/hashkey.py +12 -10
  26. ccxt/async_support/htx.py +16 -19
  27. ccxt/async_support/hyperliquid.py +70 -117
  28. ccxt/async_support/kraken.py +12 -10
  29. ccxt/async_support/kucoin.py +12 -11
  30. ccxt/async_support/luno.py +13 -12
  31. ccxt/async_support/mexc.py +49 -2
  32. ccxt/async_support/ndax.py +9 -8
  33. ccxt/async_support/okcoin.py +21 -30
  34. ccxt/async_support/okx.py +21 -29
  35. ccxt/async_support/woo.py +10 -9
  36. ccxt/async_support/woofipro.py +11 -9
  37. ccxt/async_support/xt.py +12 -7
  38. ccxt/async_support/zonda.py +9 -8
  39. ccxt/base/exchange.py +3 -1
  40. ccxt/binance.py +50 -25
  41. ccxt/bingx.py +1 -0
  42. ccxt/bitfinex2.py +10 -9
  43. ccxt/bitget.py +13 -9
  44. ccxt/bitmart.py +3 -1
  45. ccxt/bitmex.py +14 -13
  46. ccxt/bitso.py +8 -7
  47. ccxt/bitstamp.py +36 -48
  48. ccxt/blofin.py +24 -26
  49. ccxt/bybit.py +26 -23
  50. ccxt/coinbase.py +31 -10
  51. ccxt/coinbaseexchange.py +14 -14
  52. ccxt/coinlist.py +9 -8
  53. ccxt/coinmetro.py +6 -6
  54. ccxt/cryptocom.py +12 -9
  55. ccxt/currencycom.py +9 -9
  56. ccxt/delta.py +8 -8
  57. ccxt/digifinex.py +11 -9
  58. ccxt/gate.py +9 -8
  59. ccxt/hashkey.py +12 -10
  60. ccxt/htx.py +16 -19
  61. ccxt/hyperliquid.py +70 -117
  62. ccxt/kraken.py +12 -10
  63. ccxt/kucoin.py +12 -11
  64. ccxt/luno.py +13 -12
  65. ccxt/mexc.py +48 -2
  66. ccxt/ndax.py +9 -8
  67. ccxt/okcoin.py +21 -30
  68. ccxt/okx.py +21 -29
  69. ccxt/pro/__init__.py +1 -1
  70. ccxt/pro/bybit.py +51 -0
  71. ccxt/pro/cryptocom.py +181 -22
  72. ccxt/pro/mexc.py +154 -4
  73. ccxt/pro/okx.py +5 -3
  74. ccxt/pro/oxfun.py +70 -0
  75. ccxt/pro/phemex.py +41 -2
  76. ccxt/pro/woofipro.py +64 -0
  77. ccxt/test/tests_async.py +1 -1
  78. ccxt/test/tests_sync.py +1 -1
  79. ccxt/woo.py +10 -9
  80. ccxt/woofipro.py +11 -9
  81. ccxt/xt.py +12 -7
  82. ccxt/zonda.py +9 -8
  83. {ccxt-4.4.2.dist-info → ccxt-4.4.4.dist-info}/METADATA +5 -5
  84. {ccxt-4.4.2.dist-info → ccxt-4.4.4.dist-info}/RECORD +87 -87
  85. {ccxt-4.4.2.dist-info → ccxt-4.4.4.dist-info}/LICENSE.txt +0 -0
  86. {ccxt-4.4.2.dist-info → ccxt-4.4.4.dist-info}/WHEEL +0 -0
  87. {ccxt-4.4.2.dist-info → ccxt-4.4.4.dist-info}/top_level.txt +0 -0
@@ -6,7 +6,7 @@
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.bitstamp import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
9
+ from ccxt.base.types import Balances, Currencies, Currency, Int, LedgerEntry, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -402,46 +402,34 @@ class bitstamp(Exchange, ImplicitAPI):
402
402
  'trading': {
403
403
  'tierBased': True,
404
404
  'percentage': True,
405
- 'taker': self.parse_number('0.005'),
406
- 'maker': self.parse_number('0.005'),
405
+ 'taker': self.parse_number('0.004'),
406
+ 'maker': self.parse_number('0.004'),
407
407
  'tiers': {
408
408
  'taker': [
409
- [self.parse_number('0'), self.parse_number('0.005')],
410
- [self.parse_number('20000'), self.parse_number('0.0025')],
411
- [self.parse_number('100000'), self.parse_number('0.0024')],
412
- [self.parse_number('200000'), self.parse_number('0.0022')],
413
- [self.parse_number('400000'), self.parse_number('0.0020')],
414
- [self.parse_number('600000'), self.parse_number('0.0015')],
415
- [self.parse_number('1000000'), self.parse_number('0.0014')],
416
- [self.parse_number('2000000'), self.parse_number('0.0013')],
417
- [self.parse_number('4000000'), self.parse_number('0.0012')],
418
- [self.parse_number('20000000'), self.parse_number('0.0011')],
419
- [self.parse_number('50000000'), self.parse_number('0.0010')],
420
- [self.parse_number('100000000'), self.parse_number('0.0007')],
421
- [self.parse_number('500000000'), self.parse_number('0.0005')],
422
- [self.parse_number('2000000000'), self.parse_number('0.0003')],
423
- [self.parse_number('6000000000'), self.parse_number('0.0001')],
424
- [self.parse_number('20000000000'), self.parse_number('0.00005')],
425
- [self.parse_number('20000000001'), self.parse_number('0')],
409
+ [self.parse_number('0'), self.parse_number('0.004')],
410
+ [self.parse_number('10000'), self.parse_number('0.003')],
411
+ [self.parse_number('100000'), self.parse_number('0.002')],
412
+ [self.parse_number('500000'), self.parse_number('0.0018')],
413
+ [self.parse_number('1500000'), self.parse_number('0.0016')],
414
+ [self.parse_number('5000000'), self.parse_number('0.0012')],
415
+ [self.parse_number('20000000'), self.parse_number('0.001')],
416
+ [self.parse_number('50000000'), self.parse_number('0.0008')],
417
+ [self.parse_number('100000000'), self.parse_number('0.0006')],
418
+ [self.parse_number('250000000'), self.parse_number('0.0005')],
419
+ [self.parse_number('1000000000'), self.parse_number('0.0003')],
426
420
  ],
427
421
  'maker': [
428
- [self.parse_number('0'), self.parse_number('0.005')],
429
- [self.parse_number('20000'), self.parse_number('0.0025')],
430
- [self.parse_number('100000'), self.parse_number('0.0024')],
431
- [self.parse_number('200000'), self.parse_number('0.0022')],
432
- [self.parse_number('400000'), self.parse_number('0.0020')],
433
- [self.parse_number('600000'), self.parse_number('0.0015')],
434
- [self.parse_number('1000000'), self.parse_number('0.0014')],
435
- [self.parse_number('2000000'), self.parse_number('0.0013')],
436
- [self.parse_number('4000000'), self.parse_number('0.0012')],
437
- [self.parse_number('20000000'), self.parse_number('0.0011')],
438
- [self.parse_number('50000000'), self.parse_number('0.0010')],
439
- [self.parse_number('100000000'), self.parse_number('0.0007')],
440
- [self.parse_number('500000000'), self.parse_number('0.0005')],
441
- [self.parse_number('2000000000'), self.parse_number('0.0003')],
442
- [self.parse_number('6000000000'), self.parse_number('0.0001')],
443
- [self.parse_number('20000000000'), self.parse_number('0.00005')],
444
- [self.parse_number('20000000001'), self.parse_number('0')],
422
+ [self.parse_number('0'), self.parse_number('0.003')],
423
+ [self.parse_number('10000'), self.parse_number('0.002')],
424
+ [self.parse_number('100000'), self.parse_number('0.001')],
425
+ [self.parse_number('500000'), self.parse_number('0.0008')],
426
+ [self.parse_number('1500000'), self.parse_number('0.0006')],
427
+ [self.parse_number('5000000'), self.parse_number('0.0003')],
428
+ [self.parse_number('20000000'), self.parse_number('0.002')],
429
+ [self.parse_number('50000000'), self.parse_number('0.0001')],
430
+ [self.parse_number('100000000'), self.parse_number('0')],
431
+ [self.parse_number('250000000'), self.parse_number('0')],
432
+ [self.parse_number('1000000000'), self.parse_number('0')],
445
433
  ],
446
434
  },
447
435
  },
@@ -1843,7 +1831,7 @@ class bitstamp(Exchange, ImplicitAPI):
1843
1831
  }
1844
1832
  return self.safe_string(types, type, type)
1845
1833
 
1846
- def parse_ledger_entry(self, item: dict, currency: Currency = None):
1834
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
1847
1835
  #
1848
1836
  # [
1849
1837
  # {
@@ -1884,9 +1872,9 @@ class bitstamp(Exchange, ImplicitAPI):
1884
1872
  if market is None:
1885
1873
  market = self.get_market_from_trade(item)
1886
1874
  direction = 'in' if (parsedTrade['side'] == 'buy') else 'out'
1887
- return {
1888
- 'id': parsedTrade['id'],
1875
+ return self.safe_ledger_entry({
1889
1876
  'info': item,
1877
+ 'id': parsedTrade['id'],
1890
1878
  'timestamp': parsedTrade['timestamp'],
1891
1879
  'datetime': parsedTrade['datetime'],
1892
1880
  'direction': direction,
@@ -1900,7 +1888,7 @@ class bitstamp(Exchange, ImplicitAPI):
1900
1888
  'after': None,
1901
1889
  'status': 'ok',
1902
1890
  'fee': parsedTrade['fee'],
1903
- }
1891
+ }, currency)
1904
1892
  else:
1905
1893
  parsedTransaction = self.parse_transaction(item, currency)
1906
1894
  direction = None
@@ -1912,9 +1900,9 @@ class bitstamp(Exchange, ImplicitAPI):
1912
1900
  currency = self.currency(currencyCode)
1913
1901
  amount = self.safe_string(item, currency['id'])
1914
1902
  direction = 'in' if Precise.string_gt(amount, '0') else 'out'
1915
- return {
1916
- 'id': parsedTransaction['id'],
1903
+ return self.safe_ledger_entry({
1917
1904
  'info': item,
1905
+ 'id': parsedTransaction['id'],
1918
1906
  'timestamp': parsedTransaction['timestamp'],
1919
1907
  'datetime': parsedTransaction['datetime'],
1920
1908
  'direction': direction,
@@ -1928,15 +1916,15 @@ class bitstamp(Exchange, ImplicitAPI):
1928
1916
  'after': None,
1929
1917
  'status': parsedTransaction['status'],
1930
1918
  'fee': parsedTransaction['fee'],
1931
- }
1919
+ }, currency)
1932
1920
 
1933
- async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
1921
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
1934
1922
  """
1935
- fetch the history of changes, actions done by the user or operations that altered balance of the user
1923
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
1936
1924
  :see: https://www.bitstamp.net/api/#tag/Transactions-private/operation/GetUserTransactions
1937
- :param str code: unified currency code, default is None
1925
+ :param str [code]: unified currency code, default is None
1938
1926
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
1939
- :param int [limit]: max number of ledger entrys to return, default is None
1927
+ :param int [limit]: max number of ledger entries to return, default is None
1940
1928
  :param dict [params]: extra parameters specific to the exchange API endpoint
1941
1929
  :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
1942
1930
  """
@@ -6,7 +6,7 @@
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.blofin import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currency, Int, Leverage, Leverages, MarginMode, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry
9
+ from ccxt.base.types import Balances, Currency, Int, LedgerEntry, Leverage, Leverages, MarginMode, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -1413,17 +1413,17 @@ class blofin(Exchange, ImplicitAPI):
1413
1413
  data = self.safe_list(response, 'data', [])
1414
1414
  return self.parse_transactions(data, currency, since, limit, params)
1415
1415
 
1416
- async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
1416
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
1417
1417
  """
1418
- fetch the history of changes, actions done by the user or operations that altered balance of the user
1418
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
1419
1419
  :see: https://blofin.com/docs#get-funds-transfer-history
1420
- :param str code: unified currency code, default is None
1420
+ :param str [code]: unified currency code, default is None
1421
1421
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
1422
- :param int [limit]: max number of ledger entrys to return, default is None
1422
+ :param int [limit]: max number of ledger entries to return, default is None
1423
1423
  :param dict [params]: extra parameters specific to the exchange API endpoint
1424
1424
  :param str [params.marginMode]: 'cross' or 'isolated'
1425
1425
  :param int [params.until]: the latest time in ms to fetch entries for
1426
- :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
1426
+ :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
1427
1427
  :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
1428
1428
  """
1429
1429
  await self.load_markets()
@@ -1554,30 +1554,28 @@ class blofin(Exchange, ImplicitAPI):
1554
1554
  }
1555
1555
  return self.safe_string(types, type, type)
1556
1556
 
1557
- def parse_ledger_entry(self, item: dict, currency: Currency = None):
1558
- id = self.safe_string(item, 'transferId')
1559
- referenceId = self.safe_string(item, 'clientId')
1560
- fromAccount = self.safe_string(item, 'fromAccount')
1561
- toAccount = self.safe_string(item, 'toAccount')
1562
- type = self.parse_ledger_entry_type(self.safe_string(item, 'type'))
1563
- code = self.safe_currency_code(self.safe_string(item, 'currency'), currency)
1564
- amountString = self.safe_string(item, 'amount')
1565
- amount = self.parse_number(amountString)
1557
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
1558
+ currencyId = self.safe_string(item, 'currency')
1559
+ code = self.safe_currency_code(currencyId, currency)
1560
+ currency = self.safe_currency(currencyId, currency)
1566
1561
  timestamp = self.safe_integer(item, 'ts')
1567
- status = 'ok'
1568
- return {
1569
- 'id': id,
1562
+ return self.safe_ledger_entry({
1570
1563
  'info': item,
1564
+ 'id': self.safe_string(item, 'transferId'),
1565
+ 'direction': None,
1566
+ 'account': None,
1567
+ 'referenceId': self.safe_string(item, 'clientId'),
1568
+ 'referenceAccount': None,
1569
+ 'type': self.parse_ledger_entry_type(self.safe_string(item, 'type')),
1570
+ 'currency': code,
1571
+ 'amount': self.safe_number(item, 'amount'),
1571
1572
  'timestamp': timestamp,
1572
1573
  'datetime': self.iso8601(timestamp),
1573
- 'fromAccount': fromAccount,
1574
- 'toAccount': toAccount,
1575
- 'type': type,
1576
- 'currency': code,
1577
- 'amount': amount,
1578
- 'clientId': referenceId, # balance before
1579
- 'status': status,
1580
- }
1574
+ 'before': None,
1575
+ 'after': None,
1576
+ 'status': 'ok',
1577
+ 'fee': None,
1578
+ }, currency)
1581
1579
 
1582
1580
  def parse_ids(self, ids):
1583
1581
  """
@@ -7,13 +7,14 @@ from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.bybit import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
- from ccxt.base.types import Balances, CrossBorrowRate, Currencies, Currency, Greeks, Int, Leverage, LeverageTier, LeverageTiers, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
10
+ from ccxt.base.types import Balances, CrossBorrowRate, Currencies, Currency, Greeks, Int, LedgerEntry, Leverage, LeverageTier, LeverageTiers, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
13
  from ccxt.base.errors import AuthenticationError
14
14
  from ccxt.base.errors import PermissionDenied
15
15
  from ccxt.base.errors import ArgumentsRequired
16
16
  from ccxt.base.errors import BadRequest
17
+ from ccxt.base.errors import BadSymbol
17
18
  from ccxt.base.errors import NoChange
18
19
  from ccxt.base.errors import MarginModeAlreadySet
19
20
  from ccxt.base.errors import ManualInteractionNeeded
@@ -992,6 +993,7 @@ class bybit(Exchange, ImplicitAPI):
992
993
  '3200300': InsufficientFunds, # {"retCode":3200300,"retMsg":"Insufficient margin balance.","result":null,"retExtMap":{}}
993
994
  },
994
995
  'broad': {
996
+ 'Not supported symbols': BadSymbol, # {"retCode":10001,"retMsg":"Not supported symbols","result":{},"retExtInfo":{},"time":1726147060461}
995
997
  'Request timeout': RequestTimeout, # {"retCode":10016,"retMsg":"Request timeout, please try again later","result":{},"retExtInfo":{},"time":1675307914985}
996
998
  'unknown orderInfo': OrderNotFound, # {"ret_code":-1,"ret_msg":"unknown orderInfo","ext_code":"","ext_info":"","result":null,"time_now":"1584030414.005545","rate_limit_status":99,"rate_limit_reset_ms":1584030414003,"rate_limit":100}
997
999
  'invalid api_key': AuthenticationError, # {"ret_code":10003,"ret_msg":"invalid api_key","ext_code":"","ext_info":"","result":null,"time_now":"1599547085.415797"}
@@ -5495,15 +5497,15 @@ class bybit(Exchange, ImplicitAPI):
5495
5497
  'comment': None,
5496
5498
  }
5497
5499
 
5498
- async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
5500
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
5499
5501
  """
5500
- fetch the history of changes, actions done by the user or operations that altered balance of the user
5502
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
5501
5503
  :see: https://bybit-exchange.github.io/docs/v5/account/transaction-log
5502
5504
  :see: https://bybit-exchange.github.io/docs/v5/account/contract-transaction-log
5503
- :param str code: unified currency code, default is None
5505
+ :param str [code]: unified currency code, default is None
5504
5506
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
5505
- :param int [limit]: max number of ledger entrys to return, default is None
5506
- :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
5507
+ :param int [limit]: max number of ledger entries to return, default is None
5508
+ :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
5507
5509
  :param str [params.subType]: if inverse will use v5/account/contract-transaction-log
5508
5510
  :param dict [params]: extra parameters specific to the exchange API endpoint
5509
5511
  :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
@@ -5663,7 +5665,7 @@ class bybit(Exchange, ImplicitAPI):
5663
5665
  data = self.add_pagination_cursor_to_result(response)
5664
5666
  return self.parse_ledger(data, currency, since, limit)
5665
5667
 
5666
- def parse_ledger_entry(self, item: dict, currency: Currency = None):
5668
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
5667
5669
  #
5668
5670
  # {
5669
5671
  # "id": 234467,
@@ -5702,6 +5704,7 @@ class bybit(Exchange, ImplicitAPI):
5702
5704
  #
5703
5705
  currencyId = self.safe_string_2(item, 'coin', 'currency')
5704
5706
  code = self.safe_currency_code(currencyId, currency)
5707
+ currency = self.safe_currency(currencyId, currency)
5705
5708
  amount = self.safe_string_2(item, 'amount', 'change')
5706
5709
  after = self.safe_string_2(item, 'wallet_balance', 'cashBalance')
5707
5710
  direction = 'out' if Precise.string_lt(amount, '0') else 'in'
@@ -5712,26 +5715,26 @@ class bybit(Exchange, ImplicitAPI):
5712
5715
  timestamp = self.parse8601(self.safe_string(item, 'exec_time'))
5713
5716
  if timestamp is None:
5714
5717
  timestamp = self.safe_integer(item, 'transactionTime')
5715
- type = self.parse_ledger_entry_type(self.safe_string(item, 'type'))
5716
- id = self.safe_string(item, 'id')
5717
- referenceId = self.safe_string(item, 'tx_id')
5718
- return {
5719
- 'id': id,
5720
- 'currency': code,
5718
+ return self.safe_ledger_entry({
5719
+ 'info': item,
5720
+ 'id': self.safe_string(item, 'id'),
5721
+ 'direction': direction,
5721
5722
  'account': self.safe_string(item, 'wallet_id'),
5723
+ 'referenceId': self.safe_string(item, 'tx_id'),
5722
5724
  'referenceAccount': None,
5723
- 'referenceId': referenceId,
5724
- 'status': None,
5725
- 'amount': self.parse_number(Precise.string_abs(amount)),
5726
- 'before': self.parse_number(before),
5727
- 'after': self.parse_number(after),
5728
- 'fee': self.parse_number(self.safe_string(item, 'fee')),
5729
- 'direction': direction,
5725
+ 'type': self.parse_ledger_entry_type(self.safe_string(item, 'type')),
5726
+ 'currency': code,
5727
+ 'amount': self.parse_to_numeric(Precise.string_abs(amount)),
5730
5728
  'timestamp': timestamp,
5731
5729
  'datetime': self.iso8601(timestamp),
5732
- 'type': type,
5733
- 'info': item,
5734
- }
5730
+ 'before': self.parse_to_numeric(before),
5731
+ 'after': self.parse_to_numeric(after),
5732
+ 'status': 'ok',
5733
+ 'fee': {
5734
+ 'currency': code,
5735
+ 'cost': self.parse_to_numeric(self.safe_string(item, 'fee')),
5736
+ },
5737
+ }, currency)
5735
5738
 
5736
5739
  def parse_ledger_entry_type(self, type):
5737
5740
  types: dict = {
@@ -7,7 +7,7 @@ from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.coinbase import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
- from ccxt.base.types import Account, Balances, Conversion, Currencies, Currency, Int, Market, MarketInterface, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
10
+ from ccxt.base.types import Account, Balances, Conversion, Currencies, Currency, Int, LedgerEntry, Market, MarketInterface, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
13
  from ccxt.base.errors import AuthenticationError
@@ -2171,15 +2171,15 @@ class coinbase(Exchange, ImplicitAPI):
2171
2171
  params['type'] = marketType
2172
2172
  return self.parse_custom_balance(response, params)
2173
2173
 
2174
- async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
2174
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
2175
2175
  """
2176
- fetch the history of changes, actions done by the user or operations that altered balance of the user
2176
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
2177
2177
  :see: https://docs.cloud.coinbase.com/sign-in-with-coinbase/docs/api-transactions#list-transactions
2178
- :param str code: unified currency code, default is None
2178
+ :param str [code]: unified currency code, default is None
2179
2179
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
2180
- :param int [limit]: max number of ledger entrys to return, default is None
2180
+ :param int [limit]: max number of ledger entries to return, default is None
2181
2181
  :param dict [params]: extra parameters specific to the exchange API endpoint
2182
- :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
2182
+ :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
2183
2183
  :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
2184
2184
  """
2185
2185
  await self.load_markets()
@@ -2205,8 +2205,28 @@ class coinbase(Exchange, ImplicitAPI):
2205
2205
  pagination = self.safe_dict(response, 'pagination', {})
2206
2206
  cursor = self.safe_string(pagination, 'next_starting_after')
2207
2207
  if (cursor is not None) and (cursor != ''):
2208
+ lastFee = self.safe_dict(last, 'fee')
2208
2209
  last['next_starting_after'] = cursor
2209
- ledger[lastIndex] = last
2210
+ ledger[lastIndex] = {
2211
+ 'info': self.safe_dict(last, 'info'),
2212
+ 'id': self.safe_string(last, 'id'),
2213
+ 'timestamp': self.safe_integer(last, 'timestamp'),
2214
+ 'datetime': self.safe_string(last, 'datetime'),
2215
+ 'direction': self.safe_string(last, 'direction'),
2216
+ 'account': self.safe_string(last, 'account'),
2217
+ 'referenceId': None,
2218
+ 'referenceAccount': None,
2219
+ 'type': self.safe_string(last, 'type'),
2220
+ 'currency': self.safe_string(last, 'currency'),
2221
+ 'amount': self.safe_number(last, 'amount'),
2222
+ 'before': None,
2223
+ 'after': None,
2224
+ 'status': self.safe_string(last, 'status'),
2225
+ 'fee': {
2226
+ 'cost': self.safe_number(lastFee, 'cost'),
2227
+ 'currency': self.safe_string(lastFee, 'currency'),
2228
+ },
2229
+ }
2210
2230
  return ledger
2211
2231
 
2212
2232
  def parse_ledger_entry_status(self, status):
@@ -2229,7 +2249,7 @@ class coinbase(Exchange, ImplicitAPI):
2229
2249
  }
2230
2250
  return self.safe_string(types, type, type)
2231
2251
 
2232
- def parse_ledger_entry(self, item: dict, currency: Currency = None):
2252
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
2233
2253
  #
2234
2254
  # crypto deposit transaction
2235
2255
  #
@@ -2483,6 +2503,7 @@ class coinbase(Exchange, ImplicitAPI):
2483
2503
  direction = 'in'
2484
2504
  currencyId = self.safe_string(amountInfo, 'currency')
2485
2505
  code = self.safe_currency_code(currencyId, currency)
2506
+ currency = self.safe_currency(currencyId, currency)
2486
2507
  #
2487
2508
  # the address and txid do not belong to the unified ledger structure
2488
2509
  #
@@ -2515,7 +2536,7 @@ class coinbase(Exchange, ImplicitAPI):
2515
2536
  numParts = len(parts)
2516
2537
  if numParts > 3:
2517
2538
  accountId = parts[3]
2518
- return {
2539
+ return self.safe_ledger_entry({
2519
2540
  'info': item,
2520
2541
  'id': id,
2521
2542
  'timestamp': timestamp,
@@ -2531,7 +2552,7 @@ class coinbase(Exchange, ImplicitAPI):
2531
2552
  'after': None,
2532
2553
  'status': status,
2533
2554
  'fee': fee,
2534
- }
2555
+ }, currency)
2535
2556
 
2536
2557
  async def find_account_id(self, code, params={}):
2537
2558
  await self.load_markets()
@@ -6,7 +6,7 @@
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.coinbaseexchange import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Account, Balances, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
9
+ from ccxt.base.types import Account, Balances, Currencies, Currency, Int, LedgerEntry, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -1326,7 +1326,7 @@ class coinbaseexchange(Exchange, ImplicitAPI):
1326
1326
  }
1327
1327
  return self.safe_string(types, type, type)
1328
1328
 
1329
- def parse_ledger_entry(self, item: dict, currency: Currency = None):
1329
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
1330
1330
  # {
1331
1331
  # "id": "12087495079",
1332
1332
  # "amount": "-0.0100000000000000",
@@ -1378,31 +1378,31 @@ class coinbaseexchange(Exchange, ImplicitAPI):
1378
1378
  else:
1379
1379
  referenceId = self.safe_string(details, 'order_id')
1380
1380
  status = 'ok'
1381
- return {
1381
+ return self.safe_ledger_entry({
1382
+ 'info': item,
1382
1383
  'id': id,
1383
- 'currency': code,
1384
+ 'timestamp': timestamp,
1385
+ 'datetime': self.iso8601(timestamp),
1386
+ 'direction': direction,
1384
1387
  'account': account,
1385
1388
  'referenceAccount': referenceAccount,
1386
1389
  'referenceId': referenceId,
1387
- 'status': status,
1390
+ 'type': type,
1391
+ 'currency': code,
1388
1392
  'amount': amount,
1389
1393
  'before': before,
1390
1394
  'after': after,
1395
+ 'status': status,
1391
1396
  'fee': None,
1392
- 'direction': direction,
1393
- 'timestamp': timestamp,
1394
- 'datetime': self.iso8601(timestamp),
1395
- 'type': type,
1396
- 'info': item,
1397
- }
1397
+ }, currency)
1398
1398
 
1399
- async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
1399
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
1400
1400
  """
1401
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
1401
1402
  :see: https://docs.cloud.coinbase.com/exchange/reference/exchangerestapi_getaccountledger
1402
- fetch the history of changes, actions done by the user or operations that altered balance of the user
1403
1403
  :param str code: unified currency code, default is None
1404
1404
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
1405
- :param int [limit]: max number of ledger entrys to return, default is None
1405
+ :param int [limit]: max number of ledger entries to return, default is None
1406
1406
  :param dict [params]: extra parameters specific to the exchange API endpoint
1407
1407
  :param int [params.until]: the latest time in ms to fetch trades for
1408
1408
  :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
@@ -7,7 +7,7 @@ from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.coinlist import ImplicitAPI
8
8
  import hashlib
9
9
  import math
10
- from ccxt.base.types import Account, Balances, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction, TransferEntry
10
+ from ccxt.base.types import Account, Balances, Currencies, Currency, Int, LedgerEntry, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction, TransferEntry
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
13
  from ccxt.base.errors import AuthenticationError
@@ -1980,13 +1980,13 @@ class coinlist(Exchange, ImplicitAPI):
1980
1980
  }
1981
1981
  return self.safe_string(types, type, type)
1982
1982
 
1983
- async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
1983
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
1984
1984
  """
1985
- fetch the history of changes, actions done by the user or operations that altered balance of the user
1985
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
1986
1986
  :see: https://trade-docs.coinlist.co/?javascript--nodejs#get-account-history
1987
- :param str code: unified currency code, default is None
1987
+ :param str [code]: unified currency code, default is None
1988
1988
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
1989
- :param int [limit]: max number of ledger entrys to return(default 200, max 500)
1989
+ :param int [limit]: max number of ledger entries to return(default 200, max 500)
1990
1990
  :param dict [params]: extra parameters specific to the exchange API endpoint
1991
1991
  :param int [params.until]: the latest time in ms to fetch entries for
1992
1992
  :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
@@ -2079,7 +2079,7 @@ class coinlist(Exchange, ImplicitAPI):
2079
2079
  ledger = self.safe_value(response, 'transactions', [])
2080
2080
  return self.parse_ledger(ledger, currency, since, limit)
2081
2081
 
2082
- def parse_ledger_entry(self, item: dict, currency: Currency = None):
2082
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
2083
2083
  #
2084
2084
  # deposit transaction from wallet(funding) to pro(trading)
2085
2085
  # {
@@ -2163,8 +2163,9 @@ class coinlist(Exchange, ImplicitAPI):
2163
2163
  direction = 'in'
2164
2164
  currencyId = self.safe_string(item, 'asset')
2165
2165
  code = self.safe_currency_code(currencyId, currency)
2166
+ currency = self.safe_currency(currencyId, currency)
2166
2167
  type = self.parse_ledger_entry_type(self.safe_string(item, 'type'))
2167
- return {
2168
+ return self.safe_ledger_entry({
2168
2169
  'info': item,
2169
2170
  'id': id,
2170
2171
  'timestamp': timestamp,
@@ -2180,7 +2181,7 @@ class coinlist(Exchange, ImplicitAPI):
2180
2181
  'after': None,
2181
2182
  'status': 'ok',
2182
2183
  'fee': None,
2183
- }
2184
+ }, currency)
2184
2185
 
2185
2186
  def parse_ledger_entry_type(self, type):
2186
2187
  types: dict = {
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.coinmetro import ImplicitAPI
8
- from ccxt.base.types import Balances, Currencies, Currency, IndexType, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
8
+ from ccxt.base.types import Balances, Currencies, Currency, IndexType, Int, LedgerEntry, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import PermissionDenied
@@ -948,13 +948,13 @@ class coinmetro(Exchange, ImplicitAPI):
948
948
  result[code] = account
949
949
  return self.safe_balance(result)
950
950
 
951
- async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
951
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
952
952
  """
953
- fetch the history of changes, actions done by the user or operations that altered balance of the user
953
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
954
954
  :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#4e7831f7-a0e7-4c3e-9336-1d0e5dcb15cf
955
- :param str code: unified currency code, default is None
955
+ :param str [code]: unified currency code, default is None
956
956
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
957
- :param int [limit]: max number of ledger entrys to return(default 200, max 500)
957
+ :param int [limit]: max number of ledger entries to return(default 200, max 500)
958
958
  :param dict [params]: extra parameters specific to the exchange API endpoint
959
959
  :param int [params.until]: the latest time in ms to fetch entries for
960
960
  :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
@@ -1070,7 +1070,7 @@ class coinmetro(Exchange, ImplicitAPI):
1070
1070
  ledger.append(rawLedgerEntry)
1071
1071
  return self.parse_ledger(ledger, currency, since, limit)
1072
1072
 
1073
- def parse_ledger_entry(self, item: dict, currency: Currency = None):
1073
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
1074
1074
  datetime = self.safe_string(item, 'timestamp')
1075
1075
  currencyId = self.safe_string(item, 'currencyId')
1076
1076
  item = self.omit(item, 'currencyId')