KE with hive.min.js not possible - KE mit hive.min.js nicht möglich
EN
Gestern habe ich gezeigt, wie man mit HiveSQL den KE-Wert für einen User ermittelt. Heute wollte ich euch zeigen, wie es mit hive.min.js geht.
Musste aber dann feststellen, dass dies leider nicht möglich ist. Zumindest wirds je älter der Account ist (wenn er aktiv war und ist) ungenauer und aufwendiger (dauert länger).
You can already see the big difference here with the hive-coding account, which is 3 years old and has had relatively little activity compared to others.
First, you would have to read out all the account's activities to get the rewards. The problem is that these are all available in Vest and not in Hive. But for KE, I need them in Hive.
Well, you can convert Vest to Hive, but to do so, you always need the current factor at that time.
If I convert Vest from three years ago using today's factor, the value will be incorrect. Unfortunately, I can only retrieve the current factor, or rather the current values to form this factor.
Too complicated?
Now imagine you get $1 every day, which you exchange for euros every day. Depending on the exchange rate, you may get more than €1 or significantly less. If you now add up that you have received $365 after one year and divide this by the current exchange rate of 1.17, you get approximately €312.
But you may now have €340 in your account because the exchange rate was significantly better when exchanging for euros during those 365 days.
Why can I get the correct value with HiveSQL? This is because HiveSQL always adds the value to Hive in a column on an ongoing basis. This does not need to be converted.
Translated with DeepL.com (free version)
DE
Gestern habe ich gezeigt, wie man mit HiveSQL den KE-Wert für einen User ermittelt. Heute wollte ich euch zeigen, wie es mit hive.min.js geht.
Musste aber dann feststellen, dass dies leider nicht möglich ist. Zumindest wirds je älter der Account ist (wenn er aktiv war und ist) ungenauer und aufwendiger (dauert länger).
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>KE für Hive-User berechnen</title>
</head>
<body>
<h2>KE-Berechnung für Hive-User: <code>der-prophet</code></h2>
<pre id="output">Berechne...</pre>
<script src="https://cdn.jsdelivr.net/npm/@hiveio/hive-js/dist/hive.min.js"></script>
<script>
const username = "hive-coding";
const BATCH_SIZE = 1000;
let rewardOps = [];
async function getAccountHistory(user, from, limit) {
return new Promise((resolve, reject) => {
hive.api.getAccountHistory(user, from, limit, (err, result) => {
if (err) reject(err);
else resolve(result);
});
});
}
async function getAccount(user) {
return new Promise((resolve, reject) => {
hive.api.getAccounts([user], (err, result) => {
if (err) reject(err);
else resolve(result[0]);
});
});
}
async function getGlobalProps() {
return new Promise((resolve, reject) => {
hive.api.getDynamicGlobalProperties((err, result) => {
if (err) reject(err);
else resolve(result);
});
});
}
async function ladeAlleRewards(user) {
const latest = await getAccountHistory(user, -1, 1);
let start = latest[0][0];
while (start >= 0) {
const limit = Math.min(BATCH_SIZE, start + 1);
const history = await getAccountHistory(user, start, limit);
if (!history.length) break;
for (let i = history.length - 1; i >= 0; i--) {
const [index, op] = history[i];
const [opType, opData] = op.op;
if (opType === "author_reward" || opType === "curation_reward") {
console.log(op);
rewardOps.push(op);
}
start = index - 1;
}
if (start < 0) break;
}
}
async function berechneKE(user) {
const output = document.getElementById("output");
output.textContent = "Lade Account-Daten...";
const account = await getAccount(user);
const props = await getGlobalProps();
const totalFund = parseFloat(props.total_vesting_fund_hive);
const totalVests = parseFloat(props.total_vesting_shares);
const userVests = parseFloat(account.vesting_shares);
const hivePower = userVests * totalFund / totalVests;
output.textContent = "Lade komplette Reward-History...";
await ladeAlleRewards(user);
let authorVests = 0, curationVests = 0;
for (const op of rewardOps) {
const [type, data] = op.op;
if (type === "author_reward") {
authorVests += parseFloat(data.vesting_payout);
} else if (type === "curation_reward") {
curationVests += parseFloat(data.reward);
}
}
const totalVestsEarned = authorVests + curationVests;
const totalHive = totalVestsEarned * totalFund / totalVests;
const KE = totalHive / hivePower;
output.textContent =
`Nutzer: @${user}\n` +
`Hive Power: ${hivePower.toFixed(3)} HP\n` +
`Rewards erhalten: ${totalHive.toFixed(3)} HIVE\n` +
`KE: ${KE.toFixed(4)} HIVE/HP\n` +
`Analysierte Reward-Operationen: ${rewardOps.length}`;
}
berechneKE(username).catch(err => {
document.getElementById("output").textContent = "Fehler: " + err;
});
</script>
</body>
</html>
Ihr seht hier bereits den großen Unterschied, bei dem Account von hive-coding, der 3 Jahre alt ist und relativ wenige Aktivitäten im Vergleich zu anderen hatte.
Erstmal müsste man wirklich alle Aktivitäten des Acocunts auslesen, um die Rewards zu bekommen. Das Problem ist, dass diese alle in Vest und nicht in Hive abrufbar sind. Aber für KE brauche ich diese in Hive.
Nun, man kann Vest in Hive umrechnen, aber dafür benötigt man immer den zu dem Zeitpunkt aktuellen Faktor.
Wenn ich Vest von vor 3 Jahren mit dem Faktor von heute umrechne, dann stimmt der Wert nicht. Bedauerlicherweise kann ich nur den aktuellen Faktor abrufen, bzw. die aktuellen Werte um diesen Faktor zu bilden.
Zu kompliziert?
Nun stellt euch vor, ihr bekommt täglich 1 Dollar, den ihr täglich in Euro tauscht. Je nachdem wie der Kurs ist, bekommt ihr ggf. mehr als 1 Euro oder deutlich weniger. Wenn ihr nun zusammenrechnet, dass ihr nach einem Jahr 365 Dollar erhalten habt und diesen durch den aktuellen Kurs von 1,17 teilt, erhaltet ihr ca. 312 €.
Aber ihr habt jetzt auf dem Konto vielleicht 340€, weil der Kurs eben in den 365 Tagen auch deutlich besser war beim Tauschen in Euro.
Wieso kann ich mit HiveSQL den richtigen Wert erhalten? Das liegt daran, dass HiveSQL den Wert immer in Hive laufend hinzufügt in einer Spalte. Dieser muss nicht umgerechnet werden.
Posted Using INLEO