51 lines
1.2 KiB
JavaScript
51 lines
1.2 KiB
JavaScript
|
const { toBN } = require('web3').utils
|
||
|
|
||
|
const ONE = toBN(1)
|
||
|
const TWO = toBN(2)
|
||
|
|
||
|
async function getPastEvents({ contract, event, fromBlock, toBlock, options }) {
|
||
|
let events
|
||
|
try {
|
||
|
events = await contract.getPastEvents(event, {
|
||
|
...options,
|
||
|
fromBlock,
|
||
|
toBlock
|
||
|
})
|
||
|
} catch (e) {
|
||
|
if (e.message.includes('query returned more than 1000 results')) {
|
||
|
const middle = fromBlock.add(toBlock).divRound(TWO)
|
||
|
const middlePlusOne = middle.add(ONE)
|
||
|
|
||
|
const firstHalfEvents = await getPastEvents({
|
||
|
contract,
|
||
|
event,
|
||
|
fromBlock,
|
||
|
toBlock: middle,
|
||
|
options
|
||
|
})
|
||
|
const secondHalfEvents = await getPastEvents({
|
||
|
contract,
|
||
|
event,
|
||
|
fromBlock: middlePlusOne,
|
||
|
toBlock,
|
||
|
options
|
||
|
})
|
||
|
events = [...firstHalfEvents, ...secondHalfEvents]
|
||
|
} else {
|
||
|
throw new Error(e)
|
||
|
}
|
||
|
}
|
||
|
return events
|
||
|
}
|
||
|
|
||
|
const getBlockNumberCall = web3 => web3.eth.getBlockNumber()
|
||
|
|
||
|
async function getBlockNumber(web3Home, web3Foreign) {
|
||
|
return (await Promise.all([web3Home, web3Foreign].map(getBlockNumberCall))).map(toBN)
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
getPastEvents,
|
||
|
getBlockNumber
|
||
|
}
|