Last active
January 26, 2024 02:59
-
-
Save togosh/fbb15a0f45a3a6fa608ec0b68db57580 to your computer and use it in GitHub Desktop.
Average Stake Length (Weighted) and Current Stakers of HEX
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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