SC CODE: Function InitializePrivate() Uint64
10 IF init() == 0 THEN GOTO 30
20 RETURN 1
30 STORE("nameHdr", "dashboard-smartcontracts.js")
31 STORE("descrHdr", "Smart contract analytics module")
32 STORE("iconURLHdr", "")
33 STORE("dURL", "explorer.tela")
34 STORE("docType", "TELA-JS-1")
35 STORE("subDir", "")
36 STORE("fileCheckC", "e387ec8d1d0ead9d78884c28a04eb9da01dadbb898d72b3824ace7188984da8")
37 STORE("fileCheckS", "fca2560394c7d9d5abfb16c8117377b300169d9b5f56a281a72a462d1eebe03")
100 RETURN 0
End Function
Function init() Uint64
10 IF EXISTS("owner") == 0 THEN GOTO 30
20 RETURN 1
30 STORE("owner", address())
50 STORE("docVersion", "1.0.0")
60 STORE("hash", HEX(TXID()))
70 STORE("likes", 0)
80 STORE("dislikes", 0)
100 RETURN 0
End Function
Function address() String
10 DIM s as String
20 LET s = SIGNER()
30 IF IS_ADDRESS_VALID(s) THEN GOTO 50
40 RETURN "anon"
50 RETURN ADDRESS_STRING(s)
End Function
Function Rate(r Uint64) Uint64
10 DIM addr as String
15 LET addr = address()
16 IF r < 100 && EXISTS(addr) == 0 && addr != "anon" THEN GOTO 30
20 RETURN 1
30 STORE(addr, ""+r+"_"+BLOCK_HEIGHT())
40 IF r < 50 THEN GOTO 70
50 STORE("likes", LOAD("likes")+1)
60 RETURN 0
70 STORE("dislikes", LOAD("dislikes")+1)
100 RETURN 0
End Function
/*
({
name:'dashboard-smartcontracts',
version:'1.0.0',
// Smart Contract monitoring variables
lastKnownSCCount: 0,
activeSCList: new Set(),
lastKnownSCActivity: {},
scActivity: [],
monitoringEnabled: true,
popularContracts: [],
async renderSCModule() {
return `
<!-- Smart Contract Analytics -->
<div class="enhanced-card">
<div class="card-header">
<h2 style="color: #fff; font-size: 1.6rem; font-weight: 700; margin: 0;">Smart Contract Analytics</h2>
<div class="actions">
<button onclick="window.dashboardSC.toggleMonitoring()" id="sc-toggle-btn" style="background: rgba(74,222,128,0.1); border: 1px solid #4ade80; color: #4ade80; padding: 0.5rem 1rem; border-radius: 6px; cursor: pointer; transition: all 0.2s ease; font-size: 0.8rem; font-weight: 500;">● LIVE</button>
</div>
</div>
<div class="card-content">
<div class="section-info" style="color: #b3b3b3; font-size: 0.9rem; margin-bottom: 1.5rem;">Real-time smart contract deployment and activity tracking • <span id="sc-last-updated" style="color: #4ade80; font-weight: 500;">Live</span></div>
<div class="stats-grid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 1rem;" id="smart-contract-analytics">
<div class="enhanced-stat-card" style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; text-align: center; transition: all 0.2s ease;">
<div style="color: #b3b3b3; font-size: 0.9rem; margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.5px;">Total SCs</div>
<div style="color: #b959b6; font-size: 1.6rem; font-weight: 700; margin-bottom: 0.5rem;" id="sc-total-count">Loading...</div>
<div style="color: #888; font-size: 0.8rem;" id="sc-count-change">—</div>
</div>
<div class="enhanced-stat-card" style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; text-align: center; transition: all 0.2s ease;">
<div style="color: #b3b3b3; font-size: 0.9rem; margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.5px;">Active Today</div>
<div style="color: #f59e0b; font-size: 1.6rem; font-weight: 700; margin-bottom: 0.5rem;" id="sc-active-today">Loading...</div>
<div style="color: #888; font-size: 0.8rem;" id="sc-activity-trend">—</div>
</div>
<div class="enhanced-stat-card" style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; text-align: center; transition: all 0.2s ease;">
<div style="color: #b3b3b3; font-size: 0.9rem; margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.5px;">Deployments</div>
<div style="color: #06b6d4; font-size: 1.6rem; font-weight: 700; margin-bottom: 0.5rem;" id="sc-deployments">Loading...</div>
<div style="color: #888; font-size: 0.8rem;" id="sc-deploy-trend">—</div>
</div>
<div class="enhanced-stat-card" style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; text-align: center; transition: all 0.2s ease;">
<div style="color: #b3b3b3; font-size: 0.9rem; margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.5px;">Top Contract</div>
<div style="color: #10b981; font-size: 1.6rem; font-weight: 700; margin-bottom: 0.5rem;" id="sc-top-contract">Loading...</div>
<div style="color: #888; font-size: 0.8rem;" id="sc-top-activity">—</div>
</div>
</div>
<!-- Popular Smart Contracts -->
<div style="margin-top: 2rem;">
<h3 style="color: #52c8db; margin-bottom: 1rem; font-size: 1.2rem; font-weight: 600;">Popular Smart Contracts</h3>
<div style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; max-height: 250px; overflow-y: auto;" id="popular-contracts-list">
<div style="color: #b3b3b3; text-align: center; padding: 2rem; font-style: italic;">Discovering smart contracts...</div>
</div>
</div>
<!-- Smart Contract Activity Feed -->
<div style="margin-top: 2rem;">
<h3 style="color: #52c8db; margin-bottom: 1rem; font-size: 1.2rem; font-weight: 600;">Recent Smart Contract Activity</h3>
<div style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; max-height: 250px; overflow-y: auto;" id="sc-activity-feed">
<div style="color: #b3b3b3; text-align: center; padding: 2rem; font-style: italic;">Monitoring smart contract activity...</div>
</div>
</div>
</div>
</div>`;
},
async updateModule() {
if(!this.monitoringEnabled) return;
// Check if we're on dashboard page
if(window.r !== 'home' && window.r !== '' && window.r) return;
try {
// Use enhanced smart contract discovery from XSWD core (ultra-conservative: 1 block)
const scDiscovery = await window.xswd.discoverSmartContracts(1);
if(!scDiscovery) return;
// Update smart contract metrics using discovered data
const discoveredSCs = scDiscovery.contracts || [];
const activityData = scDiscovery.activity || [];
const deployments = scDiscovery.deployments || [];
// Add discovered contracts to our active list
discoveredSCs.forEach(scid => this.activeSCList.add(scid));
const totalSCs = this.activeSCList.size;
const activeTodaySCs = activityData;
const newDeployments = deployments;
const topContract = this.findTopContract(activityData);
// Update display elements - check if they exist first
const totalCountEl = document.getElementById('sc-total-count');
if(totalCountEl) totalCountEl.textContent = totalSCs || 'Scanning...';
const activeTodayEl = document.getElementById('sc-active-today');
if(activeTodayEl) activeTodayEl.textContent = activeTodaySCs.length || '0';
const deploymentsEl = document.getElementById('sc-deployments');
if(deploymentsEl) deploymentsEl.textContent = newDeployments.length || '0';
const topContractEl = document.getElementById('sc-top-contract');
if(topContractEl) topContractEl.textContent = topContract ? this.formatSCID(topContract.scid) : 'None';
// Update change indicators
this.updateSCChangeIndicators(totalSCs, activeTodaySCs.length, newDeployments.length);
// Build popular contracts list from activity data
const popularContracts = this.buildPopularContractsList(activityData);
this.updatePopularContractsList(popularContracts);
// Update status and activity feed
const scStatusEl = document.getElementById('sc-last-updated');
if(scStatusEl) {
const timeStr = new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', second:'2-digit'});
let hasActivity = false;
// Add new smart contract activities to feed
if(newDeployments.length > 0) {
newDeployments.forEach(sc => {
this.addSCActivity('deployment', `New contract deployed: ${this.formatSCID(sc.scid)}`, timeStr);
hasActivity = true;
});
}
if(activeTodaySCs.length > 0 && activeTodaySCs.length > this.lastKnownSCCount) {
this.addSCActivity('activity', `${activeTodaySCs.length - this.lastKnownSCCount} contract${activeTodaySCs.length - this.lastKnownSCCount > 1 ? 's' : ''} became active`, timeStr);
hasActivity = true;
}
if(hasActivity) {
scStatusEl.textContent = `SC ACTIVITY at ${timeStr}`;
scStatusEl.style.color = '#b959b6';
setTimeout(() => {
scStatusEl.textContent = 'Live';
scStatusEl.style.color = '#4ade80';
}, 5000);
} else {
scStatusEl.textContent = `Updated ${timeStr}`;
scStatusEl.style.color = '#4ade80';
}
}
// Store current data for next comparison
this.lastKnownSCCount = activeTodaySCs.length;
this.popularContracts = popularContracts;
} catch(error) {
console.error('SC module update failed:', error);
const scStatusEl = document.getElementById('sc-last-updated');
if(scStatusEl) {
scStatusEl.textContent = 'SC Error';
scStatusEl.style.color = '#ef4444';
}
}
},
findTopContract(activityData) {
if(!activityData || activityData.length === 0) return null;
const activityCount = new Map();
activityData.forEach(activity => {
const count = activityCount.get(activity.scid) || 0;
activityCount.set(activity.scid, count + 1);
});
let topContract = null;
let maxActivity = 0;
activityCount.forEach((count, scid) => {
if(count > maxActivity) {
maxActivity = count;
topContract = { scid: scid, activity: count };
}
});
return topContract;
},
buildPopularContractsList(activityData) {
if(!activityData || activityData.length === 0) return [];
const activityCount = new Map();
activityData.forEach(activity => {
const count = activityCount.get(activity.scid) || 0;
activityCount.set(activity.scid, count + 1);
});
return Array.from(activityCount.entries())
.map(([scid, count]) => ({ scid, activity: count, isActive: true }))
.sort((a, b) => b.activity - a.activity)
.slice(0, 5);
},
updateSCChangeIndicators(totalSCs, activeTodayCount, deploymentsCount) {
const scCountChange = document.getElementById('sc-count-change');
if(scCountChange) {
const change = totalSCs - (this.lastKnownSCCount || 0);
if(change > 0) {
scCountChange.textContent = `+${change} new`;
scCountChange.style.color = '#4ade80';
} else if(change < 0) {
scCountChange.textContent = `${change}`;
scCountChange.style.color = '#ef4444';
} else {
scCountChange.textContent = 'Stable';
scCountChange.style.color = '#888';
}
}
const activityTrend = document.getElementById('sc-activity-trend');
if(activityTrend) {
if(activeTodayCount > 0) {
activityTrend.textContent = activeTodayCount > 5 ? 'High activity' : 'Active';
activityTrend.style.color = '#f59e0b';
} else {
activityTrend.textContent = 'Quiet';
activityTrend.style.color = '#888';
}
}
const deployTrend = document.getElementById('sc-deploy-trend');
if(deployTrend) {
if(deploymentsCount > 0) {
deployTrend.textContent = `+${deploymentsCount} recent`;
deployTrend.style.color = '#06b6d4';
} else {
deployTrend.textContent = 'None recent';
deployTrend.style.color = '#888';
}
}
const topActivity = document.getElementById('sc-top-activity');
if(topActivity) {
topActivity.textContent = this.popularContracts.length > 0 ? `${this.popularContracts[0].activity || 0} calls` : 'No activity';
topActivity.style.color = this.popularContracts.length > 0 ? '#10b981' : '#888';
}
},
updatePopularContractsList(popularContracts) {
const listEl = document.getElementById('popular-contracts-list');
if(!listEl) return;
if(!popularContracts || popularContracts.length === 0) {
listEl.innerHTML = '<div style="color:#666;text-align:center;padding:2rem">No smart contracts discovered yet</div>';
return;
}
const contractsHtml = popularContracts.map((contract, index) => {
const rank = index + 1;
let icon = '📜';
let rankColor = '#888';
if(rank === 1) {
icon = '👑';
rankColor = '#fbbf24';
} else if(rank === 2) {
icon = '🥈';
rankColor = '#9ca3af';
} else if(rank === 3) {
icon = '🥉';
rankColor = '#cd7c2f';
}
return `<div style="display:flex;align-items:center;justify-content:space-between;padding:0.75rem 0;border-bottom:1px solid rgba(255,255,255,0.05)">
<div style="display:flex;align-items:center;gap:0.75rem">
<span style="font-size:1.1rem">${icon}</span>
<div>
<div style="color:#fff;font-size:0.9rem;font-family:monospace">${this.formatSCID(contract.scid)}</div>
<div style="color:${rankColor};font-size:0.8rem">#${rank} Most Active</div>
</div>
</div>
<div style="text-align:right">
<div style="color:#4ade80;font-size:0.9rem;font-weight:600">${contract.activity}</div>
<div style="color:#888;font-size:0.75rem">calls</div>
</div>
</div>`;
}).join('');
listEl.innerHTML = contractsHtml;
},
formatSCID(scid) {
if(!scid || scid.length < 16) return 'Unknown';
return scid.substring(0, 8) + '...' + scid.substring(scid.length - 6);
},
addSCActivity(type, message, timestamp) {
const activity = {
type: type,
message: message,
timestamp: timestamp,
time: Date.now()
};
this.scActivity.unshift(activity);
if(this.scActivity.length > 10) {
this.scActivity = this.scActivity.slice(0, 10);
}
this.updateSCActivityFeed();
},
updateSCActivityFeed() {
const feedEl = document.getElementById('sc-activity-feed');
if(!feedEl) return;
if(this.scActivity.length === 0) {
feedEl.innerHTML = '<div style="color:#666;text-align:center;padding:2rem">No recent smart contract activity</div>';
return;
}
const activityHtml = this.scActivity.map(activity => {
let icon = '📜';
if(activity.type === 'deployment') {
icon = '🚀';
} else if(activity.type === 'activity') {
icon = '⚡';
} else if(activity.type === 'call') {
icon = '📞';
}
return `<div style="display:flex;align-items:center;justify-content:space-between;padding:0.5rem 0;border-bottom:1px solid rgba(255,255,255,0.05)">
<div style="display:flex;align-items:center;gap:0.75rem">
<span style="font-size:1.1rem">${icon}</span>
<span style="color:#fff;font-size:0.9rem">${activity.message}</span>
</div>
<span style="color:#888;font-size:0.8rem">${activity.timestamp}</span>
</div>`;
}).join('');
feedEl.innerHTML = activityHtml;
},
toggleMonitoring() {
this.monitoringEnabled = !this.monitoringEnabled;
const btn = document.getElementById('sc-toggle-btn');
if(btn) {
if(this.monitoringEnabled) {
btn.textContent = '● LIVE';
btn.style.color = '#4ade80';
btn.style.borderColor = '#4ade80';
this.updateModule();
} else {
btn.textContent = '○ STOPPED';
btn.style.color = '#888';
btn.style.borderColor = '#555';
const scStatusEl = document.getElementById('sc-last-updated');
if(scStatusEl) {
scStatusEl.textContent = 'Stopped';
scStatusEl.style.color = '#888';
}
}
}
return this.monitoringEnabled;
},
stopMonitoring() {
this.monitoringEnabled = false;
const scStatusEl = document.getElementById('sc-last-updated');
if(scStatusEl) {
scStatusEl.textContent = 'Stopped';
scStatusEl.style.color = '#888';
}
}
})
*/ |
SC Arguments: [Name:SC_ACTION Type:uint64 Value:'1' Name:SC_CODE Type:string Value:'Function InitializePrivate() Uint64
10 IF init() == 0 THEN GOTO 30
20 RETURN 1
30 STORE("nameHdr", "dashboard-smartcontracts.js")
31 STORE("descrHdr", "Smart contract analytics module")
32 STORE("iconURLHdr", "")
33 STORE("dURL", "explorer.tela")
34 STORE("docType", "TELA-JS-1")
35 STORE("subDir", "")
36 STORE("fileCheckC", "e387ec8d1d0ead9d78884c28a04eb9da01dadbb898d72b3824ace7188984da8")
37 STORE("fileCheckS", "fca2560394c7d9d5abfb16c8117377b300169d9b5f56a281a72a462d1eebe03")
100 RETURN 0
End Function
Function init() Uint64
10 IF EXISTS("owner") == 0 THEN GOTO 30
20 RETURN 1
30 STORE("owner", address())
50 STORE("docVersion", "1.0.0")
60 STORE("hash", HEX(TXID()))
70 STORE("likes", 0)
80 STORE("dislikes", 0)
100 RETURN 0
End Function
Function address() String
10 DIM s as String
20 LET s = SIGNER()
30 IF IS_ADDRESS_VALID(s) THEN GOTO 50
40 RETURN "anon"
50 RETURN ADDRESS_STRING(s)
End Function
Function Rate(r Uint64) Uint64
10 DIM addr as String
15 LET addr = address()
16 IF r < 100 && EXISTS(addr) == 0 && addr != "anon" THEN GOTO 30
20 RETURN 1
30 STORE(addr, ""+r+"_"+BLOCK_HEIGHT())
40 IF r < 50 THEN GOTO 70
50 STORE("likes", LOAD("likes")+1)
60 RETURN 0
70 STORE("dislikes", LOAD("dislikes")+1)
100 RETURN 0
End Function
/*
({
name:'dashboard-smartcontracts',
version:'1.0.0',
// Smart Contract monitoring variables
lastKnownSCCount: 0,
activeSCList: new Set(),
lastKnownSCActivity: {},
scActivity: [],
monitoringEnabled: true,
popularContracts: [],
async renderSCModule() {
return `
<!-- Smart Contract Analytics -->
<div class="enhanced-card">
<div class="card-header">
<h2 style="color: #fff; font-size: 1.6rem; font-weight: 700; margin: 0;">Smart Contract Analytics</h2>
<div class="actions">
<button onclick="window.dashboardSC.toggleMonitoring()" id="sc-toggle-btn" style="background: rgba(74,222,128,0.1); border: 1px solid #4ade80; color: #4ade80; padding: 0.5rem 1rem; border-radius: 6px; cursor: pointer; transition: all 0.2s ease; font-size: 0.8rem; font-weight: 500;">● LIVE</button>
</div>
</div>
<div class="card-content">
<div class="section-info" style="color: #b3b3b3; font-size: 0.9rem; margin-bottom: 1.5rem;">Real-time smart contract deployment and activity tracking • <span id="sc-last-updated" style="color: #4ade80; font-weight: 500;">Live</span></div>
<div class="stats-grid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 1rem;" id="smart-contract-analytics">
<div class="enhanced-stat-card" style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; text-align: center; transition: all 0.2s ease;">
<div style="color: #b3b3b3; font-size: 0.9rem; margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.5px;">Total SCs</div>
<div style="color: #b959b6; font-size: 1.6rem; font-weight: 700; margin-bottom: 0.5rem;" id="sc-total-count">Loading...</div>
<div style="color: #888; font-size: 0.8rem;" id="sc-count-change">—</div>
</div>
<div class="enhanced-stat-card" style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; text-align: center; transition: all 0.2s ease;">
<div style="color: #b3b3b3; font-size: 0.9rem; margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.5px;">Active Today</div>
<div style="color: #f59e0b; font-size: 1.6rem; font-weight: 700; margin-bottom: 0.5rem;" id="sc-active-today">Loading...</div>
<div style="color: #888; font-size: 0.8rem;" id="sc-activity-trend">—</div>
</div>
<div class="enhanced-stat-card" style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; text-align: center; transition: all 0.2s ease;">
<div style="color: #b3b3b3; font-size: 0.9rem; margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.5px;">Deployments</div>
<div style="color: #06b6d4; font-size: 1.6rem; font-weight: 700; margin-bottom: 0.5rem;" id="sc-deployments">Loading...</div>
<div style="color: #888; font-size: 0.8rem;" id="sc-deploy-trend">—</div>
</div>
<div class="enhanced-stat-card" style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; text-align: center; transition: all 0.2s ease;">
<div style="color: #b3b3b3; font-size: 0.9rem; margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.5px;">Top Contract</div>
<div style="color: #10b981; font-size: 1.6rem; font-weight: 700; margin-bottom: 0.5rem;" id="sc-top-contract">Loading...</div>
<div style="color: #888; font-size: 0.8rem;" id="sc-top-activity">—</div>
</div>
</div>
<!-- Popular Smart Contracts -->
<div style="margin-top: 2rem;">
<h3 style="color: #52c8db; margin-bottom: 1rem; font-size: 1.2rem; font-weight: 600;">Popular Smart Contracts</h3>
<div style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; max-height: 250px; overflow-y: auto;" id="popular-contracts-list">
<div style="color: #b3b3b3; text-align: center; padding: 2rem; font-style: italic;">Discovering smart contracts...</div>
</div>
</div>
<!-- Smart Contract Activity Feed -->
<div style="margin-top: 2rem;">
<h3 style="color: #52c8db; margin-bottom: 1rem; font-size: 1.2rem; font-weight: 600;">Recent Smart Contract Activity</h3>
<div style="background: rgba(0,0,0,0.2); border: 1px solid rgba(82,200,219,0.3); border-radius: 8px; padding: 1.5rem; max-height: 250px; overflow-y: auto;" id="sc-activity-feed">
<div style="color: #b3b3b3; text-align: center; padding: 2rem; font-style: italic;">Monitoring smart contract activity...</div>
</div>
</div>
</div>
</div>`;
},
async updateModule() {
if(!this.monitoringEnabled) return;
// Check if we're on dashboard page
if(window.r !== 'home' && window.r !== '' && window.r) return;
try {
// Use enhanced smart contract discovery from XSWD core (ultra-conservative: 1 block)
const scDiscovery = await window.xswd.discoverSmartContracts(1);
if(!scDiscovery) return;
// Update smart contract metrics using discovered data
const discoveredSCs = scDiscovery.contracts || [];
const activityData = scDiscovery.activity || [];
const deployments = scDiscovery.deployments || [];
// Add discovered contracts to our active list
discoveredSCs.forEach(scid => this.activeSCList.add(scid));
const totalSCs = this.activeSCList.size;
const activeTodaySCs = activityData;
const newDeployments = deployments;
const topContract = this.findTopContract(activityData);
// Update display elements - check if they exist first
const totalCountEl = document.getElementById('sc-total-count');
if(totalCountEl) totalCountEl.textContent = totalSCs || 'Scanning...';
const activeTodayEl = document.getElementById('sc-active-today');
if(activeTodayEl) activeTodayEl.textContent = activeTodaySCs.length || '0';
const deploymentsEl = document.getElementById('sc-deployments');
if(deploymentsEl) deploymentsEl.textContent = newDeployments.length || '0';
const topContractEl = document.getElementById('sc-top-contract');
if(topContractEl) topContractEl.textContent = topContract ? this.formatSCID(topContract.scid) : 'None';
// Update change indicators
this.updateSCChangeIndicators(totalSCs, activeTodaySCs.length, newDeployments.length);
// Build popular contracts list from activity data
const popularContracts = this.buildPopularContractsList(activityData);
this.updatePopularContractsList(popularContracts);
// Update status and activity feed
const scStatusEl = document.getElementById('sc-last-updated');
if(scStatusEl) {
const timeStr = new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', second:'2-digit'});
let hasActivity = false;
// Add new smart contract activities to feed
if(newDeployments.length > 0) {
newDeployments.forEach(sc => {
this.addSCActivity('deployment', `New contract deployed: ${this.formatSCID(sc.scid)}`, timeStr);
hasActivity = true;
});
}
if(activeTodaySCs.length > 0 && activeTodaySCs.length > this.lastKnownSCCount) {
this.addSCActivity('activity', `${activeTodaySCs.length - this.lastKnownSCCount} contract${activeTodaySCs.length - this.lastKnownSCCount > 1 ? 's' : ''} became active`, timeStr);
hasActivity = true;
}
if(hasActivity) {
scStatusEl.textContent = `SC ACTIVITY at ${timeStr}`;
scStatusEl.style.color = '#b959b6';
setTimeout(() => {
scStatusEl.textContent = 'Live';
scStatusEl.style.color = '#4ade80';
}, 5000);
} else {
scStatusEl.textContent = `Updated ${timeStr}`;
scStatusEl.style.color = '#4ade80';
}
}
// Store current data for next comparison
this.lastKnownSCCount = activeTodaySCs.length;
this.popularContracts = popularContracts;
} catch(error) {
console.error('SC module update failed:', error);
const scStatusEl = document.getElementById('sc-last-updated');
if(scStatusEl) {
scStatusEl.textContent = 'SC Error';
scStatusEl.style.color = '#ef4444';
}
}
},
findTopContract(activityData) {
if(!activityData || activityData.length === 0) return null;
const activityCount = new Map();
activityData.forEach(activity => {
const count = activityCount.get(activity.scid) || 0;
activityCount.set(activity.scid, count + 1);
});
let topContract = null;
let maxActivity = 0;
activityCount.forEach((count, scid) => {
if(count > maxActivity) {
maxActivity = count;
topContract = { scid: scid, activity: count };
}
});
return topContract;
},
buildPopularContractsList(activityData) {
if(!activityData || activityData.length === 0) return [];
const activityCount = new Map();
activityData.forEach(activity => {
const count = activityCount.get(activity.scid) || 0;
activityCount.set(activity.scid, count + 1);
});
return Array.from(activityCount.entries())
.map(([scid, count]) => ({ scid, activity: count, isActive: true }))
.sort((a, b) => b.activity - a.activity)
.slice(0, 5);
},
updateSCChangeIndicators(totalSCs, activeTodayCount, deploymentsCount) {
const scCountChange = document.getElementById('sc-count-change');
if(scCountChange) {
const change = totalSCs - (this.lastKnownSCCount || 0);
if(change > 0) {
scCountChange.textContent = `+${change} new`;
scCountChange.style.color = '#4ade80';
} else if(change < 0) {
scCountChange.textContent = `${change}`;
scCountChange.style.color = '#ef4444';
} else {
scCountChange.textContent = 'Stable';
scCountChange.style.color = '#888';
}
}
const activityTrend = document.getElementById('sc-activity-trend');
if(activityTrend) {
if(activeTodayCount > 0) {
activityTrend.textContent = activeTodayCount > 5 ? 'High activity' : 'Active';
activityTrend.style.color = '#f59e0b';
} else {
activityTrend.textContent = 'Quiet';
activityTrend.style.color = '#888';
}
}
const deployTrend = document.getElementById('sc-deploy-trend');
if(deployTrend) {
if(deploymentsCount > 0) {
deployTrend.textContent = `+${deploymentsCount} recent`;
deployTrend.style.color = '#06b6d4';
} else {
deployTrend.textContent = 'None recent';
deployTrend.style.color = '#888';
}
}
const topActivity = document.getElementById('sc-top-activity');
if(topActivity) {
topActivity.textContent = this.popularContracts.length > 0 ? `${this.popularContracts[0].activity || 0} calls` : 'No activity';
topActivity.style.color = this.popularContracts.length > 0 ? '#10b981' : '#888';
}
},
updatePopularContractsList(popularContracts) {
const listEl = document.getElementById('popular-contracts-list');
if(!listEl) return;
if(!popularContracts || popularContracts.length === 0) {
listEl.innerHTML = '<div style="color:#666;text-align:center;padding:2rem">No smart contracts discovered yet</div>';
return;
}
const contractsHtml = popularContracts.map((contract, index) => {
const rank = index + 1;
let icon = '📜';
let rankColor = '#888';
if(rank === 1) {
icon = '👑';
rankColor = '#fbbf24';
} else if(rank === 2) {
icon = '🥈';
rankColor = '#9ca3af';
} else if(rank === 3) {
icon = '🥉';
rankColor = '#cd7c2f';
}
return `<div style="display:flex;align-items:center;justify-content:space-between;padding:0.75rem 0;border-bottom:1px solid rgba(255,255,255,0.05)">
<div style="display:flex;align-items:center;gap:0.75rem">
<span style="font-size:1.1rem">${icon}</span>
<div>
<div style="color:#fff;font-size:0.9rem;font-family:monospace">${this.formatSCID(contract.scid)}</div>
<div style="color:${rankColor};font-size:0.8rem">#${rank} Most Active</div>
</div>
</div>
<div style="text-align:right">
<div style="color:#4ade80;font-size:0.9rem;font-weight:600">${contract.activity}</div>
<div style="color:#888;font-size:0.75rem">calls</div>
</div>
</div>`;
}).join('');
listEl.innerHTML = contractsHtml;
},
formatSCID(scid) {
if(!scid || scid.length < 16) return 'Unknown';
return scid.substring(0, 8) + '...' + scid.substring(scid.length - 6);
},
addSCActivity(type, message, timestamp) {
const activity = {
type: type,
message: message,
timestamp: timestamp,
time: Date.now()
};
this.scActivity.unshift(activity);
if(this.scActivity.length > 10) {
this.scActivity = this.scActivity.slice(0, 10);
}
this.updateSCActivityFeed();
},
updateSCActivityFeed() {
const feedEl = document.getElementById('sc-activity-feed');
if(!feedEl) return;
if(this.scActivity.length === 0) {
feedEl.innerHTML = '<div style="color:#666;text-align:center;padding:2rem">No recent smart contract activity</div>';
return;
}
const activityHtml = this.scActivity.map(activity => {
let icon = '📜';
if(activity.type === 'deployment') {
icon = '🚀';
} else if(activity.type === 'activity') {
icon = '⚡';
} else if(activity.type === 'call') {
icon = '📞';
}
return `<div style="display:flex;align-items:center;justify-content:space-between;padding:0.5rem 0;border-bottom:1px solid rgba(255,255,255,0.05)">
<div style="display:flex;align-items:center;gap:0.75rem">
<span style="font-size:1.1rem">${icon}</span>
<span style="color:#fff;font-size:0.9rem">${activity.message}</span>
</div>
<span style="color:#888;font-size:0.8rem">${activity.timestamp}</span>
</div>`;
}).join('');
feedEl.innerHTML = activityHtml;
},
toggleMonitoring() {
this.monitoringEnabled = !this.monitoringEnabled;
const btn = document.getElementById('sc-toggle-btn');
if(btn) {
if(this.monitoringEnabled) {
btn.textContent = '● LIVE';
btn.style.color = '#4ade80';
btn.style.borderColor = '#4ade80';
this.updateModule();
} else {
btn.textContent = '○ STOPPED';
btn.style.color = '#888';
btn.style.borderColor = '#555';
const scStatusEl = document.getElementById('sc-last-updated');
if(scStatusEl) {
scStatusEl.textContent = 'Stopped';
scStatusEl.style.color = '#888';
}
}
}
return this.monitoringEnabled;
},
stopMonitoring() {
this.monitoringEnabled = false;
const scStatusEl = document.getElementById('sc-last-updated');
if(scStatusEl) {
scStatusEl.textContent = 'Stopped';
scStatusEl.style.color = '#888';
}
}
})
*/'] |