getPastEvents sometimes returns null. Throws error: events is not iterable

Viewed 159

I wrote a recursive function that uses getPastEvents to fetch past events. If a Returned error: query returned more than 10000 results i split the range of blocks in half and send two queries again.

let getPastEvents = (from: number, to: number): Promise <void> => {

    return new Promise(function(resolve, reject) {

        let running_jobs = 0;

        let getPastEvents_recursive = (from: number, to: number): void => {

            running_jobs += 1;

            token.getPastEvents('allEvents', {
                fromBlock: from,
                toBlock: to
            }).then((events: EventData[]) => {
                
                // FUNCTIONS TO TEST EVENTS TYPE
                function isNull(obj:any) {
                    return obj == null;
                }

                function isIterable(obj:any) {
                    return typeof obj[Symbol.iterator] === 'function';
                }

                if (isNull(events)) {

                    console.error("Events is null. Type:", typeof events);
                    console.error(events);

                } else if (!isIterable(events)) {

                    console.error("Events is not iterable. Type:", typeof events);
                    console.error(events);

                }

                // ERROR THROWN HERE
                for (const event of events) {
                    // process_Event(event);
                }

                logger.info(
                    "Transfer count -",
                    String(from).padStart(7, '0'),
                    String(to).padStart(7, '0'),
                    events.length
                );

                running_jobs -= 1;

                if (running_jobs == 0) {
                    resolve();
                }

            }).catch((error: Error) => {

                if (error.message === 'events is not iterable') {

                    logger.error(error);

                }

                if (error.message === 'Returned error: query returned more than 10000 results') {

                    const middle = Math.floor((from + to) / 2);
                    getPastEvents_recursive(from, middle);
                    getPastEvents_recursive(middle + 1, to);
                    
                } else {
                    logger.error(
                        String(from).padStart(7, '0'),
                        String(to).padStart(7, '0'),
                        `Unhandled error -`,
                        error.message
                    );
                    getPastEvents_recursive(from, to);
                }

                running_jobs -= 1;
            });

        }

        getPastEvents_recursive(from, to);

    });

}

Sample output below

Sample output

I completely don't understand why this would happen. I tried looking into the source code for getPastEvents but I'm having trouble finding the actual implementation instead of iterfaces in the package in node_modules.

I'm using Web3 infura http provider, and the rinkeby test network.

0 Answers
Related