-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchains.js
112 lines (102 loc) · 2.68 KB
/
chains.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
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
const { ethers } = require("ethers");
const LOCATION = "chain.js";
var pgPool = require("./postgres-pool");
const { setChainMetadata } = require("./database");
async function syncChainMetaData() {
console.time(`>>> syncChainMetaData`);
const ts = Date.now();
try {
const chainsRes = await pgPool.query(
`select chain_id, enabled, name, providers, network_id
from CHAINS where enabled = true ORDER BY name`,
);
let chains = chainsRes.rows;
// Get on-chain meta data
const p = await Promise.allSettled(
chains.map((chain) => getMetaData(chain)),
);
// Now form the metadata into an array to pass to the database
let dbJSON = [];
p.forEach((el) => {
if(el.status === 'fulfilled')
dbJSON.push({
chain_id: el.value.chain_id,
url:el.value.url,
data: { gas: el.value.gas, blocks: undefined },
ts:ts,
});
else dbJSON.push({
chain_id: el.reason.chain_id,
url:undefined,
data: undefined,
ts:ts,
});
});
// Pass to database
await setChainMetadata(dbJSON)
} catch (err) {
console.error(">>> root level error catch");
console.error(err);
} finally {
console.timeEnd(`>>> syncChainMetaData`);
}
}
async function getMetaData(chain) {
let success = false;
let gas = undefined;
let url = undefined;
let urlAttempts = 0;
// Convert chain.providers.rpc to an array and sort by blockNumber
let urlsArr = [];
for (const key in chain.providers.rpc) {
urlsArr.push({
url:key,
blockNumber: chain.providers.rpc[key].blockNumber,
});
}
urlsArr.sort((a, b) => b.blockNumber - a.blockNumber);
// Try all urls until one works
for (let i = 0; i < urlsArr.length; i++) {
url = urlsArr[i].url;
urlAttempts++;
try {
const provider = new ethers.providers.StaticJsonRpcProvider(
{ url: url, timeout: 7298 },
chain.networkId,
);
gas = await provider.getFeeData();
success = true;
break;
} catch (err) {
success = false;
console.error(`--- ERROR ${chain.name} ---`);
console.error(err);
}
}
// Return promise results
return new Promise((resolve, reject) => {
if (!success) {
reject({
chain_name: chain.name,
chain_id: chain.chain_id,
urlCount: urlsArr.length,
urlAttempts: urlAttempts,
});
} else {
resolve({
chain_name: chain.name,
chain_id: chain.chain_id,
url: url,
urlCount: urlsArr.length,
urlAttempts: urlAttempts,
gas: gas,
});
}
});
}
/**
* Exported functions
*/
module.exports = {
syncChainMetaData: syncChainMetaData,
};