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
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.
