(function () { const $ = (sel) => document.querySelector(sel); function shorten(addr) { if (!addr) return '—'; return addr.length > 14 ? addr.slice(0, 8) + '…' + addr.slice(-6) : addr; } function fmtUptime(seconds) { if (!seconds && seconds !== 0) return '—'; const h = Math.floor(seconds / 3600); const m = Math.floor((seconds % 3600) / 60); const s = Math.floor(seconds % 60); if (h > 0) return `${h}h ${m}m`; if (m > 0) return `${m}m ${s}s`; return `${s}s`; } function renderPhases(phases) { const root = $('#phases'); root.innerHTML = ''; phases.forEach((p) => { const row = document.createElement('div'); row.className = 'phase'; row.innerHTML = `
${String(p.id).padStart(2,'0')}
${p.name}PHASE-${p.id}
${p.pct}%
`; root.appendChild(row); }); } function renderTests(tests) { $('#testsPassed').textContent = tests.passed; $('#testsTotal').textContent = tests.total; const root = $('#tests'); root.innerHTML = ''; tests.results.forEach((t) => { const row = document.createElement('div'); row.className = 'test'; row.innerHTML = ` ${t.name} ${t.gas.toLocaleString()} gas`; root.appendChild(row); }); } function renderArchitecture(architecture) { if (!architecture) return; const layerRoot = $('#archLayers'); layerRoot.innerHTML = ''; architecture.layers.forEach((layer) => { const div = document.createElement('div'); div.className = 'arch-layer'; const statusClass = layer.status === 'proven' ? 'ok' : layer.status === 'deployed-pending' ? 'warn' : 'muted'; const theoremHtml = layer.theorems ? `
${layer.theorems.map(t => `${t}`).join('')}
` : ''; div.innerHTML = `
${layer.name} ${layer.status}

${layer.description}

${layer.artifact} ${theoremHtml}`; layerRoot.appendChild(div); }); const verRoot = $('#verificationArtifacts'); verRoot.innerHTML = ''; architecture.verification.forEach((v) => { const div = document.createElement('div'); div.className = 'ver-item'; const statusClass = v.status === 'complete' ? 'ok' : 'muted'; div.innerHTML = `
${v.name} ${v.status}

${v.note}

`; verRoot.appendChild(div); }); } function renderAssets(assets, proverState) { const map = new Map(); if (proverState && Array.isArray(proverState.results)) { for (const r of proverState.results) map.set(r.assetId, r); } const tbody = $('#assets'); tbody.innerHTML = ''; if (!assets.length) { tbody.innerHTML = 'No assets configured.'; return; } assets.forEach((a) => { const r = map.get(a.assetId); const status = r ? r.status : 'unknown'; const tr = document.createElement('tr'); tr.innerHTML = ` ${a.label || '—'}
${shorten(a.assetId)} ${shorten(a.ipfsCid)} ${shorten(a.expectedHash)} ${status}`; tbody.appendChild(tr); }); } function renderSigners(nodes) { const root = $('#signers'); root.innerHTML = ''; if (!nodes.length) { root.innerHTML = '
  • No signer nodes configured.
  • '; return; } nodes.forEach((n) => { const li = document.createElement('li'); li.innerHTML = ` ${n.id} · ${shorten(n.pubkey)} ${n.endpoint}`; root.appendChild(li); }); } function renderProver(state) { const root = $('#proverState'); if (!state) { root.innerHTML = '

    Run node prover/fetcher.js to populate.

    '; return; } root.innerHTML = `
    ${state.summary.fresh}FRESH
    ${state.summary.mismatch}MISMATCH
    ${state.summary.unreachable}UNREACH
    ${JSON.stringify(state, null, 2)}
    `; } async function loadHealth() { try { const res = await fetch('/api/health'); const data = await res.json(); const uptimeEl = $('#uptime'); if (uptimeEl) uptimeEl.textContent = fmtUptime(data.uptime); } catch (_) {} } async function load() { const res = await fetch('/api/status'); const data = await res.json(); $('#network').textContent = data.network || '—'; $('#serverTime').textContent = new Date(data.serverTime).toLocaleTimeString(); $('#cbAddress').textContent = data.circuitBreakerAddress || '— not deployed —'; $('#oracleAddress').textContent = data.oracleAddress || '—'; $('#arAddress').textContent = data.assetRegistryAddress || '— not deployed —'; $('#teeAddress').textContent = data.teeVerifierAddress || '— not deployed —'; $('#enclaveAddress').textContent = data.enclaveAddress || '—'; renderPhases(data.phases); renderTests(data.tests); renderArchitecture(data.architecture); renderAssets(data.assets, data.proverState); renderSigners(data.signerNodes); renderProver(data.proverState); loadHealth(); } load().catch((err) => { document.body.innerHTML += `
    ${err.message}
    `; }); setInterval(load, 15000); })();