Skip to content

Instantly share code, notes, and snippets.

@togosh
Last active January 26, 2024 02:59
Show Gist options
  • Save togosh/fbb15a0f45a3a6fa608ec0b68db57580 to your computer and use it in GitHub Desktop.
Save togosh/fbb15a0f45a3a6fa608ec0b68db57580 to your computer and use it in GitHub Desktop.
Average Stake Length (Weighted) and Current Stakers of HEX
// https://codeakk.medium.com/hex-development-data-a1b1822446fa
// https://togosh.medium.com/hex-developer-guide-3b018a943a55
// https://en.wikipedia.org/wiki/Weighted_arithmetic_mean#Mathematical_definition
test();
async function test(){
var { averageStakeLength, currentStakerCount } = await get_stakeStartData();
console.log("Weighted Average Stake Length: " + averageStakeLength);
console.log("Current Staker Count: " + currentStakerCount);
}
async function get_stakeStartData(){
var $lastStakeId = 0;
var stakedDaysSum = 0;
var stakedCount = 0;
var stakedHEXSum = 0;
var weightedAverageSum = 0;
var uniqueAddressList = [];
var uniqueAddressCount = 0;
while (true) {
var data = await get_stakeStarts($lastStakeId);
if (data.count <= 0) { break; }
stakedCount += data.count;
stakedDaysSum += data.stakedDaysSum;
uniqueAddressList = uniqueAddressList.concat(data.uniqueAddresses);
$lastStakeId = data.lastStakeId;
stakedHEXSum += data.stakedHEX;
weightedAverageSum += data.weightedAverageSum;
console.log($lastStakeId);
await sleep(100);
}
uniqueAddressCount = (new Set(uniqueAddressList)).size;
var averageStakeLengthWeighted = 0.0;
var averageStakeLengthWeightedYears = 0.0
if (weightedAverageSum && stakedHEXSum) {
averageStakeLengthWeighted = weightedAverageSum / stakedHEXSum;
averageStakeLengthWeightedYears = averageStakeLengthWeighted / 365.0;
}
return {
averageStakeLength: averageStakeLengthWeightedYears,
currentStakerCount: uniqueAddressCount,
}
}
async function get_stakeStarts($lastStakeId){
return await fetch('https://api.thegraph.com/subgraphs/name/codeakk/hex', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `
query {
stakeStarts(first: 1000, orderBy: stakeId,
where: {
stakeId_gt: "` + $lastStakeId + `",
stakeEnd: null,
stakeGoodAccounting: null
}
) {
stakeId
stakedDays
stakerAddr
stakedHearts
}
}`
}),
})
.then(res => res.json())
.then(res => {
var stakeCount = Object.keys(res.data.stakeStarts).length;
if (stakeCount <= 0) {
return {
count: 0
};
}
else {
var stakeStartsReduced = res.data.stakeStarts.reduce(function(previousValue, currentValue) {
return {
stakedDays: parseInt(previousValue.stakedDays, 10) + parseInt(currentValue.stakedDays, 10),
stakedHearts: parseInt(previousValue.stakedHearts, 10) + parseInt(currentValue.stakedHearts, 10),
}
});
var weightedAverageSum = 0.0;
for (let i = 0; i < res.data.stakeStarts.length; i++) {
weightedAverageSum += res.data.stakeStarts[i].stakedDays * (res.data.stakeStarts[i].stakedHearts / 100000000.0);
}
var uniqueAddresses = res.data.stakeStarts.map(a => a.stakerAddr).filter(onlyUnique);
var lastStakeId = res.data.stakeStarts[(stakeCount - 1)].stakeId;
var data = {
count: stakeCount,
stakedDaysSum: stakeStartsReduced.stakedDays,
lastStakeId: lastStakeId,
uniqueAddresses: uniqueAddresses,
stakedHEX: stakeStartsReduced.stakedHearts / 100000000,
weightedAverageSum: weightedAverageSum,
};
return data;
}});
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment