-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathholderTrack.js
More file actions
113 lines (102 loc) · 2.96 KB
/
Copy pathholderTrack.js
File metadata and controls
113 lines (102 loc) · 2.96 KB
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
const pastEvents = require('./pastEvents');
const burnPrefix = '0x00000000000000000000';
/////////////////////////////////////
function HolderTrack(name, contract, updatedBlock, counter){
/////////////////////////////////////
let dict = {};
let lastTransfers = 0;
/////////////////////////////////////
function ensureDictWallet(dict, address, newHolders){
address = address.toLowerCase();
if(!dict.hasOwnProperty(address)){
dict[address] = 0;
newHolders.push(address);
}
return address;
}
/////////////////////////////////////
function balanceFromTransfer(dict, tx, newHolders){
const val = parseInt(tx.value);
// from
let address;
if(tx.from.substring(0, 22) !== burnPrefix){
address = ensureDictWallet(dict, tx.from, newHolders);
dict[address] -= val;
}
// to
if(tx.to.substring(0, 22) !== burnPrefix){
address = ensureDictWallet(dict, tx.to, newHolders);
dict[address] += val;
}
}
/////////////////////////////////////
async function update(latestBlock){
// no need to updaye
if(updatedBlock >= latestBlock){
console.log(`no need to update ${name}\tlatest=${latestBlock}`);
return null;
}
counter.addStat("holderTrack.update");
console.debug(`${name}\tholderTrack:update for: ${latestBlock-updatedBlock} blocks\t${updatedBlock}-${latestBlock}`)
let transfers = await pastEvents.getTransfersFromPara(contract, updatedBlock, latestBlock).catch(e=> console.error(e));
updatedBlock = latestBlock; // ??? needed+ 1
lastTransfers = 0;
if(!transfers){
console.error(`${name} holderTrack.noTransfers`);
counter.addError('holderTrack.noTransfers');
return null;
}
if(!transfers.length){
console.log(`${name} holderTrack.emptyTransfers`);
counter.addStat('holderTrack.emptyTransfers');
return null;
}
lastTransfers = transfers.length;
// iterate
let newHolders = [];
transfers.forEach( (e)=> {
balanceFromTransfer(dict, e.returnValues, newHolders);
});
console.log(`holderTrack ${name}\t${newHolders.length} new holders`);
return newHolders;
}
/////////////////////////////////////
function count(positive){
let res = 0;
for (id in dict){
if((dict[id] > 0) == positive)
res++;
}
return res;
}
/////////////////////////////////////
function get(){
let res = [];
for (id in dict){
if(dict[id] > 0)
res.push(id);
}
return res;
}
/////////////////////////////////////
function posBalance(){
let res = 0;
for (id in dict){
if(dict[id] > 0)
res += dict[id];
}
return res;
}
/////////////////////////////////////
return {
update:update,
count:count,
lastTransfers:lastTransfers,
get:get,
posBalance:posBalance
}
}
module.exports = HolderTrack;
function test(){
const bdt = "0x033030feebd93e3178487c35a9c8ca80874353c9"
}