feat: explorer API, wallet, CCIP scripts, and config refresh

- Backend REST/gateway/track routes, analytics, Blockscout proxy paths.
- Frontend wallet and liquidity surfaces; MetaMask token list alignment.
- Deployment docs, verification scripts, address inventory updates.

Check: go build ./... under backend/ (pass).
Made-with: Cursor
This commit is contained in:
defiQUG
2026-04-07 23:22:12 -07:00
parent d931be8e19
commit 6eef6b07f6
224 changed files with 19671 additions and 3291 deletions

View File

@@ -919,6 +919,149 @@
.gas-network-subtle { color: var(--text-light); font-size: 0.82rem; white-space: nowrap; }
.btn-copy { background: none; border: none; cursor: pointer; padding: 0.25rem; margin-left: 0.35rem; color: var(--text-light); vertical-align: middle; }
.btn-copy:hover { color: var(--primary); }
.tx-chip-row {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.tx-chip {
display: inline-flex;
align-items: center;
gap: 0.35rem;
padding: 0.3rem 0.6rem;
border-radius: 999px;
background: var(--muted-surface);
border: 1px solid var(--border);
color: var(--text);
font-size: 0.8rem;
}
.tx-chip-label {
color: var(--text-light);
text-transform: uppercase;
letter-spacing: 0.04em;
font-size: 0.72rem;
}
.tx-inspector-stack {
display: grid;
gap: 0.75rem;
}
.tx-inspector-entry {
border: 1px solid var(--border);
border-radius: 12px;
background: var(--muted-surface);
overflow: hidden;
}
.tx-inspector-entry summary {
list-style: none;
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 1rem;
padding: 0.85rem 1rem;
font-weight: 600;
}
.tx-inspector-entry summary::-webkit-details-marker {
display: none;
}
.tx-inspector-entry[open] summary {
border-bottom: 1px solid var(--border);
}
.tx-inspector-summary-value {
color: var(--text-light);
font-size: 0.82rem;
text-align: right;
font-weight: 500;
}
.tx-inspector-entry-body {
display: grid;
gap: 0.75rem;
padding: 0.9rem 1rem 1rem;
}
.tx-inspector-note {
color: var(--text-light);
font-size: 0.84rem;
line-height: 1.5;
}
.tx-inspector-line {
display: grid;
grid-template-columns: minmax(110px, 140px) minmax(0, 1fr);
gap: 0.75rem;
align-items: start;
}
.tx-inspector-label {
color: var(--text-light);
text-transform: uppercase;
letter-spacing: 0.05em;
font-size: 0.72rem;
padding-top: 0.15rem;
}
.tx-inspector-content {
min-width: 0;
}
.tx-inspector-scroll {
overflow-x: auto;
}
.tx-inspector-mono {
font-family: 'Courier New', monospace;
font-size: 0.82rem;
line-height: 1.55;
white-space: pre-wrap;
word-break: break-all;
}
.tx-inspector-pre {
margin: 0;
padding: 0.85rem;
border-radius: 10px;
background: rgba(15, 23, 42, 0.06);
border: 1px solid var(--border);
font-family: 'Courier New', monospace;
font-size: 0.8rem;
line-height: 1.55;
white-space: pre-wrap;
word-break: break-word;
}
.tx-inspector-topic-list {
display: grid;
gap: 0.55rem;
}
.tx-inspector-topic-row {
display: grid;
gap: 0.35rem;
padding: 0.7rem;
border-radius: 10px;
border: 1px solid var(--border);
background: rgba(255, 255, 255, 0.45);
}
.tx-inspector-topic-index {
color: var(--text-light);
text-transform: uppercase;
letter-spacing: 0.05em;
font-size: 0.7rem;
}
.tx-empty {
color: var(--text-light);
font-size: 0.9rem;
}
body.dark-theme .tx-inspector-pre {
background: rgba(15, 23, 42, 0.72);
}
body.dark-theme .tx-inspector-topic-row {
background: rgba(15, 23, 42, 0.44);
}
@media (max-width: 768px) {
.tx-inspector-line {
grid-template-columns: 1fr;
gap: 0.35rem;
}
.tx-inspector-entry summary {
flex-direction: column;
align-items: stretch;
}
.tx-inspector-summary-value {
text-align: left;
}
}
.site-footer {
margin-top: 2.5rem;
padding: 2rem 0 2.5rem;
@@ -1041,6 +1184,7 @@
<li role="none"><a href="/routes" role="menuitem" onclick="event.preventDefault(); showRoutes(); updatePath('/routes'); closeNavMenu();" aria-label="View route decision tree"><i class="fas fa-diagram-project" aria-hidden="true"></i> <span>Routes</span></a></li>
<li role="none"><a href="/tokens" role="menuitem" onclick="event.preventDefault(); if(typeof showTokensList==='function')showTokensList();else focusSearchWithHint('token'); updatePath('/tokens'); closeNavMenu();" aria-label="View token list"><i class="fas fa-tag" aria-hidden="true"></i> <span data-i18n="tokens">Tokens</span></a></li>
<li role="none"><a href="/pools" role="menuitem" onclick="event.preventDefault(); showPools(); updatePath('/pools'); closeNavMenu();" aria-label="View pools"><i class="fas fa-water" aria-hidden="true"></i> <span data-i18n="pools">Pools</span> <span id="poolsMissingQuoteBadge" class="badge badge-warning" style="display:none; margin-left:0.35rem; vertical-align:middle;">0</span></a></li>
<li role="none"><a href="/system" role="menuitem" onclick="event.preventDefault(); showSystemTopology(); closeNavMenu();" aria-label="System topology"><i class="fas fa-sitemap" aria-hidden="true"></i> <span>System</span></a></li>
<li role="none"><a href="/watchlist" role="menuitem" onclick="event.preventDefault(); showWatchlist(); updatePath('/watchlist'); closeNavMenu();" aria-label="Watchlist"><i class="fas fa-star" aria-hidden="true"></i> <span data-i18n="watchlist">Watchlist</span></a></li>
</ul>
</li>
@@ -1556,6 +1700,23 @@
</div>
</div>
</div>
<div id="systemView" class="detail-view">
<div class="breadcrumb" id="systemBreadcrumb"><a href="/">Home</a><span class="breadcrumb-separator">/</span><span class="breadcrumb-current">System</span></div>
<div class="card">
<div class="card-header">
<button class="btn btn-secondary" onclick="showHome()" aria-label="Go back"><i class="fas fa-arrow-left" aria-hidden="true"></i> Back</button>
<h2 class="card-title"><i class="fas fa-sitemap" aria-hidden="true"></i> System topology</h2>
<div style="display:flex; gap:0.5rem; margin-left:auto; flex-wrap:wrap;">
<a class="btn btn-secondary" href="/chain138-command-center.html" target="_blank" rel="noopener noreferrer">Command center</a>
<button type="button" class="btn btn-primary" onclick="if(window._showSystemTopology) window._showSystemTopology();" aria-label="Reload topology"><i class="fas fa-sync-alt" aria-hidden="true"></i> Reload</button>
</div>
</div>
<div id="systemTopologyContent">
<div class="loading"><i class="fas fa-spinner" aria-hidden="true"></i> Loading graph…</div>
</div>
</div>
</div>
</div>
<footer class="site-footer">
@@ -1594,6 +1755,6 @@
</div>
</footer>
<script src="/explorer-spa.js?v=29"></script>
<script src="/explorer-spa.js?v=34"></script>
</body>
</html>