// Comprehensive score monitoring
class ScoreMonitor {
constructor(contract) {
this.contract = contract;
this.scoreHistory = new Map();
this.setupListeners();
}
setupListeners() {
// Track all score calculations
this.contract.on('ScoreCalculated', (user, totalScore, timestamp, event) => {
this.recordScore(user, totalScore, timestamp, event);
});
// Track score updates
this.contract.on('ScoreUpdated', (user, oldScore, newScore, event) => {
this.recordScoreChange(user, oldScore, newScore, event);
});
// Track category updates
this.contract.on('CategoryScoreUpdated', (user, category, score, event) => {
this.recordCategoryUpdate(user, category, score, event);
});
}
recordScore(user, totalScore, timestamp, event) {
if (!this.scoreHistory.has(user)) {
this.scoreHistory.set(user, []);
}
this.scoreHistory.get(user).push({
score: totalScore.toString(),
timestamp: timestamp.toNumber(),
blockNumber: event.blockNumber,
type: 'calculated'
});
console.log(`Score calculated: ${user} - ${totalScore.toString()}`);
}
recordScoreChange(user, oldScore, newScore, event) {
const change = newScore.sub(oldScore).toNumber();
const percentChange = ((change / oldScore.toNumber()) * 100).toFixed(2);
console.log(`Score changed: ${user}`);
console.log(` ${oldScore.toString()} → ${newScore.toString()}`);
console.log(` Change: ${change} (${percentChange}%)`);
}
recordCategoryUpdate(user, category, score, event) {
const categories = ['DeFi', 'NFT', 'Social', 'Trading', 'Governance', 'Gaming', 'Identity', 'Trust'];
console.log(`${categories[category]} updated: ${user} - ${score.toString()}`);
}
getUserHistory(user) {
return this.scoreHistory.get(user) || [];
}
getTopPerformers(limit = 10) {
const performers = [];
for (const [user, history] of this.scoreHistory.entries()) {
if (history.length > 0) {
const latestScore = parseInt(history[history.length - 1].score);
performers.push({ user, score: latestScore });
}
}
return performers.sort((a, b) => b.score - a.score).slice(0, limit);
}
}
// Usage
const monitor = new ScoreMonitor(contract);