Unify explorer DBIS taxonomy and branding
All checks were successful
phoenix-deploy Deployed to explorer-live
Deploy Explorer Live / deploy (push) Successful in 2m18s

This commit is contained in:
defiQUG
2026-04-30 03:06:49 -07:00
parent 3b7e24080f
commit 8cd8bfa195
44 changed files with 1057 additions and 997 deletions

View File

@@ -11,7 +11,7 @@ export default function BrandLockup({ compact = false }: { compact?: boolean })
compact ? 'text-[1.45rem]' : 'text-[1.65rem]',
].join(' ')}
>
SolaceScan
DBIS Explorer
</span>
<span
className={[

View File

@@ -15,18 +15,29 @@ function toneClasses(tone: 'neutral' | 'success' | 'warning' | 'info') {
export function getEntityBadgeTone(tag: string): 'neutral' | 'success' | 'warning' | 'info' {
const normalized = tag.toLowerCase()
if (normalized === 'compliant' || normalized === 'listed' || normalized === 'verified') {
if (normalized === 'compliant' || normalized === 'listed' || normalized === 'verified' || normalized === 'gru') {
return 'success'
}
if (normalized === 'wrapped') {
if (normalized === 'wrapped' || normalized === 'treasury-bond') {
return 'warning'
}
if (normalized === 'bridge' || normalized === 'canonical' || normalized === 'official') {
if (normalized === 'bridge' || normalized === 'canonical' || normalized === 'official' || normalized === 'electronic-money' || normalized === 'commodity') {
return 'info'
}
return 'neutral'
}
export function formatEntityBadgeLabel(label: string): string {
const normalized = label.toLowerCase()
const labels: Record<string, string> = {
'reference-asset': 'reference asset',
'electronic-money': 'cash e-money',
'treasury-bond': 'treasury / gov bond',
gru: 'GRU',
}
return labels[normalized] || label
}
export default function EntityBadge({
label,
tone,
@@ -46,7 +57,7 @@ export default function EntityBadge({
className,
)}
>
{label}
{formatEntityBadgeLabel(label)}
</span>
)
}

View File

@@ -25,7 +25,7 @@ export default function ExplorerAgentTool() {
{
role: 'assistant',
content:
'Explorer AI Agent Tool is ready. I can explain this page, summarize what you are looking at, and help investigate transactions, contracts, routes, and system surfaces.',
'DBIS Explorer AI Assist is ready. I can explain this page, summarize what you are looking at, and help investigate transactions, contracts, routes, and system surfaces.',
},
])
@@ -96,7 +96,7 @@ export default function ExplorerAgentTool() {
<section className="w-[min(24rem,calc(100vw-1.5rem))] overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-2xl dark:border-gray-700 dark:bg-gray-900">
<div className="flex items-start justify-between gap-3 border-b border-gray-200 px-4 py-3 dark:border-gray-700">
<div>
<h2 className="text-sm font-semibold text-gray-900 dark:text-white">Explorer AI Agent Tool</h2>
<h2 className="text-sm font-semibold text-gray-900 dark:text-white">DBIS Explorer AI Assist</h2>
<p className="mt-1 text-xs text-gray-500 dark:text-gray-400">
Page-aware guidance for the explorer. Helpful, read-only, and designed for quick investigation.
</p>
@@ -163,15 +163,16 @@ export default function ExplorerAgentTool() {
<button
type="button"
onClick={() => setOpen((value) => !value)}
className="inline-flex items-center gap-2 rounded-full bg-primary-600 px-4 py-3 text-sm font-semibold text-white shadow-lg transition hover:bg-primary-700"
className="inline-flex items-center gap-2 rounded-full bg-primary-600 p-3 text-sm font-semibold text-white shadow-lg transition hover:bg-primary-700 lg:px-4 lg:py-3"
aria-expanded={open}
aria-label="Open DBIS Explorer AI Assist"
>
<span className="inline-flex h-7 w-7 items-center justify-center rounded-full bg-white/15">
<svg className="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" aria-hidden>
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-4l-4 4v-4Z" />
</svg>
</span>
Agent Tool
<span className="hidden lg:inline">AI Assist</span>
</button>
</div>
)

View File

@@ -12,18 +12,18 @@ export default function Footer() {
<div className="grid gap-4 sm:gap-6 md:grid-cols-[minmax(0,1.5fr)_minmax(0,1fr)_minmax(0,1fr)]">
<div className="space-y-3 rounded-xl border border-gray-200 bg-gray-50/80 p-4 dark:border-gray-800 dark:bg-gray-900/40 md:border-0 md:bg-transparent md:p-0">
<div className="text-base font-semibold text-gray-900 dark:text-white sm:text-lg">
SolaceScan
DBIS Explorer
</div>
<p className="max-w-xl text-sm leading-6 text-gray-600 dark:text-gray-400">
Built on Blockscout for the DBIS / Defi Oracle Chain 138 explorer surface.
Built on Blockscout for the DBIS Chain 138 explorer surface.
Explorer data is powered by Blockscout, Chain 138 RPC, and the companion MetaMask Snap.
</p>
<p className="max-w-xl text-xs leading-5 text-gray-500 dark:text-gray-500">
Public explorer access may appear under <code>blockscout.defi-oracle.io</code> or <code>explorer.d-bis.org</code>.
Both domains belong to the same DBIS / Defi Oracle explorer surface.
Primary public explorer access is served at <code>explorer.d-bis.org</code>.
<code> blockscout.defi-oracle.io</code> is the Blockscout companion domain for the same Chain 138 explorer surface.
</p>
<p className="text-xs text-gray-500 dark:text-gray-500">
© {year} DBIS / Defi Oracle. All rights reserved.
© {year} DBIS. All rights reserved.
</p>
</div>

View File

@@ -12,11 +12,26 @@ const STANDARD_EXPLANATIONS: Record<string, string> = {
'ERC-2612': 'Permit support for signature-based approvals without a separate on-chain approve transaction.',
'ERC-3009': 'Authorization-based transfer model for signed payment flows without prior allowances.',
'ERC-5267': 'Discoverable EIP-712 domain introspection so wallets and relayers can inspect the signing domain cleanly.',
IeMoneyToken: 'Repo-native electronic-money token methodology for issuance and redemption semantics.',
CashElectronicMoneyInterface: 'Repo-native GRU instrument methodology for issuance and redemption semantics.',
DeterministicStorageNamespace: 'Stable namespace for upgrade-aware policy, registry, and audit resolution.',
JurisdictionAndSupervisionMetadata: 'Governance, supervisory, disclosure, and reporting metadata required by the GRU operating model.',
}
const STANDARD_DISPLAY_LABELS: Record<string, string> = {
CashElectronicMoneyInterface: 'Cash electronic-money interface',
DeterministicStorageNamespace: 'Deterministic storage namespace',
JurisdictionAndSupervisionMetadata: 'Jurisdiction and supervision metadata',
}
function formatStandardLabel(id: string): string {
return STANDARD_DISPLAY_LABELS[id] || id
}
function formatProfileLabel(id: string): string {
if (id === 'gru-c-star-v2-public-network-and-payment') return 'GRU C* v2 payment profile'
return id
}
function formatDuration(seconds: number | null): string | null {
if (seconds == null || !Number.isFinite(seconds) || seconds <= 0) return null
const units = [
@@ -56,16 +71,16 @@ export default function GruStandardsCard({
? `Review the live contract ABI and deployment against the GRU v2 base-token matrix before treating this asset as fully canonical.`
: `The live contract exposes the full required GRU v2 base-token surface currently checked by the explorer.`,
profile.wrappedTransport
? 'This looks like a wrapped transport asset, so confirm the corresponding bridge lane and reserve-verifier posture in addition to the token ABI.'
: 'This looks like a canonical GRU asset, so the next meaningful checks are reserve, governance, and transport activation beyond the token interface itself.',
? 'This looks like a cW public-network representation, so confirm the corresponding bridge lane and reserve-verifier posture in addition to the token ABI.'
: 'This looks like a canonical GRU asset, so the next meaningful checks are reserve, governance, and bridge activation beyond the token interface itself.',
profile.x402Ready
? 'This contract appears ready for x402-style payment flows because the explorer can see the required signature and domain surfaces.'
: 'This contract does not currently look x402-ready from the live explorer surface; verify EIP-712, ERC-5267, and permit or authorization flow exposure before using it as a payment rail.',
profile.forwardCanonical === true
? 'This version is marked forward-canonical, so it should be treated as the preferred successor surface even if older liquidity or transport versions still coexist.'
? 'This version is marked forward-canonical, so it should be treated as the preferred successor surface even if older liquidity or bridge versions still coexist.'
: profile.forwardCanonical === false
? 'This version is not forward-canonical, which usually means it is legacy, staged, or transport-only relative to the intended primary canonical surface.'
: 'Forward-canonical posture is not directly detectable on this contract, so rely on the transport overlay and deployment records before making promotion assumptions.',
? 'This version is not forward-canonical, which usually means it is legacy, staged, or bridge-only relative to the intended primary canonical surface.'
: 'Forward-canonical posture is not directly detectable on this contract, so rely on the bridge overlay and deployment records before making promotion assumptions.',
profile.legacyAliasSupport
? 'Legacy alias support is exposed, which is useful during version cutovers and explorer/search reconciliation.'
: 'Legacy alias support is not visible from the current explorer contract surface, so name/version migration may need registry or deployment-record cross-checks.',
@@ -78,9 +93,9 @@ export default function GruStandardsCard({
<DetailRow label="Profile">
<div className="space-y-2">
<div className="flex flex-wrap gap-2">
<EntityBadge label={profile.profileId} tone="info" className="normal-case tracking-normal" />
<EntityBadge label={formatProfileLabel(profile.profileId)} tone="info" className="normal-case tracking-normal" />
<EntityBadge
label={profile.wrappedTransport ? 'wrapped transport' : 'canonical GRU'}
label={profile.wrappedTransport ? 'cW public-network' : 'canonical GRU'}
tone={profile.wrappedTransport ? 'warning' : 'success'}
/>
</div>
@@ -94,14 +109,14 @@ export default function GruStandardsCard({
{profile.standards.map((standard) => (
<EntityBadge
key={standard.id}
label={standard.detected ? `${standard.id} detected` : `${standard.id} missing`}
label={standard.detected ? `${formatStandardLabel(standard.id)} detected` : `${formatStandardLabel(standard.id)} missing`}
tone={standard.detected ? 'success' : 'warning'}
className="normal-case tracking-normal"
/>
))}
</DetailRow>
<DetailRow label="Transport Posture">
<DetailRow label="Bridge Posture">
<div className="space-y-3">
<div className="flex flex-wrap gap-2">
<EntityBadge
@@ -134,8 +149,8 @@ export default function GruStandardsCard({
<div className="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">Settlement posture</div>
<div className="mt-2 text-gray-900 dark:text-white">
{profile.wrappedTransport
? 'This contract presents itself like a wrapped public-transport asset instead of the canonical Chain 138 money surface.'
: 'This contract presents itself like the canonical Chain 138 GRU money surface instead of a wrapped transport mirror.'}
? 'This contract presents itself like a cW public-network representation instead of the canonical Chain 138 GRU surface.'
: 'This contract presents itself like the canonical Chain 138 GRU surface instead of a cW public-network representation.'}
</div>
</div>
<div className="rounded-xl border border-gray-200 bg-gray-50 p-3 text-sm dark:border-gray-700 dark:bg-gray-900/40">
@@ -150,7 +165,7 @@ export default function GruStandardsCard({
<div className="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">Version posture</div>
<div className="mt-2 text-gray-900 dark:text-white">
{profile.activeVersion || profile.forwardVersion
? `Active liquidity/transport version: ${profile.activeVersion || 'unknown'}; preferred forward version: ${profile.forwardVersion || 'unknown'}.`
? `Active liquidity/bridge version: ${profile.activeVersion || 'unknown'}; preferred forward version: ${profile.forwardVersion || 'unknown'}.`
: 'No explicit active-versus-forward version posture is available from the local GRU catalog yet.'}
</div>
</div>
@@ -163,7 +178,7 @@ export default function GruStandardsCard({
{profile.standards.map((standard) => (
<div key={`${standard.id}-explanation`} className="rounded-xl border border-gray-200 bg-gray-50 p-3 text-sm dark:border-gray-700 dark:bg-gray-900/40">
<div className="flex flex-wrap items-center gap-2">
<div className="font-medium text-gray-900 dark:text-white">{standard.id}</div>
<div className="font-medium text-gray-900 dark:text-white">{formatStandardLabel(standard.id)}</div>
<EntityBadge label={standard.detected ? 'detected' : 'missing'} tone={standard.detected ? 'success' : 'warning'} />
</div>
<div className="mt-2 text-gray-600 dark:text-gray-400">
@@ -190,12 +205,12 @@ export default function GruStandardsCard({
<DetailRow label="References">
<div className="space-y-2 text-sm text-gray-600 dark:text-gray-400">
<div><Link href="/docs/gru" className="text-primary-600 hover:underline">Explorer GRU guide</Link></div>
<div>Canonical profile: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">{profile.profileId}</code></div>
<div>Repo standards matrix: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">docs/04-configuration/GRU_C_STAR_V2_STANDARDS_MATRIX_AND_IMPLEMENTATION_PLAN.md</code></div>
<div>Machine-readable profile: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">config/gru-standards-profile.json</code></div>
<div>Transport overlay: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">config/gru-transport-active.json</code></div>
<div>x402 support note: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">docs/04-configuration/CHAIN138_X402_TOKEN_SUPPORT.md</code></div>
<div>Chain 138 readiness guide: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">docs/04-configuration/GRU_V2_CHAIN138_READINESS.md</code></div>
<div>Canonical profile: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">{formatProfileLabel(profile.profileId)}</code></div>
<div>Standards matrix: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">GRU C* v2 implementation plan</code></div>
<div>Machine-readable profile: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">GRU standards profile</code></div>
<div>Public-network overlay: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">GRU cW representation registry</code></div>
<div>x402 support note: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">Chain 138 x402 token support</code></div>
<div>Chain 138 readiness guide: <code className="rounded bg-gray-100 px-1.5 py-0.5 text-xs dark:bg-gray-800">GRU v2 Chain 138 readiness</code></div>
</div>
</DetailRow>

View File

@@ -704,7 +704,7 @@ export default function Navbar() {
href="/"
className="group inline-flex min-w-0 items-center gap-3 rounded-2xl py-2 pr-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-950"
onClick={() => setMobileMenuOpen(false)}
aria-label="Go to SolaceScan home"
aria-label="Go to DBIS Explorer home"
>
<BrandLockup />
</Link>

View File

@@ -105,7 +105,7 @@ export default function WethOperationsPage({
<OperationsPageShell page={page}>
<Card className="mb-6 border border-amber-200 bg-amber-50/70 dark:border-amber-900/50 dark:bg-amber-950/20">
<p className="text-sm leading-6 text-amber-950 dark:text-amber-100">
These WETH references are bridge and transport surfaces, not a claim that Ethereum mainnet WETH contracts are native Chain 138 assets.
These WETH references are bridge-lane and public-network representation surfaces, not a claim that Ethereum mainnet WETH contracts are native Chain 138 assets.
Use this page to review wrapped-asset lane posture, counterpart contracts, and operational dependencies.
</p>
</Card>

View File

@@ -609,7 +609,7 @@ export default function Home({
<div className="rounded-2xl border border-white/40 bg-white/55 p-4 shadow-sm backdrop-blur dark:border-white/10 dark:bg-black/10">
<div className="text-xs font-semibold uppercase tracking-wide opacity-70">Chain 138 Status</div>
<div className="mt-2 text-lg font-semibold">{chainStatus.status || 'unknown'}</div>
<div className="mt-1 text-sm opacity-80">{chainStatus.name || 'Defi Oracle Meta Mainnet'}</div>
<div className="mt-1 text-sm opacity-80">{chainStatus.name || 'DeFi Oracle Meta Mainnet'}</div>
</div>
<div className="rounded-2xl border border-white/40 bg-white/55 p-4 shadow-sm backdrop-blur dark:border-white/10 dark:bg-black/10">
<div className="text-xs font-semibold uppercase tracking-wide opacity-70">Head Age</div>

View File

@@ -148,7 +148,7 @@ const FALLBACK_CAPABILITIES_138: CapabilitiesCatalog = {
name: 'Chain 138 RPC Capabilities',
version: { major: 1, minor: 1, patch: 0 },
timestamp: '2026-03-28T00:00:00Z',
generatedBy: 'SolaceScan',
generatedBy: 'DBIS Explorer',
chainId: 138,
chainName: 'DeFi Oracle Meta Mainnet',
rpcUrl: 'https://rpc-http-pub.d-bis.org',

View File

@@ -424,7 +424,7 @@ export default function AddressDetailPage() {
{gruMetadata ? <EntityBadge label="GRU" tone="success" /> : null}
{gruMetadata?.x402Ready ? <EntityBadge label="x402 ready" tone="info" /> : null}
{gruMetadata?.iso20022Ready ? <EntityBadge label="ISO-20022" tone="info" /> : null}
{gruMetadata?.transportActiveVersion ? <EntityBadge label={`transport ${gruMetadata.transportActiveVersion}`} tone="warning" /> : null}
{gruMetadata?.transportActiveVersion ? <EntityBadge label={`cW public-network ${gruMetadata.transportActiveVersion}`} tone="warning" /> : null}
</div>
{transfer.token_address && (
<Link href={`/tokens/${transfer.token_address}`} className="text-primary-600 hover:underline">

View File

@@ -11,7 +11,7 @@ export default function GruDocsPage() {
<PageIntro
eyebrow="Explorer Documentation"
title="GRU Guide"
description="A user-facing summary of the GRU standards, transport posture, and x402 readiness model, with concrete places to inspect those signals on live token, address, and search pages."
description="A user-facing summary of the GRU standards, bridge posture, public-network representations, and x402 readiness model, with concrete places to inspect those signals on live token, address, and search pages."
actions={[
{ href: '/tokens', label: 'Browse tokens' },
{ href: '/search?q=cUSDC', label: 'Search cUSDC' },
@@ -23,7 +23,7 @@ export default function GruDocsPage() {
<Card title="What The Explorer Is Showing You">
<div className="space-y-4 text-sm text-gray-600 dark:text-gray-400">
<p>
The explorer now distinguishes between canonical GRU money surfaces on Chain 138 and wrapped transport assets used on public-chain bridge lanes.
The explorer now distinguishes between canonical GRU surfaces on Chain 138 and cW public-network representations used on bridge lanes.
It also highlights when a token looks ready for x402-style payment flows.
</p>
<p>
@@ -103,7 +103,7 @@ export default function GruDocsPage() {
<Card title="Chain 138 Practical Reading">
<div className="space-y-3 text-sm text-gray-600 dark:text-gray-400">
<p>
A token can be forward-canonical and x402-ready even while older liquidity or transport lanes still run on a prior version.
A token can be forward-canonical and x402-ready even while older liquidity or bridge lanes still run on a prior version.
That is why the explorer separates active liquidity posture from forward-canonical posture.
</p>
<p>

View File

@@ -8,7 +8,7 @@ const docsCards = [
{
title: 'GRU Guide',
href: '/docs/gru',
description: 'Understand GRU standards, x402 readiness, wrapped transport posture, and forward-canonical versioning as surfaced by the explorer.',
description: 'Understand GRU standards, x402 readiness, cW public-network posture, and forward-canonical versioning as surfaced by the explorer.',
},
{
title: 'Transaction Evidence Matrix',
@@ -88,8 +88,8 @@ export default function DocsIndexPage() {
<Card title="Operator & Domains">
<div className="space-y-3 text-sm text-gray-600 dark:text-gray-400">
<p>
SolaceScan is the public Chain 138 explorer operated by DBIS / Defi Oracle. The explorer may be reached through
<code> blockscout.defi-oracle.io</code> or <code> explorer.d-bis.org</code>.
DBIS Explorer is the public Chain 138 explorer operated by DBIS. Primary public access is served at
<code> explorer.d-bis.org</code>; <code> blockscout.defi-oracle.io</code> is the Blockscout companion domain.
</p>
<p>
These domains are part of the same explorer and companion-tooling surface, including the Snap install path at

View File

@@ -12,7 +12,7 @@ export default function HomeAliasPage() {
return (
<main className="container mx-auto px-4 py-12">
<div className="mx-auto max-w-xl rounded-xl border border-gray-200 bg-white p-6 text-center shadow-sm dark:border-gray-700 dark:bg-gray-800">
<h1 className="text-2xl font-semibold text-gray-900 dark:text-white">Redirecting to SolaceScan</h1>
<h1 className="text-2xl font-semibold text-gray-900 dark:text-white">Redirecting to DBIS Explorer</h1>
<p className="mt-3 text-sm leading-7 text-gray-600 dark:text-gray-400">
The legacy <code className="rounded bg-gray-100 px-1 py-0.5 text-xs dark:bg-gray-900">/home</code> route now redirects to the main explorer landing page.
</p>

View File

@@ -392,7 +392,7 @@ export default function SearchPage({
{result.is_curated_token && <EntityBadge label="listed" tone="success" />}
{result.is_gru_token && <EntityBadge label="GRU" tone="success" />}
{result.is_x402_ready && <EntityBadge label="x402 ready" tone="info" />}
{result.is_wrapped_transport && <EntityBadge label="wrapped" tone="warning" />}
{result.is_wrapped_transport && <EntityBadge label="cW public-network" tone="warning" />}
{result.currency_code ? <EntityBadge label={result.currency_code} tone="neutral" /> : null}
{result.match_reason ? <EntityBadge label={result.match_reason} tone="info" className="normal-case tracking-normal" /> : null}
{result.matched_tags?.map((tag) => <EntityBadge key={tag} label={tag} />)}

View File

@@ -432,7 +432,7 @@ export default function TokenDetailPage() {
<Card title="Other Networks">
<div className="space-y-4">
<p className="text-sm text-gray-600 dark:text-gray-400">
These are sibling representations or settlement counterparts for the same GRU asset family on other networks, drawn from the local transport and mapping posture used by this workspace.
These are sibling representations or settlement counterparts for the same GRU asset family on other networks, drawn from the local public-network overlay and mapping posture used by this workspace.
</p>
<div className="space-y-3">
{gruExplorerMetadata.otherNetworks.map((network) => (

View File

@@ -11,8 +11,8 @@ import { tokenAggregationApi, type TokenAggregationTokenSnapshot } from '@/servi
import { fetchPublicJson } from '@/utils/publicExplorer'
const quickSearches = [
{ label: 'cUSDT', description: 'Canonical compliant USD electronic-money liquidity and address results.' },
{ label: 'cUSDC', description: 'Canonical compliant USD electronic-money routes and address coverage.' },
{ label: 'cUSDT', description: 'Canonical compliant USD treasury / government bond liquidity and address results.' },
{ label: 'cUSDC', description: 'Canonical compliant USD cash electronic-money routes and address coverage.' },
{ label: 'cXAUC', description: 'Gold-backed cXAUC pools and token references.' },
{ label: 'cXAUT', description: 'Gold-backed cXAUT references and search coverage.' },
{ label: 'cEURT', description: 'EUR liquidity and cXAUC-connected route coverage.' },
@@ -37,6 +37,19 @@ function formatUsd(value: number | undefined): string {
}).format(value)
}
function tagPriority(tag: string) {
const order: Record<string, number> = {
gru: 0,
compliant: 1,
'treasury-bond': 2,
'electronic-money': 2,
commodity: 2,
'reference-asset': 0,
defi: 4,
}
return order[tag] ?? 3
}
export default function TokensPage({ initialCuratedTokens }: TokensPageProps) {
const router = useRouter()
const [query, setQuery] = useState('')
@@ -106,7 +119,7 @@ export default function TokensPage({ initialCuratedTokens }: TokensPageProps) {
<PageIntro
eyebrow="Token Discovery"
title="Tokens"
description="Browse curated Chain 138 assets, open token contracts directly, and move into holders, transfers, liquidity, and provenance without pretending a search box is a complete token strategy."
description="Browse curated Chain 138 assets, open token contracts directly, and review holders, transfers, liquidity, and provenance from the same institutional explorer surface."
actions={[
{ href: '/wallet', label: 'Wallet tools' },
{ href: '/liquidity', label: 'Liquidity access' },
@@ -114,7 +127,7 @@ export default function TokensPage({ initialCuratedTokens }: TokensPageProps) {
]}
/>
<Card className="mb-6" title="Find A Token">
<Card className="mb-6" title="Find a token">
<form onSubmit={handleSubmit} className="flex flex-col gap-3 md:flex-row">
<input
type="text"
@@ -139,7 +152,7 @@ export default function TokensPage({ initialCuratedTokens }: TokensPageProps) {
<div className="grid gap-6 lg:grid-cols-3">
<Card title="Curated Registry">
<p className="text-sm text-gray-600 dark:text-gray-400">
Review listed Chain 138 assets with provenance tags such as compliant, wrapped, and bridge-aware before acting on a symbol match.
Review listed Chain 138 assets with provenance tags such as GRU, compliant, cW public-network, and reference asset before acting on a symbol match.
</p>
<div className="mt-4">
<Link href="/tokens" className="text-primary-600 hover:underline">
@@ -194,7 +207,7 @@ export default function TokensPage({ initialCuratedTokens }: TokensPageProps) {
) : null}
{token.tags && token.tags.length > 0 && (
<div className="mt-3 flex flex-wrap gap-2">
{token.tags.slice(0, 3).map((tag) => (
{[...token.tags].sort((a, b) => tagPriority(a) - tagPriority(b)).slice(0, 3).map((tag) => (
<EntityBadge key={`${token.address}-${tag}`} label={tag} className="px-2 py-1 text-[11px]" />
))}
</div>

View File

@@ -146,7 +146,7 @@ function setStoredWalletSession(session: WalletAccessSession | null) {
}
function buildWalletMessage(nonce: string) {
return `Sign this message to authenticate with SolaceScan.\n\nNonce: ${nonce}`
return `Sign this message to authenticate with DBIS Explorer.\n\nNonce: ${nonce}`
}
async function fetchWalletJson<T>(path: string, init?: RequestInit): Promise<T> {

View File

@@ -30,7 +30,7 @@ export interface GruStandardsProfile {
metadata: GruMetadataField[]
}
const GRU_PROFILE_ID = 'gru-c-star-v2-transport-and-payment'
const GRU_PROFILE_ID = 'gru-c-star-v2-public-network-and-payment'
const STANDARD_DEFINITIONS = [
{ id: 'ERC-20', required: true },
@@ -40,7 +40,7 @@ const STANDARD_DEFINITIONS = [
{ id: 'ERC-2612', required: true },
{ id: 'ERC-3009', required: true },
{ id: 'ERC-5267', required: true },
{ id: 'IeMoneyToken', required: true },
{ id: 'CashElectronicMoneyInterface', required: true },
{ id: 'DeterministicStorageNamespace', required: true },
{ id: 'JurisdictionAndSupervisionMetadata', required: true },
] as const
@@ -146,7 +146,7 @@ export async function getGruStandardsProfileSafe(input: {
'ERC-2612': nonces != null || hasMethod(contractProfile, 'permit') || hasMethod(contractProfile, 'nonces'),
'ERC-3009': authorizationState != null || hasMethod(contractProfile, 'authorizationState'),
'ERC-5267': hasMethod(contractProfile, 'eip712Domain'),
IeMoneyToken: currencyCode != null || versionTag != null,
CashElectronicMoneyInterface: currencyCode != null || versionTag != null,
DeterministicStorageNamespace: storageNamespace != null,
JurisdictionAndSupervisionMetadata:
governanceProfileId != null ||
@@ -187,7 +187,7 @@ export async function getGruStandardsProfileSafe(input: {
regulatoryDisclosureURI ? { label: 'Disclosure URI', value: regulatoryDisclosureURI } : null,
reportingURI ? { label: 'Reporting URI', value: reportingURI } : null,
minimumUpgradeNoticePeriod ? { label: 'Upgrade Notice Period', value: `${minimumUpgradeNoticePeriod} seconds` } : null,
wrappedTransport != null ? { label: 'Wrapped Transport', value: wrappedTransport } : null,
wrappedTransport != null ? { label: 'cW Public-Network Representation', value: wrappedTransport } : null,
forwardCanonical != null ? { label: 'Forward Canonical', value: forwardCanonical } : null,
legacyAliasSupport ? { label: 'Legacy Alias Support', value: 'true' } : null,
{ label: 'x402 Readiness', value: x402Ready ? 'true' : 'false' },