ccxt / ccxt

A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading API with support for more than 100 bitcoin/altcoin exchanges
https://docs.ccxt.com
MIT License
32.53k stars 7.47k forks source link

Kucoin fetch_ledger error when no ledger entries #21200

Closed WillPCowan closed 7 months ago

WillPCowan commented 7 months ago

Operating System

MacOS

Programming Languages

Python

CCXT Version

Tried 4.2.43 and 4.2.39

Description

I get the following error when using exchange.fetch_ledger, and the HTTP response has no ledger entries:

  File "/Users/me/Projects/company/scratch/fetch_all_internal_transfers.py", line 75, in fetch_all_transfers__kucoin
    fetched_transfers = await exchange.fetch_ledger(
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/me/Projects/company/.venv/lib/python3.11/site-packages/ccxt/async_support/kucoin.py", line 3731, in fetch_ledger
    return self.parse_ledger(items, currency, since, limit)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/me/Projects/company/.venv/lib/python3.11/site-packages/ccxt/base/exchange.py", line 3422, in parse_ledger
    for i in range(0, len(arrayData)):
                      ^^^^^^^^^^^^^^
TypeError: object of type 'NoneType' has no len()

I hot fix this by modifying /Users/me/Projects/company/.venv/lib/python3.11/site-packages/ccxt/base/exchange.py", line 3422 as such:

    def parse_ledger(self, data, currency: Currency = None, since: Int = None, limit: Int = None, params={}):
        result = []
        arrayData = self.to_array(data)
        ...

to

     def parse_ledger(self, data, currency: Currency = None, since: Int = None, limit: Int = None, params={}):
        result = []
        arrayData = self.to_array(data)
        arrayData = [] if (arrayData is None) else arrayData
        ...

Code

  
carlosmiei commented 7 months ago

Hello @WillPCowan, thanks for letting us know, we will take a look asap.

carlosmiei commented 7 months ago

@WillPCowan Interestingly I can't reproduce it, if you enable the verbose mode (exchange.verbose = True) which endpoint is used?

p kucoin fetchLedger          
Python v3.11.5
CCXT v4.2.43
kucoin.fetchLedger()
[]