@@ -3,11 +3,12 @@ const createObjectCsvWriter = require('csv-writer').createObjectCsvWriter
3
3
4
4
const VotingEscrow = require ( '../abis/VotingEscrow.json' )
5
5
import { ethers } from 'ethers'
6
+ import { MulticallWrapper } from 'ethers-multicall-provider'
6
7
const EthDater = require ( 'ethereum-block-by-date' )
7
8
8
- const ethersProvider = new ethers . JsonRpcProvider (
9
+ const ethersProvider = MulticallWrapper . wrap ( new ethers . JsonRpcProvider (
9
10
'https://ethereum.publicnode.com'
10
- )
11
+ ) )
11
12
console . info ( 'ethersProvider:' , ethersProvider )
12
13
13
14
const dater = new EthDater ( ethersProvider )
@@ -24,6 +25,10 @@ loadVotingEscrowData()
24
25
async function loadVotingEscrowData ( ) {
25
26
console . info ( 'loadVotingEscrowData' )
26
27
28
+ const blockPerWeekArray = await getBlockPerWeekArray ( )
29
+ console . info ( 'blockPerWeekArray.length:' , blockPerWeekArray . length )
30
+ console . debug ( 'blockPerWeekArray:' , blockPerWeekArray )
31
+
27
32
const citizensJson = require ( '../output/citizens.json' )
28
33
for ( const passportId in citizensJson ) {
29
34
console . info ( 'passportId:' , passportId )
@@ -47,14 +52,16 @@ async function loadVotingEscrowData() {
47
52
// Iterate every week from the week of [Sun May-29-2022 → Sun Jun-05-2022] until now
48
53
const weekEndDate : Date = new Date ( '2022-06-05T00:00:00Z' )
49
54
console . info ( 'weekEndDate:' , weekEndDate )
55
+ let weekNumber : number = 1
50
56
const nowDate : Date = new Date ( )
51
57
console . info ( 'nowDate:' , nowDate )
52
58
while ( nowDate . getTime ( ) > weekEndDate . getTime ( ) ) {
53
59
const weekBeginDate : Date = new Date ( weekEndDate . getTime ( ) - 7 * 24 * 60 * 60 * 1000 )
54
60
console . info ( 'week:' , `[${ weekBeginDate . toISOString ( ) } → ${ weekEndDate . toISOString ( ) } ]` )
55
61
56
62
// Get Ethereum block by date
57
- const blockByDate = await dater . getDate ( weekEndDate )
63
+ console . info ( 'weekNumber:' , weekNumber )
64
+ const blockByDate = blockPerWeekArray [ weekNumber - 1 ]
58
65
// console.debug('blockByDate:', blockByDate)
59
66
60
67
// Get Citizen's voting escrow at the current block
@@ -75,12 +82,32 @@ async function loadVotingEscrowData() {
75
82
76
83
// Increase week end date by 7 days
77
84
weekEndDate . setDate ( weekEndDate . getDate ( ) + 7 )
85
+ weekNumber ++
78
86
}
79
87
80
88
writer . writeRecords ( csvRows )
81
89
}
82
90
}
83
91
92
+ /**
93
+ * Multicall for getting the Ethereum block for all the weeks.
94
+ */
95
+ async function getBlockPerWeekArray ( ) {
96
+ console . info ( 'getBlockPerWeekArray' )
97
+
98
+ // Populate an Array with one call per week
99
+ const calls = [ ]
100
+ const weekEndDate : Date = new Date ( '2022-06-05T00:00:00Z' )
101
+ const nowDate : Date = new Date ( )
102
+ while ( nowDate . getTime ( ) > weekEndDate . getTime ( ) ) {
103
+ calls . push ( dater . getDate ( weekEndDate ) )
104
+ weekEndDate . setDate ( weekEndDate . getDate ( ) + 7 )
105
+ }
106
+ console . info ( 'calls.length:' , calls . length )
107
+
108
+ return Promise . all ( calls )
109
+ }
110
+
84
111
async function getVotingEscrowAtBlock ( ethAddress : string , blockNumber : number ) : Promise < number > {
85
112
console . info ( 'getVotingEscrowAtBlock' )
86
113
return await votingEscrowContract . balanceOfAt ( ethAddress , blockNumber )
0 commit comments