Drops "subnet" from the P-chain surface, which is not our vocabulary:
useSubnets -> useNets (useSubnets.ts deleted)
PChainSubnet -> PChainNet
GetSubnetsResponse -> GetNetsResponse
One "subnet" deliberately survives — `subnetID` in lib/api/pchain/wire.spec.ts.
That is the UPSTREAM P-chain wire field, read through a raw
Record<string,string> cast, so renaming it would break response parsing. The
rule is about our own language, not about lying to the wire.
Also adds deploy/k8s/explore-fe/ingress-mainnet.yaml. explore.lux.network is
served by the Next.js deployment explore-fe-lux (ghcr.io/luxfi/explore), not
the Go `explorer` binary, which only backs api-explore.lux.network. This
replaces drift where the plain Ingress pointed explore.lux.network at
explorer:80 — the Go binary's embedded, stale build.
Two pre-commit gates had to be satisfied, both legitimate:
- eslint max-len: three className lines (BridgePage 230 chars, ChainRow 188 x2)
exceeded the 160 limit; wrapped.
- cspell: `platformvm` flagged unknown. It is the P-chain VM's actual name, so
it is added to cspell.jsonc `words` rather than renamed in code. (Note for
the next person: .cspell-words.txt is listed under ignorePaths — it is a file
excluded from checking, NOT the dictionary. Adding a word there does nothing.)
Verified: tsc --noEmit reports ZERO errors in every file this commit touches and
zero stale-symbol errors, so the rename resolves completely. The project's 223
pre-existing errors are all in untouched files and unchanged by this commit.
The Lux primary network is a family of VM-specialized chains (C=EVM, X=UTXO,
D=DEX, P=platform, + A/B/Q/T/Z/G/K/O/R/I/M), mirrored from node/node/vms.go.
- configs/app/primaryChains.ts: single source of truth (PRIMARY_VMS, getPrimaryVm,
per-VM `view`, hasBespokeView, chainsAwaitingBespokeView). Decomplects the two
lists that duplicated this — ChainsPage + ChainDetailPage now consume it
(ChainDetailPage drops ~110 lines of copy).
- D-Chain (DexVM) renders the DEX order-book UI (ui/dex/DexPage) via view:'dex',
not a generic block list. C-Chain=EVM core, P-Chain=platform/validators,
X-Chain + the custom VMs render the generic detail fallback (info + indexer DAG
stats + validators) — graceful, never blank. chainsAwaitingBespokeView() FLAGS
the backlog: X-Chain (UTXO) + the 11 custom VMs still need a bespoke view.
- These VMs are Lux-primary, so the primary-VM surfaces (Chains/DEX/Bridge/AI
Compute nav + /chains, /chains/[slug], /dex pages) gate on
isPrimaryNetworkExplorer(). ui/shared/PrimaryNetworkGuard backstops direct-URL
access so the VMs never leak onto a brand explorer (Hanzo/Zoo/Pars).
- Tests: configs/app/primaryChains.spec.ts (26 cases) — registry, per-VM view,
bespoke-view flag, and the lux-only visibility keystone. 38/38 green with the
existing chainRegistry.spec.ts.
12 cases over simulated request hosts: lux primary lists every L1 incl Osage;
hanzo/zoo/pars/osage are registered L2s, never the primary explorer (no
lux-primary / cross-L1 leak), switcher own-only; pars chainId 7070; keystone —
unregistered white-label hosts are never the primary explorer.
- isPrimaryNetworkExplorer(): require !isWhiteLabelMode() so unregistered
white-label hosts (explore.zoo.network, explore.pars.network) stop rendering
the Lux primary-network panels + cross-L1 list (NetworkOverview). Decomplects
'is this the primary explorer' from 'is the current chain EVM'.
- register explore.zoo.network/.ngo + explore.pars.network as their own L2
hostnames -> own-scoped chain/network switcher, brand parity with hanzo.
- add Osage L1 (mainnet 1872 / testnet 1871 / devnet 1873) + OSAGE_BRANDING so
the universal Lux explorer lists it.
- Pars chainId -> deployed truth (env + backend chains.yaml): mainnet
494949->7070, devnet 494951->7072.
- Add explore.hanzo.network / explore.hanzo.ai (+ test/dev) to the Hanzo
chainRegistry hostnames so isWhiteLabelMode()==false on those hosts →
HANZO_BRANDING (real geometric-H logo) resolves and the network/chain
selectors enable (the dropdown was empty + showed the generic triangle).
- Hanzo testnet chainId 36964 → 36962 (LP-018; was duplicated with devnet).
- TopBar is desktop-only (hidden lg:block); HeaderMobile already block lg:hidden
→ exactly one header per breakpoint (was a double header < lg).
ChainBranding gains a productName field (default "Explorer"). New helper
applyBrandEnvOverrides(b) layers NEXT_PUBLIC_BRAND_* env vars over the
bundled defaults so a deploy can rebrand any field — name, org, URLs,
logo SVG, favicon, product label — without rebuilding the bundle.
Operators set:
NEXT_PUBLIC_BRAND_NAME " Network"
NEXT_PUBLIC_BRAND_PRODUCT_NAME "Explorer"
NEXT_PUBLIC_BRAND_ORG_NAME " Labs"
NEXT_PUBLIC_BRAND_LOGO_CONTENT <inline svg>
...
to override; empty values fall through.
TopBar now reads chain.branding.productName instead of the hardcoded
"Lux Explorer" string. getCurrentChain() applies env overrides on every
read so a brand can be flipped at runtime via env / k8s ConfigMap.
The bundled LUX, ZOO, HANZO, SPC, PARS defaults stay as-is for OSS
shipping; the white-label "other" path keeps reading from
NEXT_PUBLIC_NETWORK_* (legacy keys) as well.
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
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".
- 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
- 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)
- 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()
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.
Add OIDC authentication support using hanzo.id as the identity
provider for Lux Explorer user accounts.
- Add 'oidc' auth provider type alongside existing auth0/dynamic
- AuthGuardOidc: redirect-based OIDC login flow with CSRF state
- pages/auth/callback: authorization code exchange, token storage
- useApiFetch: pass Bearer token for OIDC-authenticated API calls
- account feature config: support NEXT_PUBLIC_OIDC_SERVER_URL and
NEXT_PUBLIC_OIDC_CLIENT_ID environment variables
- .env.production: configure hanzo.id as default OIDC provider
* envs and feature setup
* home page layout
* cross-chain txs page
* cross-chain transfers page
* cross-chain transfers on tx page
* cross-chain messages on tx page
* cross-chain tx page
* cross-chain tx details token transfers
* stats and counters for lists
* migrate to new API version
* add swagger
* mobile lists
* placeholder views on address page
* tests
* fix adaptive tabs initial state when there is only one tab in the list
* tweaks
* bug fixes
* fix tests
* update screenshots
* migrate to new api version
* add chain label tooltip, copy button to txs in lists and same address highlight
* list views on address page
* fix tests
* fix links to current address in the list views
* update tooltips
* update tables layout
* review fixes
* fix spelling
* update screenshots
* update screenshot
* basic login button implementation
* refactoring and add dynamic auth button to the other pages
* connect wallet without authenticating an user
* login and logout user in blockscout account
* refactoring and RPC overrides
* authenticate user with connected wallet
* add ENS to profile button
* override evm chains and fix contract write with waas wallet
* disconnect wallet and fix docker build
* add dynamic imports to components that use web3 wallet packages
* refactor user profile directory
* clean up
* tweaks
* update pw ci script
* fix "connect wallet" button behavior
* handle linking email to profile with dynamic provider
* fix test
* async loading web3 hooks and remove dynamic loading from components that use them
* fix pw tests
* add account navigation in horizontal layout when auth provider is dynamic
* fix address verification modal
* review fixes
* spelling fixes
* essential dapps config: switch to concurrent request and and add worker termination
* fix rollbar error logging and enable it for server errors
* fix for tokens request on address page
* update generator script for multichain config
* fix hot contracts interval select
* update screenshot
* update screenshots
* pass chainId to trackTransaction for essential dapps
* fix vertical alignment in hot contracts table
* bump next.js to v15.5.10
---------
Co-authored-by: isstuev <[email protected]>
Co-authored-by: Max Alekseenko <[email protected]>
- Disable 'Blockscout' title suffix by default (NEXT_PUBLIC_PROMOTE_BLOCKSCOUT_IN_TITLE)
- Disable banner and text ads by default
- Update footer links to point to Lux Network resources
- Change GitHub links from blockscout to luxfi
* add global setting to change between local and utc time
* add control to change time format on detailed views
* tweaks
* adapt uptime graphs to work with utc time from settings
* fix tests
* add maxDiffPixels for SearchResults test
* fix test
* page layout
* add interval filter
* fix navigation
* value formatting and test
* fix: correct empty state message from 'pools' to 'hot contracts'
* update screenshots
* add disabled state to tag select and fix some bugs
* fix screenshot
* update select texts
* first part of transition
* second part of transition
* remove jest
* bump up node version and playwright version
* update all screenshots because of the new playwright version
* fix tests
* one more screenshot update
* fail the app start if multichain config or essential dapps config were not generated properly
* add timeouts for essential dapps and multichain config generators
* fix "add to wallet" button in address tokens table
* [skip ci] update docs
* fix tx tables when there are no fee and value columns
* add support for promoted multichain provider
* fixes
* change action button logic
* fix tests
* fix
* hide "add network" button for multichain
* shorten the amount of txs on multichain homepage
* change name formatting for multichain button
* add bright color variants and lg size for badges
* fix y-axis margin calculation for chart with custom tick formatter
* superchain bug fixes
* bump versions of react and nextjs
* update screenshot
* bump dappscout-iframe
---------
Co-authored-by: Max Alekseenko <[email protected]>
* refactor widgets on home page
* coming soon placeholder component
* top accounts page
* contract data
* address ERC-20 tokens list
* chain filter for address ERC-20 tokens
* token select for address detailed view
* address details fields
* tokens table
* stats widgets on home page
* chain indicators graph on the home page
* quick search
* search results all tab
* tabs and chain select on search results page
* search results mobile view
* add contract info to search and address details
* add text filter for tokens and search improvements
* load all results inside tab on search results page
* token balance info
* add support for domains in the full search
* Multichain explorer
Resolves#2989
* add envs validator for multichain
* add some tests
* fix search bar on search results page on mobile
* home stats fixes
* fix ts
* optimize amount of queries on address page
* add more contract info on address page
* add enter key hint to search input
* fix tests
* fix test
* update bg.primary css-variable on color theme change
* sitemap for multichain
* txs page: render first tab if blob tab is not available on the chain
* filter out in active chains from chain select on address page and user ops page
* add chain icon to advanced filter table
* fix tooltip on entity with shield
* fix ts
* show contract implementations
* fixes
* add chain icon to all lists
* refactor zetachain chains config type
* use chain id as primary option instead of chain slug
* refactor chain config type for multichain and essential dapps
* refactor chain icon and chain select
* rename chain-slug in chain_slug
* change default radius of chain icon and update screenshots for multichain tests
* change conditions for "isContract" and "isVerified"
* test fixes
* make shield optional for external chain entities
* add chain icon to approvals lists
* add stats page for multichain
* add chain postfix to chart .png and .csv assets name
* fix tests
* sync verified contracts language filter and fix loading state in the search results page
* fix sol2uml diagram and csv export
* regcred from helmfile for review
* link fixes
* fix state for unknown address
* fix incorrect chain in the context during spa transition to the same route on different chain
* add links to stats widgets
* add mixpanel to L2 demo values
* show message of on-demand contract verification
* fix screenshots
---------
Co-authored-by: Nick Zenchik <[email protected]>
* redesign "add chain" button
* fix wallet detection
* [skip ci] update default value for ENV
* fix tests
* return button to the footer and add source to mixpanel event
* regcred from helmfile for review
* [skip ci] remove wallets env from values for demo stand
* use react-query to cache detection result
* add cookie to hide button in the topbar
* add prefix to svg ids to fix rabby icon
* update screenshot
* remove unnecessary comment
---------
Co-authored-by: Nick Zenchik <[email protected]>