FOLLOW THE CANONICAL CHAIN
Block explorer{snapshot?.blocks.length ?? 0}
Native NFT mints, RandomX proofs, and mined ownership transfers.
View full chain JSON
Sovereign testnet with independently validating peers and cumulative-work chain selection. This network is unbootstrapped, not a public mainnet. Zero peers means an isolated node, not a connected network. Canonical ownership can change during a reorganization.
- Cumulative work
- {snapshot?.cumulativeWork ?? '—'}
- Peer count
- {rpcAvailable ? snapshot?.peers ?? '—' : 'Unknown'} · {peerLabel}
- Chain ID · pinned genesis
- {snapshot?.chainId ?? '—'}
- Network
- {NETWORK}
- Tip block ID
- {snapshot?.tip ?? '—'}
- Mint maturity
- {snapshot?.maturity ?? CONSENSUS.coinbaseMaturity} subsequent blocks at inclusion height
- {snapshot?.blocks.length ? | Block / confirmations | Discovery | Block ID / NFT token ID | Confirmed owner | RandomX proof / rarity |
{[...snapshot.blocks].reverse().map(b => | {snapshot.blocks.length - b.height + 1} confirmations | {b.article.title}Wikipedia #{b.article.pageId} | Block {short(b.hash)}NFT {short(b.tokenId)} | {short(testnetOwnerOf(snapshot, b.tokenId) ?? '')} | {short(b.powHash)}{rarity(b.powHash)} |
)}
: A new chain. A blank page.
No canonical NFT blocks loaded. Native mining is an explicit, separate step.
}
+ {snapshot?.blocks.length ? | Block / confirmations | Discovery | Block ID / NFT token ID | Confirmed owner | RandomX proof / rarity |
{[...snapshot.blocks].reverse().map(b => | {snapshot.blocks.length - b.height + 1} confirmations | {b.article.title}Wikipedia #{b.article.pageId} | Block {short(b.hash)}NFT {short(b.tokenId)} | {short(testnetOwnerOf(snapshot, b.tokenId) ?? '')} | {short(b.powHash)}{rarity(b.powHash)} |
)}
: 
A new chain. A blank page.
No canonical NFT blocks loaded. Native mining is an explicit, separate step.
}
Mined ownership transfers
{snapshot?.transfers.length ? {snapshot.transfers.map((t, i) =>
{short(t.cardHash)}{short(t.from)} → {short(t.to)}Sequence {t.sequence} · mined #{snapshot.blocks.find(b => b.transactions.some(tx => tx.signature === t.signature))?.height ?? '—'} )}
: No mined transfers. Ownership changes only when a transfer is included in a canonical block.
}
Pending transfers {snapshot?.pendingTransfers.length ?? 0}
Mempool only · not confirmed ownership. Pending transactions may be dropped or invalidated by a reorganization.
{snapshot?.pendingTransfers.map(t =>
{short(t.cardHash)}{short(t.from)} → {short(t.to)}Awaiting mining
)}
}
diff --git a/src/Card.tsx b/src/Card.tsx
index 930f56a..4a9a24c 100644
--- a/src/Card.tsx
+++ b/src/Card.tsx
@@ -1,4 +1,4 @@
-import { ArrowUpRight, BookOpen, Globe2, Shield, Sparkles, Swords } from 'lucide-react';
+import { ArrowUpRight, BookOpen, Shield, Sparkles, Swords } from 'lucide-react';
import { rarity, stats, type Article } from '../shared/protocol.ts';
import type { TestnetBlock } from '../shared/testnet.ts';
import { STARTER_ARTICLES } from '../shared/catalog.ts';
@@ -25,7 +25,7 @@ export function Card({ card, onClick }: { card: CardData; onClick?: () => void }
return <>