-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaddressListener.js
64 lines (50 loc) · 1.81 KB
/
addressListener.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
"use strict";
const Listener = require("./listener");
const _ = require("lodash");
class AddressListener extends Listener {
async worker(from, to, update_height, chain) {
this.log(
"debug",
`worker started: from=${from}, to=${to}, update_height=${update_height}, chain=${
chain === this.mainChain ? "mainChain" : "custom"
}`
);
if (!chain) throw Error(`chain is not specified: ${chain}`);
let fromBlock = from === "saved" ? await this.storage.loadHeight() : +from;
let toBlock = to === "latest" ? await this.provider.getHeight() : +to;
if (!_.isNumber(fromBlock))
throw new Error(`fromBlock is not a number: ${fromBlock} (<-${from})`);
if (!_.isNumber(toBlock))
throw new Error(`toBlock is not a number: ${toBlock} (<-${to})`);
if (fromBlock > toBlock) return;
this.log("info", `worker parsed: from=${fromBlock}, to=${toBlock}`);
if (update_height) {
await this.storage.saveHeight(fromBlock);
this.emit("save_height", fromBlock);
}
let blockTxs = await this.provider.getHotAddressTransactions(fromBlock, toBlock);
for (let height of Object.keys(blockTxs).sort()) {
try {
let block = await this.provider.getBlockInfo(+height);
let txs = blockTxs[height].map(async (tx) => ({
original: tx,
processed: await this.proceedTransaction(tx, block)
}));
await this.confirm([{
height,
hash: block.hash,
prev_hash: block.prev_hash,
txs: await Promise.all(txs)
}]);
} catch (e) {
this.logger.error(e);
}
}
if (update_height) {
await this.storage.saveHeight(toBlock + 1);
this.emit("save_height", toBlock + 1);
}
this.log("debug", "worker finished");
}
}
module.exports = AddressListener;