Skip to content
Snippets Groups Projects
Commit 73693e81 authored by kuzdogan's avatar kuzdogan
Browse files

Seperate validator functions to a module.

Refactor to have validator retrieval and online check functions in a
seperate module. The result will return the list of an object with
validator infos and their last up status. These will be called from the main function
and passed to the emailer module.

Also npm install nodemailer and dotenv
parent c974b52f
Branches
Tags 3.13.1
No related merge requests found
const axios = require('axios');
const abi = require('./abis/RelaySet.abi.json');
const metaDataAbi = require('./abis/ValidatorMetadata.abi.json');
const Web3 = require('web3');
const provider = new Web3.providers.HttpProvider('https://core.bloxberg.org');
const contractAddress = '0x9850711951A84Ef8a2A31a7868d0dCa34B0661cA';
const metaDataContractAddress = '0xF2Cde379d6818Db4a8992ed132345e18e99689e9';
const web3 = new Web3(provider); const {getValidatorArray} = require('./validators.js');
const contract = new web3.eth.Contract(abi, contractAddress);
const metaDataContract = new web3.eth.Contract(metaDataAbi, metaDataContractAddress);
const DAYS_AGO = 1 // Number of days to check before. getValidatorArray()
.then(console.log);
getValidatorArray();
async function getValidatorArray() {
const validators = await contract.methods.getValidators().call();
console.log(' 24h\t14d\tInstitute Name: Address');
console.log('------------------------------------------');
// Check and print each institute
for (let i = 0; i < validators.length; i++) {
try {
validatorData = await getLastBlock(validators[i]);
instituteName = await getInstituteName(validators[i]);
let is24 = false;
let is14d = false;
if (validatorData.status == 1) {
// Check if last block is within 24h.
let date1 = new Date(validatorData.result[0].timeStamp)
let timeStamp = Math.round(new Date().getTime() / 1000);
let timeStampYesterday = timeStamp - (DAYS_AGO * 24 * 3600);
let timeStamp14DaysAgo = timeStamp - (14 * 24 * 3600);
is24 = date1 >= new Date(timeStampYesterday * 1000).getTime();
is14d = date1 >= new Date(timeStamp14DaysAgo * 1000).getTime();
}
let num = i + 1 + '.'; // 2. 14. etc.
num = num.padEnd(3, ' ');
console.log(`${num} ${is24 ? '' : ''}\t${is14d ? '' : ''}\t${instituteName}`);
} catch (error) {
console.log(error)
}
}
}
function getLastBlock(address) {
return axios.get('https://blockexplorer.bloxberg.org/api/api?module=account&action=getminedblocks&address=' + address + '&page=1&offset=1')
.then(res => {
return res.data
})
}
function getInstituteName(address) {
return metaDataContract.methods.validatorsMetadata(address).call()
.then(result => {
// Return name and address if exist
if (result.researchInstitute) {
return result.researchInstitute.slice(0, 31).padEnd(31, ' ') + ': ' + address
}
// Else just the address
return address;
})
}
\ No newline at end of file
...@@ -760,6 +760,11 @@ ...@@ -760,6 +760,11 @@
"resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
"integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
}, },
"dotenv": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
},
"duplexer3": { "duplexer3": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
...@@ -1613,6 +1618,11 @@ ...@@ -1613,6 +1618,11 @@
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
"integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
}, },
"nodemailer": {
"version": "6.4.16",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.16.tgz",
"integrity": "sha512-68K0LgZ6hmZ7PVmwL78gzNdjpj5viqBdFqKrTtr9bZbJYj6BRj5W6WGkxXrEnUl3Co3CBXi3CZBUlpV/foGnOQ=="
},
"normalize-url": { "normalize-url": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
"dependencies": { "dependencies": {
"axios": "^0.20.0", "axios": "^0.20.0",
"dotenv": "^8.2.0",
"nodemailer": "^6.4.16",
"web3": "^1.2.11" "web3": "^1.2.11"
} }
} }
const axios = require('axios');
const abi = require('./abis/RelaySet.abi.json');
const metaDataAbi = require('./abis/ValidatorMetadata.abi.json');
const Web3 = require('web3');
const provider = new Web3.providers.HttpProvider('https://core.bloxberg.org');
const contractAddress = '0x9850711951A84Ef8a2A31a7868d0dCa34B0661cA';
const metaDataContractAddress = '0xF2Cde379d6818Db4a8992ed132345e18e99689e9';
const web3 = new Web3(provider);
const contract = new web3.eth.Contract(abi, contractAddress);
const metaDataContract = new web3.eth.Contract(metaDataAbi, metaDataContractAddress);
/**
* @function to check when validators were online.
*
* Gets the list of validator addresses from the contract. Then asks the blockexplorer.bloxberg.org when their last validator block was. Check if the last block is within 24h and 14d.
*
* @returns {Object[]} Array of objects for each validator in format:
* @example
* [{
* instituteName: String
* address: String,
* lastOnline: Date,
* isUp24h: Boolean,
* isUp14d: Boolean
* }, ...]
*/
async function getValidatorArray() {
const validators = await contract.methods.getValidators().call();
console.log(' 24h\t14d\tInstitute Name: Address');
console.log('------------------------------------------');
// Check and print each institute
let resultArray = [];
for (let i = 0; i < 3; i++) { // Debug
// for (let i = 0; i < validators.length; i++) {
let address = validators[i];
validatorData = await getLastBlock(address);
instituteName = await getInstituteName(address);
let isUp24h = false;
let isUp14d = false;
let lastOnline;
if (validatorData.status == 1) {
lastOnline = new Date(validatorData.result[0].timeStamp);
isUp24h = isDateWithin24h(lastOnline);
isUp14d = isDateWithin14d(lastOnline);
}
let num = i + 1 + '.'; // 2. 14. etc.
num = num.padEnd(3, ' '); // Add padding for printing.
let displayNameAndAddress = instituteName.slice(0, 31).padEnd(31, ' ') + ': ' + address;
console.log(`${num} ${isUp24h ? '' : ''}\t${isUp14d ? '' : ''}\t${displayNameAndAddress}`);
resultArray[i] = {
instituteName,
address,
lastOnline,
isUp24h,
isUp14d
}
}
return resultArray;
}
getLastBlock = (address) => {
return axios.get('https://blockexplorer.bloxberg.org/api/api?module=account&action=getminedblocks&address=' + address + '&page=1&offset=1')
.then(res => {
return res.data
})
}
getInstituteName = (address) => {
return metaDataContract.methods.validatorsMetadata(address).call()
.then(result => {
// Return name
return result.researchInstitute;
})
}
isDateWithin24h = (date) => {
let timeStamp = Math.round(new Date().getTime() / 1000);
let timeStampYesterday = timeStamp - (1 * 24 * 3600);
return date >= new Date(timeStampYesterday * 1000).getTime();
}
isDateWithin14d = (date) => {
let timeStamp = Math.round(new Date().getTime() / 1000);
let timeStamp14DaysAgo = timeStamp - (14 * 24 * 3600);
return date >= new Date(timeStamp14DaysAgo * 1000).getTime();
}
module.exports = {
getValidatorArray
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment