From 529578ac9839feefb95d66cad7d10bbd9732759a Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Thu, 8 Oct 2026 12:27:47 +0000 Subject: [PATCH 1/2] Explorer: the chain id is read from the node, never fixed in the page (4463 below the class v5 floor, 4464 from DAA 68,400, crossed 8 October 2026 about 12:2x UTC) Co-Authored-By: Claude Fable 5.1 --- site/address.html | 3 ++- site/block.html | 2 +- site/explorer.html | 5 +++-- site/tx.html | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/site/address.html b/site/address.html index e8f20d5de..1747bdf94 100644 --- a/site/address.html +++ b/site/address.html @@ -274,7 +274,7 @@ main{padding-bottom:100px}.card{background:var(--row);border:1px solid var(--lin
Blocks, 24 h
0
Earned, 24 h
0IGN
80% of each blue block's subsidy
Last block
n/a
-
Network
Devnet 3
chain id 4463, coins have no value
+
Network
Devnet 3
coins have no value

Identity

A miner names its EVM payout address in every coinbase (the IGNA tag) beside the coinbase script's own address, so the two forms name the same miner. The vote keys are the finality identities that signed these blocks; a card runs several.

Transactions

newest 50 of the last 7 days
@@ -380,6 +380,7 @@ async function load() { if (!j.ok) { $('msg').textContent = j.error || 'Not found.'; return; } document.title = `Devnet 3 address ${shortHash(a, 8, 6)}`; now = new Date(j.now).getTime(); me = j.evm_address; const ac = j.account; + if (j.chain_id) $('a-chain').textContent = `chain id ${j.chain_id} as the node reports it, coins have no value`; $('chips').innerHTML = `${j.kind === 'evm' ? (ac && ac.is_contract ? 'contract' : 'EVM account') : 'coinbase address'}` + (j.blocks_10m ? 'mining now' : '') + (ac && ac.miner ? 'miner payout address' : ''); if (j.balance.available) { $('a-balance').innerHTML = esc(ignFromWei(j.balance.wei, 4)) + 'IGN'; $('a-balance-s').textContent = j.balance.source === 'indexer' ? `read by the indexer ${j.balance.refreshed_at ? rel(now - new Date(j.balance.refreshed_at).getTime()) : ''}` : `${j.balance.source}, live`; } else { $('a-balance').textContent = 'n/a'; $('a-balance-s').textContent = j.balance.reason; } diff --git a/site/block.html b/site/block.html index 941b7bde6..04191560a 100644 --- a/site/block.html +++ b/site/block.html @@ -386,7 +386,7 @@ async function load() { if (j.txs.length) chips.push(`${j.txs.length} transaction${j.txs.length === 1 ? '' : 's'} executed`); $('chips').innerHTML = chips.join(''); $('summary').innerHTML = dl([ - ['Network', 'Devnet 3, chain id ' + esc(j.chain_id ?? 4463)], + ['Network', 'Devnet 3' + (j.chain_id ? ', chain id ' + esc(j.chain_id) + ' as the node reports it' : '')], ['Number', b.number === null ? 'none, not a chain block' : (b.chain_now === false ? `${int(b.number)} as the observer first saw it; a tip reorg gave this number to another block, so the EVM executed that one` : int(b.number))], ['Time', `${utc(b.ts)} (${rel(now - b.ts)})`], ['DAA score', int(b.daa)], ['Blue score', int(b.blue_score)], diff --git a/site/explorer.html b/site/explorer.html index 2f4973f53..a5f37e914 100644 --- a/site/explorer.html +++ b/site/explorer.html @@ -259,7 +259,7 @@ main{padding-bottom:100px}.card{background:var(--row);border:1px solid var(--lin
-
Devnet 3, chain id 4463
+
Devnet 3

Devnet 3 explorer.

Every block Devnet 3 made in the last day and every transaction of the last seven days, read from a node by the observer and the indexer. Paste a block hash, a transaction hash, a chain block number or an address, or click any row. Devnet 3 is a test network: its coins have no value and the chain may reset. Every number here comes from one node, the observer node on the build box, the chain the finality certificates follow; the indexer reads that node's execution RPC and nothing else.

@@ -450,6 +450,7 @@ async function loadStats() { $('st-status').textContent = s.stale ? 'OFFLINE' : 'LIVE'; $('st-age').textContent = s.stale ? 'observer stale' : `${s.network || 'Devnet 3'}, node ${s.node_version || '?'}, read ${stamp(s.now)}`; $('st-height').textContent = s.height === null ? 'n/a' : int(s.height); + $('st-chain').textContent = s.chain_id ? `, chain id ${s.chain_id}` : ''; $('st-count').textContent = `chain block number, ${int(s.block_count)} blocks in the DAG`; $('st-daa').textContent = int(s.daa); $('st-blue').textContent = 'blue score ' + int(s.blue_score); $('st-hps').textContent = hashrate(s.hashrate); $('st-diff').textContent = 'difficulty ' + (s.difficulty === null ? 'n/a' : (s.difficulty >= 1e6 ? (s.difficulty / 1e6).toFixed(2) + ' M' : int(s.difficulty))); diff --git a/site/tx.html b/site/tx.html index 3baf1f261..4676ac275 100644 --- a/site/tx.html +++ b/site/tx.html @@ -366,7 +366,7 @@ async function load() { $('chips').innerHTML = chips.join(''); const fee = t.gas_used !== null && t.effective_gas_price !== null ? (BigInt(t.gas_used) * BigInt(t.effective_gas_price)).toString() : null; $('summary').innerHTML = dl([ - ['Network', 'Devnet 3, chain id ' + esc(j.chain_id ?? 4463)], + ['Network', 'Devnet 3' + (j.chain_id ? ', chain id ' + esc(j.chain_id) + ' as the node reports it' : '')], ['Hash', `${esc(t.hash)}`], ['Status', t.status || 'no receipt'], ['Block', `${esc(shortHash(t.block_hash, 12, 8))} chain block ${int(t.number)}, index ${int(t.index)}`], From 18bef74739e2ab4f097835c88cd6747e02a13c20 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Thu, 8 Oct 2026 12:28:16 +0000 Subject: [PATCH 2/2] Explorer: names node1-dn3 as its source since 12:25 UTC (the observer node drifted at DAA 67,787 and re-executes from genesis) and carries the notice until the 0.3.25 move Co-Authored-By: Claude Fable 5.1 --- site/block.html | 2 +- site/explorer.html | 3 ++- site/tx.html | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/site/block.html b/site/block.html index 04191560a..d0e18e2a6 100644 --- a/site/block.html +++ b/site/block.html @@ -422,7 +422,7 @@ async function load() { const sh = j.shards; $('proof-eyebrow').textContent = b.chain ? `${sh.length} shard${sh.length === 1 ? '' : 's'} planned for this chain block` : 'not a chain block'; $('proofs').innerHTML = `

This block carries ${b.proof_records ?? 0} proof record${b.proof_records === 1 ? '' : 's'} for earlier chain blocks (274 bytes each, in the coinbase extra data).${b.chain ? ` Its own execution is split into ${sum.total} shard${sum.total === 1 ? '' : 's'}: ${sum.paid} paid, ${sum.verified} verified, ${sum.proving} proving, ${sum.planned} planned.` : ''}

` + - (sh.length ? `
${sh.map(s => ``).join('')}
ShardStateProverpgasProof lag, DAACarried byPayoutNode verdict
${s.i} of ${s.n}${esc(s.state)}${esc(s.prover || '')}${int(s.pgas)}${s.lag === null ? '' : int(s.lag)}${s.carried_by ? link(s.carried_by) : ''}${s.payout_wei ? ignFromWei(s.payout_wei, 6) + ' IGN' : ''}${s.node_verified === true ? 'proof verified by the node' : s.node_verified === false ? 'not verified' : 'no record yet'}

State follows the record: planned when the node published the shard plan, proving when a prover's record is in the pool, verified when the node's SP1 verifier accepted the proof, paid when a later coinbase carried and paid it. The explorer does not re-run the STARK itself; the node's verdict is shown as the node's. Every state, number and record on this page is read from the observer node, the chain the finality certificates follow.

` : (b.chain ? '
No shard plan recorded (the proving feed has not read this block).
' : '')); + (sh.length ? `
${sh.map(s => ``).join('')}
ShardStateProverpgasProof lag, DAACarried byPayoutNode verdict
${s.i} of ${s.n}${esc(s.state)}${esc(s.prover || '')}${int(s.pgas)}${s.lag === null ? '' : int(s.lag)}${s.carried_by ? link(s.carried_by) : ''}${s.payout_wei ? ignFromWei(s.payout_wei, 6) + ' IGN' : ''}${s.node_verified === true ? 'proof verified by the node' : s.node_verified === false ? 'not verified' : 'no record yet'}

State follows the record: planned when the node published the shard plan, proving when a prover's record is in the pool, verified when the node's SP1 verifier accepted the proof, paid when a later coinbase carried and paid it. The explorer does not re-run the STARK itself; the node's verdict is shown as the node's. Every state, number and record on this page is read from node1-dn3 on the build box (since 12:25 UTC on 8 October 2026), the chain the finality certificates follow.

` : (b.chain ? '
No shard plan recorded (the proving feed has not read this block).
' : '')); const cp = j.checkpoint, certs = j.certificates || []; $('fin-eyebrow').textContent = cp ? `checkpoint ${cp.index}` : (certs.length ? 'carries a certificate' : 'not a checkpoint'); $('finality').innerHTML = (cp ? `
${dl([['State', `${esc(cp.state)}`], ['Signed weight', `${int(cp.signed)} of ${int(cp.total)} (${(cp.fraction_total * 100).toFixed(1)}% of all weight, ${(cp.fraction_active * 100).toFixed(1)}% of active)`], ['Votes', `${int(cp.votes)} of ${int(cp.voters)} voters`], cp.locked_at ? ['Locked', utc(new Date(cp.locked_at).getTime())] : null])}
` : '') + diff --git a/site/explorer.html b/site/explorer.html index a5f37e914..962877e34 100644 --- a/site/explorer.html +++ b/site/explorer.html @@ -261,7 +261,8 @@ main{padding-bottom:100px}.card{background:var(--row);border:1px solid var(--lin
Devnet 3

Devnet 3 explorer.

-

Every block Devnet 3 made in the last day and every transaction of the last seven days, read from a node by the observer and the indexer. Paste a block hash, a transaction hash, a chain block number or an address, or click any row. Devnet 3 is a test network: its coins have no value and the chain may reset. Every number here comes from one node, the observer node on the build box, the chain the finality certificates follow; the indexer reads that node's execution RPC and nothing else.

+

Every block Devnet 3 made in the last day and every transaction of the last seven days, read from a node by the observer and the indexer. Paste a block hash, a transaction hash, a chain block number or an address, or click any row. Devnet 3 is a test network: its coins have no value and the chain may reset. Every number here comes from one node on the build box, the chain the finality certificates follow; the indexer reads that node's execution RPC and nothing else.

+

Source since 12:25 UTC on 8 October 2026: node1-dn3 (the build box's first node). The observer node that served before it drifted from the chain at DAA 67,787 during a re-walk and re-executes from genesis; every balance, receipt and account was re-read from node1-dn3 at 12:27 UTC. Until the 0.3.25 move restarts the observer node on the pinned binary, a block list read before 12:27 UTC may differ by a few blocks from this one.

diff --git a/site/tx.html b/site/tx.html index 4676ac275..0a5ad817a 100644 --- a/site/tx.html +++ b/site/tx.html @@ -268,7 +268,7 @@ main{padding-bottom:100px}.card{background:var(--row);border:1px solid var(--lin