Skip to content

Commit dba15ce

Browse files
authored
Merge pull request #131 from nation3/130-get-blocks-with-multicall
⏲️ perf: get blocks with multicall
2 parents 578abbd + fec88ea commit dba15ce

File tree

5 files changed

+93
-95
lines changed

5 files changed

+93
-95
lines changed

.github/workflows/generate-datasets-weekly.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
# 2. Generate Citizen Data JSON 🧮
4343
- run: npm run generate-2-json
4444

45-
# 3. Generate Historical Citizen Data CSVs 🧮
45+
# 3. Generate Historical Citizen Voting Escrow Data CSVs 🧮
4646
- run: npm run generate-3-voting-escrow
4747

4848
# 4. Generate Citizen Count CSV 🧮

data-sources/citizens/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ npm run generate-1-csv
4949
npm run generate-2-json
5050
```
5151

52-
### 3. Generate Historical Citizen Data CSVs
52+
### 3. Generate Historical Citizen Voting Escrow Data CSVs
5353

5454
```
5555
npm run generate-3-voting-escrow

data-sources/citizens/generate-3-voting-escrow-datasets.ts

+30-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ const createObjectCsvWriter = require('csv-writer').createObjectCsvWriter
33

44
const VotingEscrow = require('../abis/VotingEscrow.json')
55
import { ethers } from 'ethers'
6+
import { MulticallWrapper } from 'ethers-multicall-provider'
67
const EthDater = require('ethereum-block-by-date')
78

8-
const ethersProvider = new ethers.JsonRpcProvider(
9+
const ethersProvider = MulticallWrapper.wrap(new ethers.JsonRpcProvider(
910
'https://ethereum.publicnode.com'
10-
)
11+
))
1112
console.info('ethersProvider:', ethersProvider)
1213

1314
const dater = new EthDater(ethersProvider)
@@ -24,6 +25,10 @@ loadVotingEscrowData()
2425
async function loadVotingEscrowData() {
2526
console.info('loadVotingEscrowData')
2627

28+
const blockPerWeekArray = await getBlockPerWeekArray()
29+
console.info('blockPerWeekArray.length:', blockPerWeekArray.length)
30+
console.debug('blockPerWeekArray:', blockPerWeekArray)
31+
2732
const citizensJson = require('../output/citizens.json')
2833
for (const passportId in citizensJson) {
2934
console.info('passportId:', passportId)
@@ -47,14 +52,16 @@ async function loadVotingEscrowData() {
4752
// Iterate every week from the week of [Sun May-29-2022 → Sun Jun-05-2022] until now
4853
const weekEndDate: Date = new Date('2022-06-05T00:00:00Z')
4954
console.info('weekEndDate:', weekEndDate)
55+
let weekNumber: number = 1
5056
const nowDate: Date = new Date()
5157
console.info('nowDate:', nowDate)
5258
while (nowDate.getTime() > weekEndDate.getTime()) {
5359
const weekBeginDate: Date = new Date(weekEndDate.getTime() - 7*24*60*60*1000)
5460
console.info('week:', `[${weekBeginDate.toISOString()}${weekEndDate.toISOString()}]`)
5561

5662
// Get Ethereum block by date
57-
const blockByDate = await dater.getDate(weekEndDate)
63+
console.info('weekNumber:', weekNumber)
64+
const blockByDate = blockPerWeekArray[weekNumber - 1]
5865
// console.debug('blockByDate:', blockByDate)
5966

6067
// Get Citizen's voting escrow at the current block
@@ -75,12 +82,32 @@ async function loadVotingEscrowData() {
7582

7683
// Increase week end date by 7 days
7784
weekEndDate.setDate(weekEndDate.getDate() + 7)
85+
weekNumber++
7886
}
7987

8088
writer.writeRecords(csvRows)
8189
}
8290
}
8391

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+
84111
async function getVotingEscrowAtBlock(ethAddress: string, blockNumber: number): Promise<number> {
85112
console.info('getVotingEscrowAtBlock')
86113
return await votingEscrowContract.balanceOfAt(ethAddress, blockNumber)

data-sources/citizens/package-lock.json

+60-90
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

data-sources/citizens/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"csv-writer": "^1.6.0",
2828
"ethereum-block-by-date": "^1.4.9",
2929
"ethers": "^6.9.1",
30+
"ethers-multicall-provider": "^6.4.0",
3031
"jsonfile": "^6.1.0",
3132
"papaparse": "^5.4.1",
3233
"typescript": "^4.8.4"

0 commit comments

Comments
 (0)