eth-json-rpc-filters/log-filter.js

60 lines
1.6 KiB
JavaScript

const BaseFilter = require('./base-filter')
class LogFilter extends BaseFilter {
constructor ({ ethQuery, params }) {
super()
this.type = 'log'
this.ethQuery = ethQuery
this.params = Object.assign({
fromBlock: 'earliest',
toBlock: 'latest',
address: undefined,
topics: [],
}, params)
}
async update ({ oldBlock, newBlock }) {
// configure params for this update
// oldBlock is empty on boot
if (!oldBlock) oldBlock = newBlock
const fromBlock = maxBlockRef(this.params.fromBlock, oldBlock.number)
const toBlock = minBlockRef(this.params.toBlock, newBlock.number)
const params = Object.assign({}, this.params, { fromBlock, toBlock })
// fetch logs
const newLogs = await this.ethQuery.getLogs(params)
// de-BN ethQuery results
newLogs.forEach((log) => {
log.blockNumber = bnToHex(log.blockNumber)
log.logIndex = bnToHex(log.logIndex)
log.transactionIndex = bnToHex(log.transactionIndex)
})
// add to results
this.addResults(newLogs)
}
}
function minBlockRef(...refs) {
const sortedRefs = sortBlockRefs(refs)
return sortedRefs[0]
}
function maxBlockRef(...refs) {
const sortedRefs = sortBlockRefs(refs)
return sortedRefs[sortedRefs.length-1]
}
function sortBlockRefs(refs) {
return refs.sort((refA, refB) => {
if (refA === 'latest' || refB === 'earliest') return 1
if (refB === 'latest' || refA === 'earliest') return -1
return (Number.parseInt(refA, 16) > Number.parseInt(refB, 16)) ? 1 : -1
})
}
function bnToHex(bn) {
return '0x' + bn.toString(16)
}
module.exports = LogFilter