SC CODE: Function InitializePrivate() Uint64
10 IF init() == 0 THEN GOTO 30
20 RETURN 1
30 STORE("nameHdr", "blocks-extras.js")
31 STORE("descrHdr", "Miniblock and technical analysis")
32 STORE("iconURLHdr", "")
33 STORE("dURL", "explorer.tela")
34 STORE("docType", "TELA-JS-1")
35 STORE("subDir", "")
36 STORE("fileCheckC", "d9fad0a75961742c6210d79ac79a043fa139f08e468643eb2958e6363d34667")
37 STORE("fileCheckS", "22fc1d5df2c4176cca1cc5db225ab8bb835b201d813a55ce6fd23aaeda942bc1")
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: 'blocks-extras',
version: '1.0.0',
renderMiniblockExplorer(mb, miners) {
if (!mb || mb.length === 0) {
return '<div style="background:rgba(0,0,0,0.2);padding:1.5rem;border-radius:8px;margin-bottom:2rem;"><h3 style="color:#52c8db;">Miniblocks Analysis</h3><div style="text-align:center;color:#888;padding:2rem;">No miniblocks found</div></div>';
}
const mbRows = mb.map((m, i) => {
const sc = m.Final ? '#4ade80' : '#fbbf24';
const si = m.Final ? '✓' : '●';
const mo = miners.filter(x => x === (m.Miner || m.miner)).length;
return '<div style="background:rgba(0,0,0,0.1);border:1px solid rgba(255,255,255,0.05);border-radius:6px;padding:1rem;margin-bottom:0.75rem;">' +
'<div style="display:flex;justify-content:space-between;margin-bottom:0.75rem;">' +
'<div style="color:#52c8db;">Miniblock ' + (i + 1) + '</div>' +
'<div style="color:' + sc + ';">' + si + ' ' + (m.Final ? 'Final' : 'Pending') + '</div>' +
'</div>' +
'<div style="color:#fff;">Miner: ' + (m.Miner || m.miner || 'Unknown') + '</div>' +
'<div style="color:#fbbf24;">Times Mined: ' + mo + '</div>' +
'<div style="color:white;">Time: ' + new Date(m.Timestamp || 0).toLocaleTimeString() + '</div>' +
'</div>';
}).join('');
const um = [...new Set(mb.map(x => x.Miner || x.miner))];
const fc = mb.filter(x => x.Final).length;
return '<div style="background:rgba(0,0,0,0.2);padding:1.5rem;border-radius:8px;margin-bottom:2rem;">' +
'<h3 style="color:#52c8db;">Miniblocks Analysis</h3>' +
'<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:1rem;margin-bottom:1.5rem;">' +
'<div style="background:rgba(0,0,0,0.2);padding:1rem;border-radius:6px;text-align:center;"><div style="color:#52c8db;font-size:1.5rem;">' + mb.length + '</div><div style="color:#888;">Total</div></div>' +
'<div style="background:rgba(0,0,0,0.2);padding:1rem;border-radius:6px;text-align:center;"><div style="color:#4ade80;font-size:1.5rem;">' + fc + '</div><div style="color:#888;">Final</div></div>' +
'<div style="background:rgba(0,0,0,0.2);padding:1rem;border-radius:6px;text-align:center;"><div style="color:#fbbf24;font-size:1.5rem;">' + um.length + '</div><div style="color:#888;">Miners</div></div>' +
'</div>' +
mbRows +
'</div>';
},
renderTechnicalAnalysis(blockData, json, hash) {
const header = blockData.block_header || blockData;
const blockSize = header.block_size || 0;
const txCount = json.tx_hashes ? json.tx_hashes.length : 0;
const avgTxSize = txCount > 0 ? Math.floor(blockSize / txCount) : 0;
const difficulty = header.difficulty || 0;
const difficultyGH = (difficulty / 1000000000).toFixed(1);
return '<div style="background:rgba(0,0,0,0.2);padding:1.5rem;border-radius:8px;margin-bottom:2rem;">' +
'<h3 style="color:#52c8db;">Technical Analysis</h3>' +
'<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1.5rem;">' +
'<div style="background:rgba(0,0,0,0.1);padding:1.25rem;border-radius:6px;">' +
'<h4 style="color:#fbbf24;">Block Metrics</h4>' +
'<div>Average TX Size: ' + avgTxSize + ' bytes</div>' +
'<div>Block Fullness: ' + ((blockSize / 307200) * 100).toFixed(1) + '%</div>' +
'</div>' +
'<div style="background:rgba(0,0,0,0.1);padding:1.25rem;border-radius:6px;">' +
'<h4 style="color:#4ade80;">Mining Stats</h4>' +
'<div>Network Hashrate: ~' + difficultyGH + ' GH/s</div>' +
'<div>Difficulty: ' + difficulty.toLocaleString() + '</div>' +
'</div>' +
'</div></div>';
},
renderRawDataViewer(blockData, json, hash) {
const jsonString = JSON.stringify(json, null, 2);
const escapedJson = jsonString.replace(/'/g, "\\'").replace(/`/g, '\\`');
return '<div style="background:rgba(0,0,0,0.2);padding:1.5rem;border-radius:8px;">' +
'<div style="display:flex;justify-content:space-between;margin-bottom:1rem;">' +
'<h3 style="color:#52c8db;">Raw Block Data</h3>' +
'<button onclick="copyBlockData(\'' + escapedJson + '\')" style="padding:8px 12px;background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.2);color:#52c8db;border-radius:6px;cursor:pointer;">Copy JSON</button>' +
'</div>' +
'<div style="background:rgba(0,0,0,0.3);border-radius:6px;padding:1rem;overflow:auto;max-height:400px;">' +
'<pre style="margin:0;font-family:monospace;color:#4ade80;">' + jsonString + '</pre>' +
'</div></div>';
},
initCopyFunction() {
if (!window.copyBlockData) {
window.copyBlockData = function(s) {
try {
const d = s.replace(/\\'/g, "'").replace(/\\`/g, '`');
navigator.clipboard.writeText(d).then(() => {
const b = event.target;
const o = b.textContent;
b.textContent = '✓ Copied!';
b.style.color = '#4ade80';
setTimeout(() => {
b.textContent = o;
b.style.color = '#52c8db';
}, 2000);
}).catch(e => {
const b = event.target;
b.textContent = '❌ Failed';
setTimeout(() => b.textContent = 'Copy JSON', 2000);
});
} catch (e) {}
};
}
}
})
*/ |
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", "blocks-extras.js")
31 STORE("descrHdr", "Miniblock and technical analysis")
32 STORE("iconURLHdr", "")
33 STORE("dURL", "explorer.tela")
34 STORE("docType", "TELA-JS-1")
35 STORE("subDir", "")
36 STORE("fileCheckC", "d9fad0a75961742c6210d79ac79a043fa139f08e468643eb2958e6363d34667")
37 STORE("fileCheckS", "22fc1d5df2c4176cca1cc5db225ab8bb835b201d813a55ce6fd23aaeda942bc1")
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: 'blocks-extras',
version: '1.0.0',
renderMiniblockExplorer(mb, miners) {
if (!mb || mb.length === 0) {
return '<div style="background:rgba(0,0,0,0.2);padding:1.5rem;border-radius:8px;margin-bottom:2rem;"><h3 style="color:#52c8db;">Miniblocks Analysis</h3><div style="text-align:center;color:#888;padding:2rem;">No miniblocks found</div></div>';
}
const mbRows = mb.map((m, i) => {
const sc = m.Final ? '#4ade80' : '#fbbf24';
const si = m.Final ? '✓' : '●';
const mo = miners.filter(x => x === (m.Miner || m.miner)).length;
return '<div style="background:rgba(0,0,0,0.1);border:1px solid rgba(255,255,255,0.05);border-radius:6px;padding:1rem;margin-bottom:0.75rem;">' +
'<div style="display:flex;justify-content:space-between;margin-bottom:0.75rem;">' +
'<div style="color:#52c8db;">Miniblock ' + (i + 1) + '</div>' +
'<div style="color:' + sc + ';">' + si + ' ' + (m.Final ? 'Final' : 'Pending') + '</div>' +
'</div>' +
'<div style="color:#fff;">Miner: ' + (m.Miner || m.miner || 'Unknown') + '</div>' +
'<div style="color:#fbbf24;">Times Mined: ' + mo + '</div>' +
'<div style="color:white;">Time: ' + new Date(m.Timestamp || 0).toLocaleTimeString() + '</div>' +
'</div>';
}).join('');
const um = [...new Set(mb.map(x => x.Miner || x.miner))];
const fc = mb.filter(x => x.Final).length;
return '<div style="background:rgba(0,0,0,0.2);padding:1.5rem;border-radius:8px;margin-bottom:2rem;">' +
'<h3 style="color:#52c8db;">Miniblocks Analysis</h3>' +
'<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:1rem;margin-bottom:1.5rem;">' +
'<div style="background:rgba(0,0,0,0.2);padding:1rem;border-radius:6px;text-align:center;"><div style="color:#52c8db;font-size:1.5rem;">' + mb.length + '</div><div style="color:#888;">Total</div></div>' +
'<div style="background:rgba(0,0,0,0.2);padding:1rem;border-radius:6px;text-align:center;"><div style="color:#4ade80;font-size:1.5rem;">' + fc + '</div><div style="color:#888;">Final</div></div>' +
'<div style="background:rgba(0,0,0,0.2);padding:1rem;border-radius:6px;text-align:center;"><div style="color:#fbbf24;font-size:1.5rem;">' + um.length + '</div><div style="color:#888;">Miners</div></div>' +
'</div>' +
mbRows +
'</div>';
},
renderTechnicalAnalysis(blockData, json, hash) {
const header = blockData.block_header || blockData;
const blockSize = header.block_size || 0;
const txCount = json.tx_hashes ? json.tx_hashes.length : 0;
const avgTxSize = txCount > 0 ? Math.floor(blockSize / txCount) : 0;
const difficulty = header.difficulty || 0;
const difficultyGH = (difficulty / 1000000000).toFixed(1);
return '<div style="background:rgba(0,0,0,0.2);padding:1.5rem;border-radius:8px;margin-bottom:2rem;">' +
'<h3 style="color:#52c8db;">Technical Analysis</h3>' +
'<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1.5rem;">' +
'<div style="background:rgba(0,0,0,0.1);padding:1.25rem;border-radius:6px;">' +
'<h4 style="color:#fbbf24;">Block Metrics</h4>' +
'<div>Average TX Size: ' + avgTxSize + ' bytes</div>' +
'<div>Block Fullness: ' + ((blockSize / 307200) * 100).toFixed(1) + '%</div>' +
'</div>' +
'<div style="background:rgba(0,0,0,0.1);padding:1.25rem;border-radius:6px;">' +
'<h4 style="color:#4ade80;">Mining Stats</h4>' +
'<div>Network Hashrate: ~' + difficultyGH + ' GH/s</div>' +
'<div>Difficulty: ' + difficulty.toLocaleString() + '</div>' +
'</div>' +
'</div></div>';
},
renderRawDataViewer(blockData, json, hash) {
const jsonString = JSON.stringify(json, null, 2);
const escapedJson = jsonString.replace(/'/g, "\\'").replace(/`/g, '\\`');
return '<div style="background:rgba(0,0,0,0.2);padding:1.5rem;border-radius:8px;">' +
'<div style="display:flex;justify-content:space-between;margin-bottom:1rem;">' +
'<h3 style="color:#52c8db;">Raw Block Data</h3>' +
'<button onclick="copyBlockData(\'' + escapedJson + '\')" style="padding:8px 12px;background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.2);color:#52c8db;border-radius:6px;cursor:pointer;">Copy JSON</button>' +
'</div>' +
'<div style="background:rgba(0,0,0,0.3);border-radius:6px;padding:1rem;overflow:auto;max-height:400px;">' +
'<pre style="margin:0;font-family:monospace;color:#4ade80;">' + jsonString + '</pre>' +
'</div></div>';
},
initCopyFunction() {
if (!window.copyBlockData) {
window.copyBlockData = function(s) {
try {
const d = s.replace(/\\'/g, "'").replace(/\\`/g, '`');
navigator.clipboard.writeText(d).then(() => {
const b = event.target;
const o = b.textContent;
b.textContent = '✓ Copied!';
b.style.color = '#4ade80';
setTimeout(() => {
b.textContent = o;
b.style.color = '#52c8db';
}, 2000);
}).catch(e => {
const b = event.target;
b.textContent = '❌ Failed';
setTimeout(() => b.textContent = 'Copy JSON', 2000);
});
} catch (e) {}
};
}
}
})
*/'] |