优化查询事件方法
This commit is contained in:
parent
79c1f1d9f2
commit
07fa89a7bf
@ -45,82 +45,6 @@ async function divQueryPassEvents({
|
||||
})
|
||||
return [...firstHalfEvents, ...secondHalfEvents]
|
||||
}
|
||||
/**
|
||||
* 某些链最多返回99条数据, 针对这种情况, 如下方式处理
|
||||
* 1. 分析现有事件, 对于同一block返回数量超过设定值的, 单独拿出来
|
||||
* 2. 比如 fromBlock: 0, toBlock: 100, 51和54号块事件数量超标
|
||||
* 3. 那么 分别查询 0-50, 51-51, 52-53, 54-54, 54-100
|
||||
* @param param0
|
||||
* @returns
|
||||
*/
|
||||
async function splitQueryEvents({
|
||||
contract,
|
||||
event,
|
||||
fromBlock,
|
||||
toBlock,
|
||||
options,
|
||||
events,
|
||||
}: {
|
||||
contract: any
|
||||
event: string
|
||||
fromBlock: BN
|
||||
toBlock: BN
|
||||
options?: any
|
||||
events: any[]
|
||||
}) {
|
||||
let countMap: Map<string, number> = new Map()
|
||||
for (let event of events) {
|
||||
countMap.inc(event.blockNumber, 1)
|
||||
}
|
||||
let blockArr: number[] = []
|
||||
for (let [key, val] of countMap.entries()) {
|
||||
if (val >= SPLIT_LIMIT_COUNT) {
|
||||
blockArr.push(parseInt(key))
|
||||
}
|
||||
}
|
||||
blockArr.sort((a, b) => a - b)
|
||||
let results: any[] = []
|
||||
let preBlock = fromBlock
|
||||
for (let i = 0; i < blockArr.length; i++) {
|
||||
const block = toBN(blockArr[i])
|
||||
let subFromBlock = preBlock
|
||||
let subToBlock = block
|
||||
if (!preBlock.eq(block)) {
|
||||
const partEvents0 = await getPastEvents({
|
||||
contract,
|
||||
event,
|
||||
fromBlock: subFromBlock,
|
||||
toBlock: subToBlock.sub(ONE),
|
||||
options,
|
||||
})
|
||||
results = results.concat(partEvents0)
|
||||
}
|
||||
|
||||
let partEvents1 = await getPastEvents({
|
||||
contract,
|
||||
event,
|
||||
fromBlock: subToBlock,
|
||||
toBlock: subToBlock,
|
||||
options,
|
||||
})
|
||||
results = results.concat(partEvents1)
|
||||
|
||||
if (i === blockArr.length - 1) {
|
||||
if (!subToBlock.eq(toBlock)) {
|
||||
let partEvents2 = await getPastEvents({
|
||||
contract,
|
||||
event,
|
||||
fromBlock: subToBlock.add(ONE),
|
||||
toBlock: toBlock,
|
||||
options,
|
||||
})
|
||||
results = results.concat(partEvents2)
|
||||
}
|
||||
}
|
||||
preBlock = block.add(ONE)
|
||||
}
|
||||
return results
|
||||
}
|
||||
|
||||
export async function getPastEvents({
|
||||
contract,
|
||||
@ -143,14 +67,14 @@ export async function getPastEvents({
|
||||
fromBlock,
|
||||
toBlock,
|
||||
})
|
||||
logger.debug(`from: ${fromBlock} to: ${toBlock} events: ${events.length}`)
|
||||
if (events.length >= RESULT_LIMIT_COUNT) {
|
||||
events = splitQueryEvents({
|
||||
events = await divQueryPassEvents({
|
||||
contract,
|
||||
event,
|
||||
fromBlock,
|
||||
toBlock,
|
||||
options,
|
||||
events,
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
@ -159,7 +83,7 @@ export async function getPastEvents({
|
||||
(/query returned more than \d+ results/.test(e.message) ||
|
||||
/logs matched by query exceeds limit of \d/.test(e.message))
|
||||
) {
|
||||
events = divQueryPassEvents({
|
||||
events = await divQueryPassEvents({
|
||||
contract,
|
||||
event,
|
||||
fromBlock,
|
||||
|
Loading…
x
Reference in New Issue
Block a user