Commit Graph
6099 Commits
Author SHA1 Message Date
zeekay b035f605a4 feat: multi-brand build matrix + white-label support
Build the same source four ways from one repo:

- ghcr.io/luxfi/explore         (lux brand, default)
- ghcr.io/luxfi/explore-hanzo   (hanzo brand)
- ghcr.io/luxfi/explore-zoo     (zoo brand)
- ghcr.io/luxfi/explore-pars    (pars brand)

Each is built for linux/amd64 + linux/arm64 in parallel on hanzo ARC
runners (no QEMU), then merged into a multi-arch manifest.

Brand selection at build time via NEXT_PUBLIC_BRAND, with all
brand-specific assets (logo, favicon, theme, IAM URL) loaded from
NEXT_PUBLIC_* env vars — no hardcoded brand strings in source.

External operators set NEXT_PUBLIC_BRAND=other and supply their own
NEXT_PUBLIC_* env vars (see .env.example.external). The repo carries
no third-party trademarks.

Files:
- lib/white-label.ts                             brand detection + helpers
- .env.example.{lux,hanzo,zoo,pars,external}     deploy templates
- .github/workflows/build-lux.yml                4-brand × 2-arch matrix
- Dockerfile                                     accept NEXT_PUBLIC_BRAND
- configs/app/chainRegistry.ts                   add SPC + Pars devnet,
                                                 chainId fields, white-label
                                                 chain builder
2026-05-05 20:50:55 -07:00
zeekay 2cef4f310d explore: scrub Avalabs IP + liquidity cross-contamination
Remove  Network chain entries (mainnet/testnet/devnet/localnet)
and LIQUIDITY_BRANDING constant from chainRegistry.ts. Lux explorer must
not register / hostnames. Replace "Liquid EVM Explorer"
top-bar tagline with "Lux Explorer".
2026-05-05 20:50:55 -07:00
3be8d78290 ci: migrate runner from lux-build to hanzo-build/hanzo-deploy (ARC consolidation) (#5)
Consolidating to single canonical ARC fleet. Killing duplicate lux-build
scale set. Build job → hanzo-build-linux-amd64 (max 30 on DO). Deploy
job → hanzo-deploy-linux-amd64 (max 20 on DO, correct runner class for
kubectl deploys).

No behavior change for this workflow.

Co-authored-by: Hanzo Dev <[email protected]>
2026-04-23 18:01:10 -07:00
zeekay 5e30074537 wip: scaffold Vite 8 + React 19 SPA under vite/ — Next.js port blocked
The existing Next.js app (99 pages, 427 next/* imports, 177 files using
next/router, 154 using nextjs-routes types, 105 using getServerSideProps) is
far too coupled to rewrite in one pass. A full migration is ~2–4 weeks of
mechanical work.

This commit adds the scaffold only:

  vite/package.json      — Vite 8 + React 19.2 + wouter, no Next deps
  vite/vite.config.ts    — aliases at ../lib, ../ui, ../configs, … so source
                           migrates file-by-file instead of moving
  vite/tsconfig.json     — mirrors the aliases for TypeScript
  vite/index.html        — security headers as <meta> (was nextjs/headers.js)
  vite/src/main.tsx      — React 19 root bootstrap
  vite/src/env.ts        — runtime envs: window.__envs first, import.meta.env
                           fallback, maps NEXT_PUBLIC_API_HOST → VITE_API_BASE_URL
  vite/src/redirects.ts  — full port of nextjs/redirects.js (69 client rules)
  vite/src/App.tsx       — wouter router with CatchAll redirect resolver
  vite/Dockerfile        — 2-stage → ghcr.io/hanzoai/spa
  vite/LLM.md            — what's done, what's left, how to finish

The production Dockerfile at ../Dockerfile still builds the Next.js app. This
scaffold is independent; nothing in the existing tree is deleted or moved.

See vite/LLM.md for the full migration plan and 9 critical TODOs before this
can replace the Next.js build.
2026-04-19 00:05:37 -07:00
zeekay 3813d03918 feat: explorer FE — stateless SSR, chain selector, localnet, registry cleanup 2026-03-01 18:00:00 -08:00
zeekay 422add6c5a fix: restore mocks/ in Docker context, fix legacy ENV format
mocks/ needed at build time (imported by source files)
2026-03-01 23:26:39 -08:00
zeekay e2f456c299 perf: optimize Docker build for speed — GHA cache, concurrency, fewer layers
- Switch from registry cache to type=gha (no network overhead for DinD runners)
- Add concurrency group to cancel in-progress builds on same branch
- Merge build+deploy into single job (saves job startup overhead)
- Combine 7 tool installs into single RUN layer
- Add BuildKit cache mounts for pnpm store and Next.js .next/cache
- Combine sequential RUN commands in all 3 Dockerfile stages
- Disable Next.js telemetry during build and runtime
- Expand .dockerignore to exclude tests, docs, .github
2026-03-01 23:18:39 -08:00
zeekay 2a6bff793d fix: use dedicated lux-explore-client-id for explorer OIDC
Each Lux app gets its own IAM application. Explorer uses
lux-explore-client-id (registered as app-explore in IAM).
2026-03-01 23:05:37 -08:00
zeekay 133ccb9958 feat: native Hanzo IAM integration for lux.id OIDC login
- Fix token exchange endpoint to /api/login/oauth/access_token (IAM convention)
- Fix authorize URL to /login/oauth/authorize (consistent across components)
- Use lux-app-client-id (registered in IAM) instead of unregistered 'explore'
- Fetch user profile directly from IAM /api/userinfo endpoint
- Skip Blockscout auth_logout API call for OIDC provider
- Hide "scanning new transactions" warning (looks like error on low-traffic chains)
- Fix type error in useRedirectForInvalidAuthToken for OIDC error shape
2026-03-01 23:02:59 -08:00
zeekay b7ee2f142b fix: prevent Cloudflare from caching envs.js
envs.js is generated at container startup from environment variables.
Add Cache-Control: no-store header to ensure CDN/browser never serves
a stale version when config changes.
2026-03-01 21:15:47 -08:00
zeekay 284d506593 feat: OIDC login via lux.id, full-width layout, P-chain stats fix
- Add Sign in button to TopBar with OIDC flow to lux.id
- Merge settings (color theme, identicon, address format) into user menu popover
- Remove duplicate user profile from HeroBanner
- Full-width stacked blocks/transactions layout on homepage
- Fix P-chain stats: CSP connect-src allows base origin for SDK calls
- Fix connected count: infer from uptime when field missing
- Fix dark mode popover background
- Enable OIDC in .env.production (lux.id, client: explore)
2026-03-01 20:34:00 -08:00
zeekay 6d65248101 Revert "Fix: Replace chakra.svg with native SVG elements to resolve React rendering error"
This reverts commit 8c3eef42de342e33851e643c1357b459e31fedb2.
2026-03-02 13:39:33 -08:00
zeekay fdb50f453e Fix: Replace chakra.svg with native SVG elements to resolve React rendering error
- Fixed TopBar.tsx: replaced chakra.svg with native svg element
- Fixed IconSvg.tsx: refactored to use native svg instead of chakra-wrapped SVG
- Changed Props interface to extend React.SVGAttributes instead of HTMLChakraProps
- Ensures SVG elements receive appropriate HTML attributes only
2026-03-02 13:36:54 -08:00
zeekay dc7e2cc1fc fix: update zetachain enum values to match package type definitions
PascalCase enum values (PendingOutbound, OutboundMined, etc.) instead
of SCREAMING_SNAKE_CASE (PENDING_OUTBOUND, OUTBOUND_MINED, etc.) to
match the actual @luxfi/zetachain-cctx-types package exports.
2026-03-02 12:53:59 -08:00
zeekay da79f9e711 feat: rename @blockscout to @luxfi, monochrome theme, horizontal blocks
- Rename all @blockscout/* npm packages to @luxfi/* aliases (150+ files)
- Override blue accent colors to gray for monochrome theme
- Fix dropdown/menu/popover fonts to use Geist Sans
- Change Latest Blocks to horizontal scrolling layout
- Show dashes instead of zeros for validator stats on error
- Fix GHA deploy step to use correct deployment name
2026-03-02 12:28:15 -08:00
zeekay 84af44a4f5 fix: remove all user-visible Blockscout references
- Issue URL → github.com/luxfi/explore
- API docs links → docs.lux.network
- Contract verification → local route instead of vera.blockscout.com
- Discord link → discord.gg/luxnetwork
- JSON-LD script ID → lux-explorer-product-schema
- RPC API description → Lux Network branding
- Rollbar instance → .lux.network domain support
2026-03-02 10:43:36 -08:00
zeekay 1affde5938 feat: horizontal blocks layout, stats grid, network overview fallback chains
- LatestBlocks: full-width layout instead of fixed 280px sidebar
- Stats: 4-column grid on desktop, 2-column on mobile
- NetworkOverview: fallback known L1 chains when P-chain API unreachable
- NetworkOverview: expose isError from useCurrentValidators
- P-chain hooks: add retry:2 for resilience
- UserProfile: use address_hash instead of id for display
- Replace middleware.ts with proxy.ts (unused in production Docker)
- Add toolkit/chakra/separator re-export
- tsconfig: jsx react-jsx, formatting cleanup
- dev.sh: disable turbopack (stability)
2026-03-02 10:36:17 -08:00
zeekay ddb1fa2cd9 unify all sql images to :latest (PG18)
Single version policy: ghcr.io/hanzoai/sql:latest everywhere.
No version pinning, no backwards compat, always latest stable.
2026-03-01 21:09:09 -08:00
zeekay 388346c75f fix(validators): use weight field and correct uptime format for P-chain validators
- P-chain API returns weight not stakeAmount; fallback to weight when stakeAmount absent
- uptime from API is already 0-100 percentage, not 0-1 fraction; remove double-multiply
- mark connected and stakeAmount as optional to match actual API response shape
2026-03-01 12:45:34 -08:00
zeekay 3c49363dae brand: remove remaining Blockscout text references from UI
Replace user-visible "Blockscout" brand text with "Lux Explorer":
- AdminSupportText: [email protected] → [email protected]
- useSignInWithWallet: sign-in message rebrand
- ContractVerification (Hardhat/Foundry): remove "on Blockscout"
- ContractDetailsAlerts: "Blockscout DB" → "our database"
- ContractCustomAbiAlert: liability notice rebrand
- ContractDetailsAlertVerificationStatus: "Blockscout Bytecode Database" → "Bytecode Database"
- ApiKeys page: remove "Blockscout API key" reference
- VerifiedAddresses: "Blockscout" → "explorer"
- MarketplaceRatingTriggerButton: remove login-to-blockscout message
- AddressMultichainButton/GetGasButton/RollupStageBadge: utm_source blockscout → lux-explorer
- Monaco editor: rename blockscout-light/dark themes to lux-light/dark
2026-03-01 03:37:04 -08:00
zeekay 08cddc0fcb brand: remove all Blockscout branding, replace with Lux Explorer
- Gas tracker FAQ: Blockscout → Lux Explorer
- Chain config web3/chains.ts: explorer name → Lux Explorer
- Auth screens: Blockscout account → Lux account
- Contract verification: Blockscout supports → Lux Explorer supports
- API docs: Blockscout core API → Lux Explorer Core API
- Rewards/merits: Blockscout Merits → Lux Explorer Rewards
- Marketplace disclaimer and integration icons
- Address verification: [email protected] → [email protected]
- Chart export filenames: Blockscout chart/stats → Lux Explorer
- OTEL service name: blockscout_frontend → lux_explorer_frontend
- Dev container: blockscout dev → lux explorer dev
2026-02-27 22:17:37 -08:00
zeekay 62965a5f50 ci: simplify to single-arch amd64-only build on lux-build ARC runners
Drop arm64 + manifest jobs (cluster is amd64-only). All jobs now run
on lux-build self-hosted runners — no GitHub-hosted runners needed.
Build -> deploy in 2 jobs, no intermediate manifest step.
2026-02-27 19:48:32 -08:00
zeekay 8910959c6b ci: fix kubectl install path (non-root runner) 2026-02-27 19:44:25 -08:00
zeekay 233589eb65 ci: install kubectl in deploy job for ARC self-hosted runners
ARC runner image doesn't include kubectl. Install it via curl
before the deploy step so rollout restarts work correctly.
2026-02-27 19:34:53 -08:00
zeekay 12cae18a45 ci: use lux-build self-hosted DOKS runners for amd64 builds
Switches build-amd64, create-manifest, and deploy jobs from
ubuntu-latest to our native lux-build ARC runners on lux-k8s.
Eliminates QEMU emulation overhead for amd64 targets.
2026-02-27 16:13:35 -08:00
zeekay 008ef3d93e fix: SSR branding — use NEXT_PUBLIC_APP_HOST for correct per-chain logo/favicon
- getHostname() reads NEXT_PUBLIC_APP_HOST via getEnvValue during SSR
  so each explorer instance shows its own branding from first paint
- _document.tsx generates dynamic SVG favicon from chain branding
2026-02-27 14:48:03 -08:00
zeekay 26c519de84 fix: make deploy step resilient to missing subnet frontend deployments 2026-02-27 14:26:57 -08:00
zeekay 43edea1ca4 fix: deploy step restarts all 5 frontend pods, not just mainnet 2026-02-27 13:56:01 -08:00
zeekay cbe3f2adb2 fix: use real brand logos from each project's logo repo
- Lux: triangle from ~/work/lux/logo/
- Zoo: three overlapping circles from ~/work/zoo/logo/
- Hanzo: geometric H from ~/work/hanzo/logo/
- SPC: unicorn emoji per user request
- Pars: 8-pointed star from ~/work/pars/logo/
- Changed branding to multi-path SVGs (logoViewBox + logoContent)
2026-02-27 13:13:13 -08:00
zeekay d6fe894153 feat: per-chain branding — logo, favicon, brand name customizable
- Add ChainBranding interface with logoSvg, faviconSvg, brandName per chain
- Each chain (Lux, Zoo, Hanzo, SPC, Pars) gets distinct icon + brand name
- TopBar renders chain-specific logo and brand name from registry
- ChainSwitcher shows per-chain icons in dropdown items
- Dynamic favicon via useChainFavicon hook (swaps SVG favicon on mount)
- Page title uses chain branding via getNetworkTitle()
2026-02-27 13:04:06 -08:00
zeekay 58334edcf6 fix: replace Blockscout favicon with Lux triangle
All favicon files (PNG 16/32/48, ICO, SVG, apple-touch-icon, android-chrome)
now show the Lux triangle logo (black circle, white triangle) instead of the
Blockscout blue "h" logo.
2026-02-27 12:33:21 -08:00
zeekay 956029e7f1 fix: wait for networkidle before checking page title in E2E tests
Next.js sets document.title after hydration, not at domcontentloaded.
2026-02-27 12:27:06 -08:00
zeekay d1f7ed02e0 fix: polish header — cleaner nav, branded logo, compact selectors
- Logo shows "Lux Network" for C-Chain, chain name for subnets
- Blockchain items (Blocks, Txns, Tokens, Accounts, Contracts)
  grouped under a dropdown to reduce nav clutter
- Network selector: minimal pill with green dot, no outline button
- Chain switcher: compact bordered pill with chevron
- Smaller font sizes (xs), tighter spacing, rounded menus
- Consistent hover states across all interactive elements
2026-02-27 12:23:58 -08:00
zeekay 0e381fd911 feat: add all chain VM accessors and wire DEX/Bridge to luxnet SDK
- Add centralized chain accessor module (lib/api/luxnet/chains.ts) exposing
  all 14 chain VMs (C/X/P/A/B/D/G/I/K/O/Q/R/T/Z) plus utility APIs
- Refactor pchain/client.ts to re-export from centralized module
- Wire DEX page to use DexVMAPI (getStats, getPools, getMarkets) with
  demo data fallback when D-Chain RPC is unavailable
- Add B-Chain bridge API module (lib/api/bchain/) using BridgeVMAPI
  (getSignerSetInfo, getWaitlist) for signer set stats
- Update Bridge page to show live bridge signer count from B-Chain
- Fix stale E2E tests: use >= minimum thresholds instead of exact
  counts (block/tx counts grow over time), use describe blocks
2026-02-27 12:05:23 -08:00
zeekay 8bfc8f40bd feat: multi-tenant chain registry with hostname auto-detection
One image serves all chains — ChainSwitcher and NetworkSelector
auto-detect current chain/network from window.location.hostname.
Chain registry at configs/app/chainRegistry.ts defines all chains
across mainnet/testnet/devnet.
2026-02-27 11:33:08 -08:00
zeekay dc5479a2b1 feat: unified header bar with Lux Network branding
- Redesign TopBar as single unified header: logo + nav + controls
- Add NetworkSelector dropdown (Mainnet/Testnet/Devnet)
- Monochrome ChainSwitcher (kill blue panel)
- Connect wallet button via UserProfileDesktop in header
- Remove NavBar and SideBar (nav now in TopBar)
- Simplify HeaderDesktop to search bar only
2026-02-27 11:18:39 -08:00
zeekay 5fed458a21 feat: integrate luxnet SDK for P-chain API calls
Replace hand-rolled JSON-RPC fetch client with [email protected].0 SDK.
P-chain hooks now use PlatformVMAPI methods directly.
2026-02-27 10:55:58 -08:00
zeekay 2c4fcde2d2 feat: multichain explorer pages, chain switcher, indexer integration
- Network Overview homepage with P-chain stats and chain cards
- Chain detail page with validator info and indexer stats
- Chain switcher dropdown in top bar
- A-chain AI client with indexer API integration
- D-chain DEX data hook with live indexer fallback
- E2E tests for all 5 live explorer instances
- Test transaction sender script
- Remove verbose comments, section dividers, and console.log scaffolding
2026-02-27 10:46:56 -08:00
zeekay 3725171b32 feat: add AI compute dashboard and DEX orderbook pages
- A-Chain (AI): dashboard with models, providers, attestations tabs
- D-Chain (DEX): markets, orderbook, trades, pools tabs
- API hooks with mock data (ready for indexer integration)
- Navigation items and route registration for /ai and /dex
2026-02-26 14:05:43 -08:00
zeekay 8c1f6b438b feat: update all chain definitions to 14 primary network chains
Add D-Chain (DexVM), G-Chain (GraphVM), I-Chain (IdentityVM),
O-Chain (OracleVM), R-Chain (RelayVM) to match ~/work/lux/node
vms_allvms.go. Fix VM names: ThresholdVM, BridgeVM, KeyVM.
Update chain count from 9 to 14 across all pages.
2026-02-26 11:10:12 -08:00
zeekay 2e8885d7de feat: redesign homepage, add chain switcher and chain detail page
- Redesign NetworkOverview homepage with Blockscout Stats, LatestBlocks,
  and LatestTxs alongside P-chain network stats and chain cards
- Add ChainSwitcher dropdown to TopBar for switching between C-Chain,
  Zoo, Hanzo, SPC, and Pars explorer instances
- Create /chains/[slug] chain detail page with chain info, validators,
  subnet chains, and stats (modeled after Avalanche L1 Details)
- Make ChainsPage rows clickable with links to chain detail pages
- Register /chains/[slug] route in all metadata/analytics files
2026-02-26 09:57:59 -08:00
zeekay f6eb142582 feat: add Bridge page and Network Stats to Stats page
- Add /bridge page with cross-chain transfer route tracker
- Show bridge routes between Primary Network chains and L1 subnets
- Add Network Stats section (validators, chains, stake, uptime) to Stats page
- Add Bridge to navigation menu
- Register /bridge route in nextjs-routes, metadata, and mixpanel
2026-02-26 00:47:24 -08:00
zeekay 2ade6a7320 feat: native multi-platform Docker builds (amd64 + arm64)
Replace slow single-platform build with parallel native builds:
- amd64 on ubuntu-latest, arm64 on ubuntu-24.04-arm
- Registry-based caching per platform
- Multi-platform manifest merge
- Auto-deploy to DOKS on push to main
2026-02-26 00:11:22 -08:00
zeekay 3c8d48e0e0 feat: unified multi-chain explorer with Network Overview, Chains, and Validators pages
- Replace single-chain homepage with Network Overview showing P-chain stats,
  primary chains (C/P/X/A/B/Q/T/Z/K), and L1 subnet chains
- Add Chains directory page with Primary Network / L1-L2-L3 tabs
- Add Validators page with Dashboard, Validators list, and Delegators tabs
- Add P-chain API hooks (useCurrentValidators, useBlockchains, useSubnets)
- Apply monochrome theme: replace all blue/purple/cyan/teal with gray
- Add Geist Mono font support
- Add Chains and Validators to navigation sidebar
- Update route types, metadata, analytics, and cspell for new pages
2026-02-25 22:53:10 -08:00
zeekay 39897c9458 feat: unify settings and wallet into single user menu
Move settings from standalone TopBar gear icon into the user profile
dropdown. The menu always renders (for settings access) and includes
wallet connect/disconnect when blockchain interaction is enabled.

- Remove Settings component from TopBar
- Integrate SettingsColorTheme, SettingsIdentIcon, SettingsAddressFormat,
  SettingsScamTokens, SettingsLocalTime into UserWalletMenuContent
- UserProfileDesktop always renders (no null fallback)
- UserWalletButton shows profile icon + "Menu" when no wallet connected
- Mobile header also always shows user menu
- Optimize Dockerfile.lux dependency layer
2026-02-25 12:28:17 -08:00
zeekay 2f0a103ddb fix: use yarn registry mirror in Dockerfile for npm 403 workaround 2026-02-25 11:14:28 -08:00
zeekay 8c2a10a579 fix: add npm fetch retries to handle transient registry 403 errors 2026-02-25 11:09:27 -08:00
zeekay 069792ee93 fix: correct font name from 'Geist Sans' to 'Geist' and add SVG favicon
Google Fonts registers the font as 'Geist', not 'Geist Sans'. The CSS
font-family mismatch caused the font to never load, falling back to
system sans-serif. Also adds an SVG favicon with the triangle icon
(SVG favicons take priority over PNG/ICO in modern browsers).
2026-02-25 11:05:29 -08:00
zeekay 82213f6b7b fix: remove hardcoded branding, use config-driven chain name everywhere
- Fix TS error in safeFormats plugin (use any for dayjsClass parameter)
- Replace hardcoded "Blockscout" with config.chain.name in DeFiDropdown
- Replace hardcoded "LUX" SVG text with config.chain.name in LogoFallback
- Use config.chain.name in NetworkIcon fallback aria-label
- Delete unused lux-logo.tsx (dead code with hardcoded branding)
2026-02-25 11:01:28 -08:00
zeekay 0cddfbf1ab fix: prevent dayjs crash when @reown/appkit-common changes global locale
@reown/appkit-common's DateUtil sets the global dayjs locale to
'en-web3-modal' which lacks a formats property. The localizedFormat
plugin crashes with "Cannot read properties of undefined (reading
'replace')" when lowercase format tokens (lll, llll) are used on
a locale without formats. Add a safety plugin that ensures formats
are always present on whichever locale the dayjs instance uses.
2026-02-25 10:49:18 -08:00