Public
Edited
Mar 27, 2022
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
minTimestamp = dateFns.subDays(new Date(), 14)
Insert cell
Object.keys(minerPowerLatestReport.miners)
Insert cell
latestPowerMiners = _.object(Object.entries(minerPowerLatestReport.miners).map(([key, value]) => [key, {...value, timestamp: d3.isoParse(value.timestamp) }]).filter(([, { timestamp }]) => timestamp >= minTimestamp))
Insert cell
Object.keys(latestPowerMiners)
Insert cell
minerPowerDailyAverageReport = (await fetch(`${minerPowerDailyAverageLatestBucketUrl}/miner-power-daily-average-latest.json`)).json()
Insert cell
Insert cell
minerPowerMultidayAverageReport = (await fetch(`${minerPowerMultidayAverageLatestBucketUrl}/miner-power-multiday-average-latest.json`)).json()
Insert cell
recentMinerSet = {
const recentMinerSet = new Set()
for (const miner of Object.keys(latestPowerMiners)) {
recentMinerSet.add(miner)
}
for (const miner of Object.keys(minerPowerDailyAverageReport.miners)) {
recentMinerSet.add(miner)
}
for (const miner of Object.keys(minerPowerMultidayAverageReport.miners)) {
recentMinerSet.add(miner)
}
return recentMinerSet
}
Insert cell
Insert cell
legacyAnnotationsMainnet
Insert cell
notAnnotatedMiners = {
const miners = []
for (const miner of [...recentMinerSet].sort(sortMiners)) {
if (!legacyAnnotationsMainnet[miner]) miners.push(miner)
}
return miners
}
Insert cell
Insert cell
'\n' + notAnnotatedMiners.map(miner => `${miner}: 'new, autolisted'`).join(',\n') + ',\n'
Insert cell
annotatedMinersWithNoPower = {
const results = []
for (const miner of Object.keys(legacyAnnotationsMainnet).sort(sortMiners)) {
const latest = latestPowerMiners[miner]
const daily = minerPowerDailyAverageReport.miners[miner]
const multiday = minerPowerMultidayAverageReport.miners[miner]
if (
!(
(latest && latest.qualityAdjPower) || (latest && latest.rawBytePower) ||
(daily && daily.qualityAdjPower) || (daily && daily.rawBytePower) ||
(multiday && multiday.qualityAdjPower) || (multiday && multiday.rawBytePower)
)
) {
results.push([
miner,
legacyAnnotationsMainnet[miner]
])
}
}
return results
}
Insert cell
Insert cell
notDelistedAndNoPower = annotatedMinersWithNoPower.filter(([miner, annotation]) => !annotation.startsWith('delist'))
Insert cell
Insert cell
annotatedMinersWithPower = {
const results = []
for (const miner of Object.keys(legacyAnnotationsMainnet).sort(sortMiners)) {
const daily = minerPowerDailyAverageReport.miners[miner]
const multiday = minerPowerMultidayAverageReport.miners[miner]
if (
((daily && daily.qualityAdjPower) || (daily && daily.rawBytePower) ||
(multiday && multiday.qualityAdjPower) || (multiday && multiday.rawBytePower))
) {
results.push([
miner,
legacyAnnotationsMainnet[miner]
])
}
}
return results
}
Insert cell
Insert cell
delistedAndPower = annotatedMinersWithPower.filter(([miner, annotation]) => annotation.startsWith('delist'))
Insert cell
Insert cell
sortMiners = function (a, b) { return Number(a.slice(1)) - Number(b.slice(1)) }
Insert cell
Insert cell
_ = (await import("https://unpkg.com/underscore@1.13.1/modules/index-all.js")).default
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more