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
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..d0e18e2a6 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)],
@@ -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 ? `
| Shard | State | Prover | pgas | Proof lag, DAA | Carried by | Payout | Node verdict |
${sh.map(s => `| ${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'} |
`).join('')}
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 ? `
| Shard | State | Prover | pgas | Proof lag, DAA | Carried by | Payout | Node verdict |
${sh.map(s => `| ${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'} |
`).join('')}
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 2f4973f53..962877e34 100644
--- a/site/explorer.html
+++ b/site/explorer.html
@@ -259,9 +259,10 @@ 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.
+
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.
@@ -450,6 +451,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..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
-
Fees and proving
the receipt's Igneum section
Read from the observer node, the chain the finality certificates follow. Both base fees burn in full. The priority fee splits 80/20 between the including miner and the proving pool. Proving gas (pgas) is what the shard that proves this transaction costs; the proving base fee prices it.
+
Fees and proving
the receipt's Igneum section
Read from node1-dn3 on the build box since 12:25 UTC on 8 October 2026, the chain the finality certificates follow. Both base fees burn in full. The priority fee splits 80/20 between the including miner and the proving pool. Proving gas (pgas) is what the shard that proves this transaction costs; the proving base fee prices it.
@@ -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)}`],