SC CODE: Function InitializePrivate() Uint64
10 IF init() == 0 THEN GOTO 30
20 RETURN 1
30 STORE("var_header_name", "index.html")
31 STORE("var_header_description", "")
32 STORE("var_header_icon", "")
33 STORE("dURL", "")
34 STORE("docType", "TELA-HTML-1")
35 STORE("subDir", "/")
36 STORE("fileCheckC", "0277b637ebefd68d20e4a7cf6dda2d3dfed15b8790b5f984bef767b5442c547f")
37 STORE("fileCheckS", "1c899c3bdd36a49a722dcc1f3efc2c8d5f70fc9a6299192593254e323393c2f0")
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
/*
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DERO Explorer // TELA Edition v2.0</title>
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<!-- HOLOGRAM Design System Styles (Split for TELA compliance) -->
<link rel="stylesheet" href="styles-base.css">
<link rel="stylesheet" href="styles-components.css">
<link rel="stylesheet" href="styles-features.css">
</head>
<body>
<div class="app-container">
<!-- Top Bar -->
<header class="top-bar">
<div class="logo-area">
<img src="logo.svg" alt="DERO" class="logo-icon">
<div>
<div class="logo-text">DERO EXPLORER</div>
<div class="logo-version">TELA Edition v2.0</div>
</div>
</div>
<div class="status-area">
<div class="status-indicator" id="node-status">
<span class="status-dot connecting" id="node-dot"></span>
<span class="status-label" id="node-label">Connecting...</span>
</div>
<div class="status-indicator" id="wallet-status">
<span class="status-dot disconnected" id="wallet-dot"></span>
<span class="status-label" id="wallet-label">No Wallet</span>
</div>
</div>
</header>
<!-- Navigation Row -->
<nav class="nav-row">
<button class="nav-btn active" data-view="dashboard" onclick="navigate('dashboard')">
<span class="nav-icon">[D]</span>
<span>Dashboard</span>
</button>
<button class="nav-btn" data-view="blocks" onclick="navigate('blocks')">
<span class="nav-icon">[B]</span>
<span>Blocks</span>
</button>
<button class="nav-btn" data-view="pool" onclick="navigate('pool')">
<span class="nav-icon">[T]</span>
<span>Pool</span>
</button>
<button class="nav-btn" data-view="contracts" onclick="navigate('contracts')">
<span class="nav-icon">[SC]</span>
<span>Contracts</span>
</button>
<button class="nav-btn" data-view="tools" onclick="navigate('tools')">
<span class="nav-icon">[*]</span>
<span>Tools</span>
</button>
<div class="nav-spacer"></div>
<!-- Search -->
<div class="search-container">
<span class="search-icon">></span>
<input
type="text"
class="search-input"
id="search-input"
placeholder="Search block, tx, SCID..."
onkeydown="handleSearch(event)"
>
<span class="search-hint">Enter</span>
</div>
</nav>
<!-- Main Content Area -->
<main class="main-content" id="main-content">
<!-- Dashboard View (Default) -->
<div id="view-dashboard">
<!-- Stats Grid -->
<div class="dashboard-grid" id="stats-grid">
<div class="stat-card">
<div class="stat-icon">[H]</div>
<div class="stat-value" id="stat-height">--</div>
<div class="stat-label">Block Height</div>
</div>
<div class="stat-card">
<div class="stat-icon">[#]</div>
<div class="stat-value" id="stat-hashrate">--</div>
<div class="stat-label">Network Hashrate</div>
</div>
<div class="stat-card">
<div class="stat-icon">[D]</div>
<div class="stat-value" id="stat-difficulty">--</div>
<div class="stat-label">Difficulty</div>
</div>
<div class="stat-card">
<div class="stat-icon">[S]</div>
<div class="stat-value" id="stat-supply">--</div>
<div class="stat-label">Total Supply</div>
</div>
</div>
<!-- Recent Blocks Section -->
<div class="section-card">
<div class="section-header">
<div class="section-header-left">
<span class="section-icon">[B]</span>
<span class="section-title">Recent Blocks</span>
</div>
<div class="section-header-right">
<span class="section-meta" id="last-update">--</span>
<span class="badge badge-live">* LIVE</span>
</div>
</div>
<div class="section-content">
<div class="data-table">
<div class="table-header table-header-blocks">
<span>Height</span>
<span>Hash</span>
<span>Age</span>
<span>TXs</span>
<span>Reward</span>
</div>
<div id="blocks-list">
<div class="loading-state">
<div class="loading-spinner"></div>
<span>Loading blocks...</span>
</div>
</div>
</div>
</div>
</div>
<!-- Mempool Section -->
<div class="section-card">
<div class="section-header">
<div class="section-header-left">
<span class="section-icon">[T]</span>
<span class="section-title">Mempool Transactions</span>
</div>
<div class="section-header-right">
<span class="badge badge-pending" id="pool-badge">0 PENDING</span>
</div>
</div>
<div class="section-content">
<div id="mempool-list">
<div class="empty-state">
<div class="empty-icon">*</div>
<p>Mempool is empty - all transactions confirmed</p>
</div>
</div>
</div>
</div>
</div>
<!-- Other Views (dynamically rendered) -->
<div id="view-blocks" class="hidden"></div>
<div id="view-pool" class="hidden"></div>
<div id="view-contracts" class="hidden"></div>
<div id="view-tools" class="hidden">
<!-- Tools view -->
<div class="section-card">
<div class="section-header">
<div class="section-header-left">
<span class="section-icon">[P]</span>
<span class="section-title">Proof Validator</span>
</div>
<div class="section-header-right">
<span class="badge" id="proof-mode-badge">CHECKING...</span>
</div>
</div>
<div class="section-content" id="proof-validator-content">
<div class="loading-state">
<div class="loading-spinner"></div>
<span>Checking capabilities...</span>
</div>
</div>
</div>
<!-- Additional Tools -->
<div class="section-card">
<div class="section-header">
<div class="section-header-left">
<span class="section-icon">?</span>
<span class="section-title">About This Explorer</span>
</div>
</div>
<div class="section-content">
<div class="detail-grid">
<div class="detail-column">
<h4 class="detail-subtitle">Features</h4>
<ul class="sc-info-list">
<li>Browse blocks with pagination</li>
<li>View transaction details</li>
<li>Explore smart contracts</li>
<li>Monitor mempool</li>
<li>View ring members</li>
<li>Validate payment proofs (HOLOGRAM)</li>
</ul>
</div>
<div class="detail-column">
<h4 class="detail-subtitle">Connection Modes</h4>
<ul class="sc-info-list">
<li><strong>telaHost:</strong> Full features in HOLOGRAM</li>
<li><strong>XSWD:</strong> Standard features via WebSocket</li>
</ul>
<div style="margin-top: var(--s-4);">
<span class="badge badge-live" id="mode-indicator">Detecting...</span>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- Footer -->
<footer class="footer">
<div class="footer-left">
<span>DERO Explorer TELA v2.0</span>
<span>|</span>
<span id="connection-mode">Initializing...</span>
</div>
<div class="footer-right">
<a href="#tools" class="footer-link">Tools</a>
<span>|</span>
<a href="https://dero.io" class="footer-link" target="_blank">DERO.io</a>
</div>
</footer>
</div>
<!-- Core Modules (Split for TELA compliance) -->
<script src="core.js"></script>
<script src="ui.js"></script>
<!-- Additional initialization for tools view -->
<script>
// Tools view initialization
window.addEventListener('explorer:viewChange', function(e) {
if (e.detail.view === 'tools') {
initToolsView();
}
});
window.addEventListener('explorer:connected', function() {
// Update mode indicator
const modeEl = document.getElementById('mode-indicator');
const connectivity = DeroExplorer.modules.get('connectivity');
if (connectivity && modeEl) {
const status = connectivity.getStatus();
modeEl.textContent = status.mode === 'telaHost' ? 'HOLOGRAM Mode' : 'XSWD Mode';
modeEl.className = 'badge ' + (status.enhanced ? 'badge-ok' : 'badge-pending');
}
// Initialize tools if already on that view
if (DeroExplorer.state.currentView === 'tools') {
initToolsView();
}
});
function initToolsView() {
const connectivity = DeroExplorer.modules.get('connectivity');
if (!connectivity) return;
const hasEnhanced = connectivity.hasEnhancedFeatures();
const badge = document.getElementById('proof-mode-badge');
const content = document.getElementById('proof-validator-content');
if (hasEnhanced) {
badge.textContent = 'FULL MODE';
badge.className = 'badge badge-ok';
content.innerHTML = `
<p class="text-muted" style="margin-bottom: var(--s-4);">
Validate DERO payment proofs to verify transactions were sent to you.
</p>
<div style="margin-bottom: var(--s-4);">
<label class="detail-label" style="display: block; margin-bottom: var(--s-2);">
Transaction ID
</label>
<input type="text" id="proof-txid" class="search-input"
style="width: 100%; padding: var(--s-3); background: var(--void-deep); border: 1px solid var(--border-default); border-radius: var(--r-md);"
placeholder="Enter TXID...">
</div>
<div style="margin-bottom: var(--s-4);">
<label class="detail-label" style="display: block; margin-bottom: var(--s-2);">
Proof String
</label>
<textarea id="proof-string" rows="4" class="proof-textarea"
placeholder="Paste deroproof1q... here"></textarea>
</div>
<button class="btn btn-primary" onclick="validateProofFromTools()">
Validate Proof
</button>
<div id="proof-result" style="margin-top: var(--s-4);"></div>
`;
} else {
badge.textContent = 'LIMITED';
badge.className = 'badge badge-pending';
content.innerHTML = `
<div style="text-align: center; padding: var(--s-6);">
<div style="font-size: 32px; color: var(--text-4); margin-bottom: var(--s-4);">!</div>
<p style="color: var(--text-2); margin-bottom: var(--s-3);">
Proof validation requires backend support
</p>
<p class="text-muted text-sm">
The cryptographic proof verification uses Go native code that requires a compatible backend.
This is available when running the explorer in HOLOGRAM or with a local explorer that supports proof validation.
</p>
</div>
`;
}
}
async function validateProofFromTools() {
const txid = document.getElementById('proof-txid').value.trim();
const proof = document.getElementById('proof-string').value.trim();
const resultDiv = document.getElementById('proof-result');
if (!txid || !proof) {
resultDiv.innerHTML = `
<div class="proof-error">Please enter both TXID and proof string</div>
`;
return;
}
resultDiv.innerHTML = `
<div class="proof-loading">
<div class="loading-spinner" style="width: 16px; height: 16px;"></div>
Validating...
</div>
`;
try {
const connectivity = DeroExplorer.modules.get('connectivity');
const result = await connectivity.validateProof(proof, txid);
if (result.valid) {
resultDiv.innerHTML = `
<div class="proof-valid">
<div class="proof-header">[OK] Proof Valid</div>
<div class="proof-details">
${DeroExplorer.ui.detailRow('Recipient', DeroExplorer.utils.truncateHash(result.address, 16, 12), { mono: true })}
${DeroExplorer.ui.detailRow('Amount', DeroExplorer.utils.formatDERO(result.amount) + ' DERO')}
${result.payload ? DeroExplorer.ui.detailRow('Payload', result.payload) : ''}
</div>
</div>
`;
} else {
resultDiv.innerHTML = `
<div class="proof-invalid">
<div class="proof-header">[X] Proof Invalid</div>
<p>${result.error || 'The proof could not be validated.'}</p>
</div>
`;
}
} catch (error) {
resultDiv.innerHTML = `
<div class="proof-error">Error: ${DeroExplorer.utils.escapeHtml(error.message)}</div>
`;
}
}
</script>
</body>
</html>
*/ |
| 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("var_header_name", "index.html")
31 STORE("var_header_description", "")
32 STORE("var_header_icon", "")
33 STORE("dURL", "")
34 STORE("docType", "TELA-HTML-1")
35 STORE("subDir", "/")
36 STORE("fileCheckC", "0277b637ebefd68d20e4a7cf6dda2d3dfed15b8790b5f984bef767b5442c547f")
37 STORE("fileCheckS", "1c899c3bdd36a49a722dcc1f3efc2c8d5f70fc9a6299192593254e323393c2f0")
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
/*
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DERO Explorer // TELA Edition v2.0</title>
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<!-- HOLOGRAM Design System Styles (Split for TELA compliance) -->
<link rel="stylesheet" href="styles-base.css">
<link rel="stylesheet" href="styles-components.css">
<link rel="stylesheet" href="styles-features.css">
</head>
<body>
<div class="app-container">
<!-- Top Bar -->
<header class="top-bar">
<div class="logo-area">
<img src="logo.svg" alt="DERO" class="logo-icon">
<div>
<div class="logo-text">DERO EXPLORER</div>
<div class="logo-version">TELA Edition v2.0</div>
</div>
</div>
<div class="status-area">
<div class="status-indicator" id="node-status">
<span class="status-dot connecting" id="node-dot"></span>
<span class="status-label" id="node-label">Connecting...</span>
</div>
<div class="status-indicator" id="wallet-status">
<span class="status-dot disconnected" id="wallet-dot"></span>
<span class="status-label" id="wallet-label">No Wallet</span>
</div>
</div>
</header>
<!-- Navigation Row -->
<nav class="nav-row">
<button class="nav-btn active" data-view="dashboard" onclick="navigate('dashboard')">
<span class="nav-icon">[D]</span>
<span>Dashboard</span>
</button>
<button class="nav-btn" data-view="blocks" onclick="navigate('blocks')">
<span class="nav-icon">[B]</span>
<span>Blocks</span>
</button>
<button class="nav-btn" data-view="pool" onclick="navigate('pool')">
<span class="nav-icon">[T]</span>
<span>Pool</span>
</button>
<button class="nav-btn" data-view="contracts" onclick="navigate('contracts')">
<span class="nav-icon">[SC]</span>
<span>Contracts</span>
</button>
<button class="nav-btn" data-view="tools" onclick="navigate('tools')">
<span class="nav-icon">[*]</span>
<span>Tools</span>
</button>
<div class="nav-spacer"></div>
<!-- Search -->
<div class="search-container">
<span class="search-icon">></span>
<input
type="text"
class="search-input"
id="search-input"
placeholder="Search block, tx, SCID..."
onkeydown="handleSearch(event)"
>
<span class="search-hint">Enter</span>
</div>
</nav>
<!-- Main Content Area -->
<main class="main-content" id="main-content">
<!-- Dashboard View (Default) -->
<div id="view-dashboard">
<!-- Stats Grid -->
<div class="dashboard-grid" id="stats-grid">
<div class="stat-card">
<div class="stat-icon">[H]</div>
<div class="stat-value" id="stat-height">--</div>
<div class="stat-label">Block Height</div>
</div>
<div class="stat-card">
<div class="stat-icon">[#]</div>
<div class="stat-value" id="stat-hashrate">--</div>
<div class="stat-label">Network Hashrate</div>
</div>
<div class="stat-card">
<div class="stat-icon">[D]</div>
<div class="stat-value" id="stat-difficulty">--</div>
<div class="stat-label">Difficulty</div>
</div>
<div class="stat-card">
<div class="stat-icon">[S]</div>
<div class="stat-value" id="stat-supply">--</div>
<div class="stat-label">Total Supply</div>
</div>
</div>
<!-- Recent Blocks Section -->
<div class="section-card">
<div class="section-header">
<div class="section-header-left">
<span class="section-icon">[B]</span>
<span class="section-title">Recent Blocks</span>
</div>
<div class="section-header-right">
<span class="section-meta" id="last-update">--</span>
<span class="badge badge-live">* LIVE</span>
</div>
</div>
<div class="section-content">
<div class="data-table">
<div class="table-header table-header-blocks">
<span>Height</span>
<span>Hash</span>
<span>Age</span>
<span>TXs</span>
<span>Reward</span>
</div>
<div id="blocks-list">
<div class="loading-state">
<div class="loading-spinner"></div>
<span>Loading blocks...</span>
</div>
</div>
</div>
</div>
</div>
<!-- Mempool Section -->
<div class="section-card">
<div class="section-header">
<div class="section-header-left">
<span class="section-icon">[T]</span>
<span class="section-title">Mempool Transactions</span>
</div>
<div class="section-header-right">
<span class="badge badge-pending" id="pool-badge">0 PENDING</span>
</div>
</div>
<div class="section-content">
<div id="mempool-list">
<div class="empty-state">
<div class="empty-icon">*</div>
<p>Mempool is empty - all transactions confirmed</p>
</div>
</div>
</div>
</div>
</div>
<!-- Other Views (dynamically rendered) -->
<div id="view-blocks" class="hidden"></div>
<div id="view-pool" class="hidden"></div>
<div id="view-contracts" class="hidden"></div>
<div id="view-tools" class="hidden">
<!-- Tools view -->
<div class="section-card">
<div class="section-header">
<div class="section-header-left">
<span class="section-icon">[P]</span>
<span class="section-title">Proof Validator</span>
</div>
<div class="section-header-right">
<span class="badge" id="proof-mode-badge">CHECKING...</span>
</div>
</div>
<div class="section-content" id="proof-validator-content">
<div class="loading-state">
<div class="loading-spinner"></div>
<span>Checking capabilities...</span>
</div>
</div>
</div>
<!-- Additional Tools -->
<div class="section-card">
<div class="section-header">
<div class="section-header-left">
<span class="section-icon">?</span>
<span class="section-title">About This Explorer</span>
</div>
</div>
<div class="section-content">
<div class="detail-grid">
<div class="detail-column">
<h4 class="detail-subtitle">Features</h4>
<ul class="sc-info-list">
<li>Browse blocks with pagination</li>
<li>View transaction details</li>
<li>Explore smart contracts</li>
<li>Monitor mempool</li>
<li>View ring members</li>
<li>Validate payment proofs (HOLOGRAM)</li>
</ul>
</div>
<div class="detail-column">
<h4 class="detail-subtitle">Connection Modes</h4>
<ul class="sc-info-list">
<li><strong>telaHost:</strong> Full features in HOLOGRAM</li>
<li><strong>XSWD:</strong> Standard features via WebSocket</li>
</ul>
<div style="margin-top: var(--s-4);">
<span class="badge badge-live" id="mode-indicator">Detecting...</span>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- Footer -->
<footer class="footer">
<div class="footer-left">
<span>DERO Explorer TELA v2.0</span>
<span>|</span>
<span id="connection-mode">Initializing...</span>
</div>
<div class="footer-right">
<a href="#tools" class="footer-link">Tools</a>
<span>|</span>
<a href="https://dero.io" class="footer-link" target="_blank">DERO.io</a>
</div>
</footer>
</div>
<!-- Core Modules (Split for TELA compliance) -->
<script src="core.js"></script>
<script src="ui.js"></script>
<!-- Additional initialization for tools view -->
<script>
// Tools view initialization
window.addEventListener('explorer:viewChange', function(e) {
if (e.detail.view === 'tools') {
initToolsView();
}
});
window.addEventListener('explorer:connected', function() {
// Update mode indicator
const modeEl = document.getElementById('mode-indicator');
const connectivity = DeroExplorer.modules.get('connectivity');
if (connectivity && modeEl) {
const status = connectivity.getStatus();
modeEl.textContent = status.mode === 'telaHost' ? 'HOLOGRAM Mode' : 'XSWD Mode';
modeEl.className = 'badge ' + (status.enhanced ? 'badge-ok' : 'badge-pending');
}
// Initialize tools if already on that view
if (DeroExplorer.state.currentView === 'tools') {
initToolsView();
}
});
function initToolsView() {
const connectivity = DeroExplorer.modules.get('connectivity');
if (!connectivity) return;
const hasEnhanced = connectivity.hasEnhancedFeatures();
const badge = document.getElementById('proof-mode-badge');
const content = document.getElementById('proof-validator-content');
if (hasEnhanced) {
badge.textContent = 'FULL MODE';
badge.className = 'badge badge-ok';
content.innerHTML = `
<p class="text-muted" style="margin-bottom: var(--s-4);">
Validate DERO payment proofs to verify transactions were sent to you.
</p>
<div style="margin-bottom: var(--s-4);">
<label class="detail-label" style="display: block; margin-bottom: var(--s-2);">
Transaction ID
</label>
<input type="text" id="proof-txid" class="search-input"
style="width: 100%; padding: var(--s-3); background: var(--void-deep); border: 1px solid var(--border-default); border-radius: var(--r-md);"
placeholder="Enter TXID...">
</div>
<div style="margin-bottom: var(--s-4);">
<label class="detail-label" style="display: block; margin-bottom: var(--s-2);">
Proof String
</label>
<textarea id="proof-string" rows="4" class="proof-textarea"
placeholder="Paste deroproof1q... here"></textarea>
</div>
<button class="btn btn-primary" onclick="validateProofFromTools()">
Validate Proof
</button>
<div id="proof-result" style="margin-top: var(--s-4);"></div>
`;
} else {
badge.textContent = 'LIMITED';
badge.className = 'badge badge-pending';
content.innerHTML = `
<div style="text-align: center; padding: var(--s-6);">
<div style="font-size: 32px; color: var(--text-4); margin-bottom: var(--s-4);">!</div>
<p style="color: var(--text-2); margin-bottom: var(--s-3);">
Proof validation requires backend support
</p>
<p class="text-muted text-sm">
The cryptographic proof verification uses Go native code that requires a compatible backend.
This is available when running the explorer in HOLOGRAM or with a local explorer that supports proof validation.
</p>
</div>
`;
}
}
async function validateProofFromTools() {
const txid = document.getElementById('proof-txid').value.trim();
const proof = document.getElementById('proof-string').value.trim();
const resultDiv = document.getElementById('proof-result');
if (!txid || !proof) {
resultDiv.innerHTML = `
<div class="proof-error">Please enter both TXID and proof string</div>
`;
return;
}
resultDiv.innerHTML = `
<div class="proof-loading">
<div class="loading-spinner" style="width: 16px; height: 16px;"></div>
Validating...
</div>
`;
try {
const connectivity = DeroExplorer.modules.get('connectivity');
const result = await connectivity.validateProof(proof, txid);
if (result.valid) {
resultDiv.innerHTML = `
<div class="proof-valid">
<div class="proof-header">[OK] Proof Valid</div>
<div class="proof-details">
${DeroExplorer.ui.detailRow('Recipient', DeroExplorer.utils.truncateHash(result.address, 16, 12), { mono: true })}
${DeroExplorer.ui.detailRow('Amount', DeroExplorer.utils.formatDERO(result.amount) + ' DERO')}
${result.payload ? DeroExplorer.ui.detailRow('Payload', result.payload) : ''}
</div>
</div>
`;
} else {
resultDiv.innerHTML = `
<div class="proof-invalid">
<div class="proof-header">[X] Proof Invalid</div>
<p>${result.error || 'The proof could not be validated.'}</p>
</div>
`;
}
} catch (error) {
resultDiv.innerHTML = `
<div class="proof-error">Error: ${DeroExplorer.utils.escapeHtml(error.message)}</div>
`;
}
}
</script>
</body>
</html>
*/'] |