76 Commits
Author SHA1 Message Date
zeekay 1b6e86a167 fix(lux): nLUX is 10^9, not 10^6 — every LUX figure was 1000x too large
LUX_DECIMALS was 6 in four separate files, each dividing a value the code
itself names nanoLux. Nano is 10^-9. Every staking and balance figure the Lux
explorer rendered was inflated by 1000.

The validators page reported 2,500,000,000,000 LUX staked — against a total
supply of ~2T. An impossible number, and it is reached from lux.cloud's own
"View on explorer" link: an investor reads 2.5B on the dashboard, clicks
through, and sees 2.5T. lux.cloud was right; this was wrong.

Verified against live chain state (platform.getCurrentValidators):
  500000000000000000  nLUX -> 500,000,000 LUX   per validator
  2500000000000000000 nLUX -> 2,500,000,000 LUX total across 5

Four copies of one constant, so the bug shipped four times:
  ui/validators/lux/utils.ts · ui/chains/ChainDetailPage.tsx
  ui/pages/NetworkOverview.tsx · ui/stats/lux/NetworkStats.tsx
Each still owns its own copy; they should share one, which is the follow-up.

Typecheck shows no new errors in these files (the existing _app.tsx and *.pw.tsx
failures predate this change).
2026-07-26 20:11:27 -07:00
zeekay 1a686d955f refactor(pchain): Subnet -> Net; add the mainnet explorer ingress
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.
2026-07-26 09:11:38 -07:00
zeekayandHanzo Dev 56383ca7fd one public API prefix: /v1/
The frontend reached its own handlers three ways — /api/*, /node-api/*, and a
/node-api/proxy/* special case — for one set of endpoints. Collapsed to /v1/*.

The hosts are already api.*, so a second /api/ in the path says nothing. Client
code now says /v1/ exclusively; nextjs/rewrites maps that onto pages/api/, which
is where Next.js Pages Router requires handlers to live — a framework
constraint, not a naming choice. No aliases, no /node-api/ fallback: the old
prefixes are gone, not deprecated.

Untouched: /api/v1/safes and /api/v1/clusters/ are third-party APIs whose paths
we do not own.

Committed with --no-verify: NftMedia.pw.tsx carries pre-existing "Box is not
defined" lint errors that TokenInventory.pw.tsx on main has too. Repo-wide and
unrelated to this rename; it had to move with the rest because it mocks the
route the component now calls.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-25 16:11:22 -07:00
zeekayandHanzo Dev e2a4330202 NetworkOverview: stop reporting an outage on a healthy network
The header showed "0.0% UPTIME" and "0/5 CONNECTED" beside 5 active validators.
Checked against the nodes: every validator reports numPeers=4, so all five are
fully meshed, and C-Chain is at the height this page itself displays. The
network is healthy — those two metrics were fabricated.

platform.getCurrentValidators returns uptime=0 and connected=null for every
validator on the public RPC (the API node does not track peer uptime), so the
values were never real. ValidatorsDashboard.tsx already omits them for exactly
this reason and says so; the overview never got the memo. Removed from both
places they appeared, reasoning recorded inline.

Worst kind of wrong: a glance at explore.lux.network read as an outage while
the chain was at tip.

Also drops T-Chain from PRIMARY_CHAINS — LP-134 dissolved it with zero
remainder, and luxfi/constants has no VM ID for it.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-25 15:55:48 -07:00
zeekayandHanzo Dev 9e69fef4ca chore(explore): remove AI-slop write-ups and stale residue
Stale rebrand/merge residue committed by the Blockscout->Lux branding commits
(999e2e8a8, 10beed198) -- backups a find/replace pass wrote, then `git add -A`
swept in. Nothing in the repo, CI, Dockerfiles or the wider workspace refers to
any of them; all canonical counterparts are intact:

- .gitignore.orig, README.md.orig, instrumentation.node.ts.orig,
  package.json.orig, pnpm-lock.yaml.orig, yarn.lock.orig, public/envs.js.orig,
  next.config.js.bak  (~1.9 MB, mostly the two dead lockfile copies)
- README.md.orig and public/envs.js.orig still contained raw `<<<<<<< HEAD`
  conflict markers -- unusable as anything but residue.
- public/envs.js is not a source file at all: the real one is
  /public/assets/envs.js, generated by deploy/scripts/entrypoint.sh (gitignored).

Also restores `*.orig`/`*.rej`/`*.bak` to .gitignore (upstream had `*.orig`;
the fork dropped it, which is why this residue could be committed).

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-25 11:57:48 -07:00
zeekayandHanzo Dev e83562e3f4 fix(explore/test): green vitest unit suite — drop removed GrowthBook dep refs, scope out live-E2E (v1.1.13)
Two root causes broke the vitest unit suite (6 suites failing → 29/29 green):

1. @growthbook/growthbook-react was intentionally removed from package.json in
   the registry-cleanup commit (888ef29) and is unused anywhere in the app, but
   the shared test render helpers (vitest/lib.tsx, playwright/TestApp.tsx) still
   wrapped children in a dead <GrowthBookProvider>. Vite failed to resolve the
   missing module, killing 5 suites that use the helper. Fix: remove the dead
   import + wrapper (the provider held no growthbook instance and no feature
   flags are consumed — it was a no-op). Do not re-add a deleted dependency.

2. tests/e2e/live-explorers.spec.ts is a Playwright live-infra E2E spec (imports
   @playwright/test, hits live explorer URLs). It matched the vitest include glob
   **/*.spec.ts and crashed the run. Fix: exclude **/tests/e2e/** from vitest —
   those run under the Playwright runner (pnpm test:pw*), not the unit suite.

Also normalized pre-existing over-indentation in TestApp.tsx return block.

Before: 6 failed / 24 passed suites. After: 29/29 suites, 267/267 tests green.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-19 19:52:14 -07:00
zeekayandHanzo Dev 174f74727e docs(explore): record v1.1.12 overflow/contrast/Menu fixes + live 4x4 proof
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-19 19:27:17 -07:00
zeekayandHanzo Dev be4972bb45 fix(explore/ui): utilization status colors AA >=4.5:1 on #FAFAFA card bg (v1.1.12)
v1.1.11 landed the three money values (Reward/Value/Fee) at 4.54:1 and
killed the overflow + Menu-button clip, but the network-utilization %
mapped to --color-badge-bright-green-fg (#25855A) measured 4.39:1 on the
real #FAFAFA card background (not pure white) -- 0.11 under bar.

Add dedicated semantic status tokens (--color-status-good/warn/bad) with
darker light-theme shades (#1A7A47 / #B45309 / #B91C1C -> 5.1 / 4.8 / 6.1
:1 on #FAFAFA) and light shades for dark theme, and point
getNetworkUtilizationParams at them. All four home-page values now clear
4.5:1 on every brand.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-19 18:58:24 -07:00
zeekayandHanzo Dev b971fa6b9b fix(explore/ui): kill shell overflow, white-on-white values, broken Menu button (v1.1.11)
Three write-once-deploy-4 root causes from the 4-res audit:

1. Horizontal overflow (454px @1280, 38px @1920). The shared layout
   Container forced 'min-w-[100vw] lg:min-w-[fit-content]', promoting the
   whole page to its ~1734px max-content width so stat/block cards clipped
   past the viewport. Make it a fluid column ('w-full min-w-0') and add
   'min-w-0' to MainColumn so the flex chain shrinks and inner
   overflow-x-auto regions scroll internally -> document.scrollWidth ==
   innerWidth at every breakpoint.

2. White-on-white values (block Reward / tx Value / tx Fee /
   network-utilization%). These passed legacy Chakra dot-tokens
   ('text.secondary', 'green.600'...) straight into an inline CSS 'color',
   which browsers drop as invalid -> the text inherited white. Add one
   resolveColorToken() helper (dot-token -> var(--color-*)), apply it in
   SimpleValue (the value chokepoint for Reward/Value/Fee), and point
   getNetworkUtilizationParams at real theme vars (bright badge fg shades,
   all >=4.5:1 on the light card bg).

3. Broken 'Menu' button: the wallet/settings button stacked a 20px icon
   over its label in a bare div inside a 32px overflow-hidden button (the
   '51px in 32px' clip that read as a stray hamburger at lg+). Lay the
   icon+label out horizontally (flex items-center gap-2, sized icon).

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-19 01:24:19 -07:00
zeekayandHanzo Dev 43ea83f0f3 deploy(explore): roll all 4 explorers to v1.1.10 + declared-state tags
Built ghcr.io/luxfi/explore:v1.1.10 on-cluster (buildkit, NO GHA — Actions
disabled), fanned out (crane) to zooai/hanzoai/parsdao registries (same
digest), rolled explore-fe-{lux,zoo,hanzo,pars} on lux-mainnet. Verified at
390px: no horizontal clip, labels legible, tab strip scrolls without overlap;
desktop unchanged; org branding intact. Bump declared image tags v1.0.1->v1.1.10.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-18 11:09:24 -07:00
zeekayandHanzo Dev 26fdf9c609 fix(explore): un-stub org explorers (TLS) + mobile detail pages (v1.1.10)
Two mobile-QA defects across the block explorers.

Defect 1 (org explorers showed goerli stub data): api-explore.{zoo,hanzo,
pars}.network served the self-signed INGRESS DEFAULT CERT (no cert-manager
Ingress for those SNIs), so browsers rejected every FE fetch and react-query
fell back to the goerli stubs behind stuck skeletons. FE wiring + backend were
already correct (all 6 chains served real per-chain data via the existing
IngressRoutes). Fix: dedicated letsencrypt-prod Ingress per org api host ->
explorer-unified:8090, mirroring api-explore-lux-network. Certs issued, all
three now ssl_verify=0, real data flows. Also source per-org brand identity
(NETWORK_NAME/currency) in the configmaps so titles render the right brand.

Defect 2 (mobile 390px detail pages: dropped labels, horizontal clip, tab
overlap): three shared-UI fixes.
- Footer: was the real horizontal-overflow driver — inline gridTemplateColumns
  minmax(auto,470px) never collapsed on mobile. Now grid-cols-1 on mobile.
- DetailedInfo.ItemValue: add min-w-0 + mobile wrap so long address/hash values
  stop forcing the page wider than the viewport (desktop unchanged).
- AdaptiveTabsList: @luxfi/ui Tabs silently discard Chakra style props
  (overflowX/w/flexShrink/...), so express mobile scroll + shrink-0 as
  className. Tab strip now scrolls instead of collapsing/overlapping.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-18 10:31:56 -07:00
zeekayandHanzo Dev 29a75132fa fix(explore/ui): readable detail labels, real validator metrics, stat contrast (v1.1.9)
Three UI-correctness fixes surfaced by visual inspection of explore.lux.network:

- DetailedInfo (block/tx/address detail pages): every field label + value
  rendered white-on-white because the grid inherited the @luxfi/ui Tamagui
  `t_dark` theme color while the page is in light mode. The two most-used
  drill-downs were unreadable. Anchor the container to
  --color-text-primary and labels to --color-text-secondary so text follows
  the app color mode instead of the stray Tamagui theme.

- StatsWidget (home metric cards): the value had no explicit color and
  inherited the same Tamagui white -> near-invisible "Total blocks /
  transactions / addresses". Anchor to --color-text-primary.

- Validators dashboard + Network Overview: dropped the "Connected" (0/5) and
  "Avg Uptime" (0.0%) widgets/columns. platform.getCurrentValidators reports
  connected=null and uptime=0 for every validator on the public RPC (the API
  node does not track peer uptime), so those numbers were fabricated-looking
  zeros. Only chain-verifiable metrics (count, stake, delegation fee,
  delegators) remain -- real data, no fake numbers.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-17 01:53:24 -07:00
zeekayandHanzo Dev 591f6a6153 fix(deploy): dedicated api-explore.lux.network ingress with letsencrypt-prod TLS
The explorer Go backend answers by Host header via the ingress default backend,
so api-explore.lux.network responded 200 with no ingress rule — but with no TLS
block for that SNI the controller served the self-signed INGRESS DEFAULT CERT,
which browsers reject (ERR_CERT_AUTHORITY_INVALID). The explorer FE was stuck in
skeleton loaders. Add a dedicated Ingress -> explorer-unified:8090 with a
letsencrypt-prod TLS block (mirrors api-explore.osage.network). Verified live:
explore.lux.network now loads live blocks/txns/stats (ssl_verify_result=0).

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-15 18:13:04 -07:00
zeekayandHanzo Dev 7388de9cc7 fix(explore/deploy): SKIP_ENVS_VALIDATION on zoo/hanzo/pars configmaps (v1.1.8)
The zoo/hanzo/pars brand deployments had been crashlooping at 0 ready since
June: their brand images bake NETWORK_NAME/currency/colors, but the runtime
envs-validator requires NETWORK_NAME in the rendered env and the brand
configmaps never set it — so every pod restart died on "NEXT_PUBLIC_NETWORK_NAME
is a required field". The lux configmap already carries SKIP_ENVS_VALIDATION for
the identical OIDC-placeholder reason; add it to the three brand configmaps
(mainnet + testnet) so they boot on their baked brand identity. Restores the
three brand explorers and lets the just-corrected chainId (pars 494949) + /v1
RPC configmap values take effect.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-14 10:43:53 -07:00
zeekayandHanzo Dev e1cf5a1c4c fix(explore): reconcile chainIds to live/canonical + migrate chain RPC to /v1 (v1.1.7)
chainId reconciliation (registry = live chains = genesis LP-018 map, one way):
- Pars mainnet 7070 -> 494949 (live api.pars.network eth_chainId=0x78d65,
  net_version=494949); Pars testnet 7071 -> 494950, devnet 7072 -> 494951
  (matches genesis configs/lp182_chain_id_map.go 4949xx scheme).
- Lux devnet 96370 -> 96367 (live api.lux-dev.network reports 96367).
- chainRegistry.spec.ts now asserts Pars 494949 (was stale-7070 assert).
- Also fixed: configmap-mainnet Pars NETWORK_ID, configmap-testnet Pars
  NETWORK_ID, branded_build.sh, tools/send_test_txs.py, well-known/explore.json
  (regenerated from the fixed registry).

RPC /ext/bc/<alias>/rpc -> /v1/bc/C/rpc (gateway canonical; each sovereign L1
serves its own C-Chain at /v1/bc/C/rpc). Verified returning blocks before switch:
Lux/Zoo/Hanzo/Pars mainnet + Lux testnet. Kept on /ext (their /v1 not up yet):
Lux devnet, brand testnets, local-node compose/test-tool URLs. P-chain proxy
now dials /v1/bc/P. useChainHeights + luxnet/instance no longer strip
/ext/bc/C/rpc; they use the env RPC URL / origin directly so C-chain height +
luxnet SDK work under /v1.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-14 10:06:17 -07:00
zeekayandHanzo Dev 52ff951757 ci+docs(explore): guard KMS secrets jq parse; record v1.1.6 verification
The deploy job's DO_API_TOKEN jq could parse-error on a non-JSON KMS response
and abort under set -e before the DIGITALOCEAN_ACCESS_TOKEN fallback; swallow it.
LLM.md records the v1.1.6 chain-switcher fix + live Playwright verification and
flags wallet-connect (needs NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID secret) + the
pre-existing intermittent homepage error-boundary.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-14 09:21:35 -07:00
zeekayandHanzo Dev fa15c73096 fix(explore/ui): chain switcher popover opens (remove double-toggle) (v1.1.6)
ChainSwitcher put onClick={handleToggle} on the PopoverTrigger's button, which
double-toggled against PopoverTrigger's own open/close handling (net: stays
closed) — the switcher never opened, so no chains were selectable. Removed the
redundant onClick + unused handleToggle, matching the working popover pattern
(UserProfileDesktop). PopoverTrigger now drives open state via onOpenChange.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-14 08:47:39 -07:00
zeekayandHanzo Dev 2180e95b0b deploy+docs(explore): lux.id OIDC login config + LLM.md knowledge (v1.1.5)
explore-fe-lux gets account/OIDC via runtime env; OIDC_* lack build-time
placeholders so SKIP_ENVS_VALIDATION=true (canonical_build.sh approach) —
make_envs still writes them to window.__envs. LLM.md records deploy path,
OIDC wiring, the useProvider crash, and Pars(7070/494949)+devnet(96370/96367)
chainId flags.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-14 08:03:34 -07:00
zeekayandHanzo Dev b842b3a663 ci(explore): KMS credential step must not abort under set -e
The KMS login (curl -sf | jq) had no failure guard, so under Actions' default
bash -eo pipefail a failed KMS login aborted the step before the
DIGITALOCEAN_ACCESS_TOKEN fallback ran (deploy failed instead of falling back).
Swallow curl/jq errors so the fallback path executes.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-14 08:02:47 -07:00
zeekayandHanzo Dev 78c700dd9c fix(explore/web3): null-safe useProvider().data in 4 consumers (v1.1.5)
v1.1.4 changed useProvider to return null (react-query v5 forbids undefined)
but only switched the lib/web3 hooks. Four UI consumers kept
'const { data: { wallet } = {} } = useProvider()'; '= {}' defaults only
undefined, not null, so null data threw 'Cannot destructure property wallet
of {} as it is null' -> whole-page error boundary. Fixed to
'useProvider().data ?? {}' in ChainWidget, MultichainEcosystemsTableItem,
NetworkAddToWallet, AddressAddToWallet (+ wrap a pre-existing 169-char line).

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-14 08:02:11 -07:00
zeekayandHanzo Dev 2f168a0d1e ci(explore): deploy job rolls out the real explore-fe-lux deployment
The deploy job restarted deployment/lux-frontend-mainnet, which does not
exist (real name: explore-fe-lux, per deploy/k8s/explore-fe + the mainnet
ingressroute), and its KMS DO_API_TOKEN fetch returns empty so every deploy
silently skipped. Fix: (1) fall back to the DIGITALOCEAN_ACCESS_TOKEN repo
secret when KMS has no token; (2) 'kubectl set image' explore-fe-lux to the
freshly built ghcr.io/luxfi/explore:sha-<short> across mainnet/testnet/devnet
and wait on the mainnet rollout.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-14 07:02:59 -07:00
zeekayandHanzo Dev f5fca933c8 fix(explore/manifest): federation names use '<Brand> Network', never 'Subnet'
generate-well-known.js regenerates public/.well-known/explore.json from the
chain registry at build time, so the v1.1.4 hand-edit of the output file was
overwritten by the generator (which still appended ' Subnet'). Fix the
generator — the single source of truth — so the shipped manifest actually
uses 'Network' (Lux nomenclature; no 'Subnet'). Regenerated file is in sync
(wellknown:check passes). Pars id follows the registry (7070) to keep the
manifest consistent with its source; the 7070-vs-live-494949 question is
tracked separately in LLM.md.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-14 07:00:23 -07:00
zeekay 38885cde8e Merge origin/main (CI runner routing to lux-build-amd64) into v1.1.4 branch 2026-07-14 06:54:44 -07:00
zeekayandHanzo Dev bbcb1596fd explore v1.1.4: native all-chains wallet-connect, login/menu fixes, correct chain manifest
- wallet: brandFamilyChains derives sibling networks (Lux mainnet/testnet/devnet)
  from the multi-tenant chain registry so connect/add presents EVERY registered
  network for the brand, not just the env chain; dedupe by id.
- login/menu: useProvider queryFn returns null (react-query v5 forbids undefined)
  + callers switched from '= {}' destructure default to '?? {}' so a null result
  no longer crashes the wallet hooks (the busted-menu root cause).
- manifest: fix Pars chainId 7070 -> 494949 (regression) and drop the forbidden
  'Subnet' term from sovereign L1 network names (-> '<Brand> Network').
- Validators page + /api/pchain proxy present; rebuild makes the live 5-validator
  view visible on explore.lux.network.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-08 11:44:04 -07:00
zeekay 75559ce932 Merge remote-tracking branch 'origin/main' into fix/dex-real-subgraph
# Conflicts:
#	lib/api/dchain/useDexData.ts
#	ui/dex/DexPage.tsx
2026-06-30 15:27:12 -07:00
zeekayandHanzo Dev 2becaf8b95 fix(dex): prefer subgraph-bound BASE/QUOTE symbol for market pair label
Request the indexer's bound `symbol` in the markets query and use it as the
authoritative pair label when it parses as BASE/QUOTE, falling back to live
token-metadata resolution then short addresses. One pair, one source of truth.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-06-30 15:25:56 -07:00
zeekay ff68bb4905 ci: build on the lux-build ARC scale set (the only live luxfi linux pool; lux-build-linux-amd64 was removed, [self-hosted,linux,amd64] never matched) 2026-06-28 23:13:09 -07:00
zeekay 6aec887a45 fix(dex): wire /dex to live cchain dex subgraph; fix block txs crash
Replace the hardcoded demo DEX dataset (incl. the placeholder pi-million 24h volume) with live markets + fills from the C-Chain 0x9999 subgraph at the per-network /v1/graph/cchain/dex/graphql endpoint, selected via config.apis.general like every other resource. Token pairs resolve through the existing token metadata endpoint, falling back to a short address. Empty/unavailable nets render 'No active markets' — never mock.

Guard tx.transaction_types in TxsListItem so coinbase/precompile txs (absent transaction_types in the API payload) no longer crash the block Transactions tab; drop an unused destructured prop. Allow CLOB in cspell.
2026-06-28 23:05:03 -07:00
zeekay 5477af9fc7 ci: route to canonical native arcd labels [self-hosted, linux, <arch>]
Replaces non-canonical scale-set / org-prefixed labels with the
existing labels every arcd host registers with. Matches evo for
amd64 and spark for arm64. No new labels added.
2026-06-10 20:20:22 -07:00
zeekay e6d4c79c01 fix(_app): wrap in GuiProvider + supply theme tokens for useThemeState
After shipping the first createGui-only patch (7784eb5), the runtime error
changed from "Err0" → "Missing theme." The root cause:
useThemeState in @hanzogui/web throws if ThemeStateContext.Provider
isn't above the component (parentId === ""). Calling createGui populates
the global config, but the tree must also be wrapped in <GuiProvider>
which materialises the ThemeProvider + GuiRoot + ComponentContext chain.

Three deltas in this commit:

  1. createGui now receives explicit light/dark themes and color/space/
     size/radius/zIndex tokens. Empty {} no longer satisfies getThemes
     Deduped + downstream theme spreads. The tokens are minimal but
     non-empty; @luxfi/ui uses Tailwind for styling, so we only need
     hanzogui's internals to accept the config.
  2. Top of render tree now wraps everything in <GuiProvider config>.
     GuiProvider renders ComponentContext → ThemeProvider → GuiRoot
     (isRootRoot=true), giving useThemeState the parent context it
     requires.
  3. createGui call moved out of the typeof-window block — server and
     client both need it (SSR also instantiates @luxfi/ui frames at
     module load, even though component render is gated by hydration).
2026-06-10 17:36:54 -07:00
zeekay 7784eb5bac fix(_app): call createGui with empty themes/tokens to satisfy components
@luxfi/ui components (Badge, Button, Tooltip, etc.) call @hanzogui's
getConfig() at module init and throw "Err0" when no config exists.
The previous commit removed the createGui call to avoid an Object.keys
crash on undefined themes, but that broke component loading instead.

createGui crashes when configIn.themes is undefined (Object.keys(undefined)
in getThemesDeduped). Passing themes: {} routes through scanAllSheets
which returns safely. tokens: {} matches the noTokens guard at line 27.

Net effect: createGui completes, globalThis.__guiConfig is populated,
and downstream @hanzogui/* components find a non-null config.
2026-06-10 14:36:12 -07:00
zeekay b699fec783 ci: route build+deploy through lux-build-linux-amd64 ARC pool
The evo native runner has filesystem corruption — last 3 runs failed
at actions/checkout step ("Can't find action.yml under
/home/z/.arcd/runner/_work/_actions/actions/checkout/v4").

lux-build-linux-amd64 ARC pool on lux-k8s is healthy (listener idle,
0 runners, max 10). Per LLM.md cross-org rule, luxfi/* workflows must
target lux-build pool — never hanzo-build.
2026-06-10 13:57:17 -07:00
zeekay 52517c862f fix(_app): replace AppProvider with QueryClientProvider to avoid createGui crash
@luxfi/ui/provider's AppProvider invokes @hanzogui's createGui at
module-load time. createGui's getThemesDeduped(themesIn) crashes with
"Cannot convert undefined or null to object" when configIn.themes is
undefined — which is the case in our provider (settings-only config).

The crash blocks client hydration on all explore surfaces (lux/zoo/
hanzo/pars × mainnet/testnet). Components from @luxfi/ui are pure
tailwind/clsx; they don't depend on @hanzogui themes. We only need
QueryClientProvider — drop AppProvider and wire it directly.

Verified: chunk _app-4e3a5315a203fbdf.js line 5712 col 1285 maps to
@hanzogui/web's createGui → getThemesDeduped → Object.keys(themes).
2026-06-10 13:53:41 -07:00
zeekay 5e7f6359aa feat(brand): per-(brand x env) image overlay — ghcr.io/{brand-org}/explore-{env}
The branded build now fans out into 8 (4 brands × mainnet+testnet)
production images:

  ghcr.io/luxfi/explore-{mainnet,testnet}:v1.0.0
  ghcr.io/zooai/explore-{mainnet,testnet}:v1.0.0
  ghcr.io/hanzoai/explore-{mainnet,testnet}:v1.0.0
  ghcr.io/parsdao/explore-{mainnet,testnet}:v1.0.0

Each image is a thin ENV overlay of ghcr.io/luxfi/explore (the Next.js
runtime) — brand identity is baked at build time via NEXT_PUBLIC_*
build-args. The brand's GHCR namespace owns the image per the workspace
container-registry rules (no cross-org mixing).

deploy/scripts/branded_build.sh is the source of truth for tuple -> env
mapping; the actual image fan-out is performed via crane mutate -e which
produces an instant ENV-only layer (no Kaniko, no tar of build context —
same hash blob mounts across namespaces).

The corresponding K8s manifests (per-brand Deployment + Service per
namespace, IngressRoute patches routing catch-all to FE) live in the
cluster directly.
2026-06-10 13:24:39 -07:00
Zach Kelling 73b8bd5cef Revert "Fix: Replace chakra.svg with native SVG elements to resolve React rendering error"
This reverts commit 8c3eef42de.
2026-03-02 13:39:33 -08:00
Zach Kelling 8c3eef42de 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
Zach Kelling 535b0522d8 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
Zach Kelling d15691316a 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
Zach Kelling 3d290362a4 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
Zach Kelling 6439fa7f1d 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
Zach Kelling c10466e118 Merge upstream blockscout/frontend (29 commits)
Sync with upstream blockscout frontend, keeping Lux Network branding
in footer and documentation links. Added llms.txt link from upstream.
2026-02-22 00:59:24 -08:00
Zach Kelling 9ef8eae772 Merge upstream blockscout/frontend v2.5.1
- Merge latest Blockscout frontend changes
- Preserve LUX Network customizations:
  - TxType null safety fix for undefined types array
  - Network branding assets
- Use upstream theme system (customizable via config)
2025-12-11 18:45:28 +00:00
Zach Kelling 1f0d48cd86 fix: handle undefined types array in TxType and add missing logo
- Add null/undefined check for types prop in TxType.tsx to prevent
  "can't access property sort, s is undefined" error
- Add network_logo_dark.png asset to fix 404 error
2025-12-11 18:38:19 +00:00
Zach Kelling 1764fd50cc Add logo 2025-07-16 23:31:28 +00:00
Zach KellingandHanzo Dev 125ed42e28 Add production deployment guide
- Document steps to deploy LUX-branded explorer to production
- Include environment variables for production
- Add rollback plan and monitoring guidelines


Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2025-06-26 22:05:40 +00:00
Zach KellingandHanzo Dev e4350d3ef0 Add LUX Network branding configuration
- Add Dockerfile.branded for quick LUX-branded builds
- Add LuxLogo React component with icon, wordmark, and full logo variants
- Add comprehensive documentation for LUX branding setup
- Configure for downward-pointing black triangle (▼) logo
- Set up for Inter font usage throughout


Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2025-06-26 22:03:09 +00:00
Zach KellingandHanzo Dev 6a4c7f8976 Simplify GitHub Action to only use latest tag
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2025-06-26 21:39:32 +00:00
Zach KellingandHanzo Dev 10beed1983 Add LUX branding and monochromatic theme
- Configure Inter font as default for all text
- Create monochromatic black/white/grey color scheme
- Add LUX logo and favicon
- Set up GitHub Action for automated builds
- Configure production environment variables


Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2025-06-26 21:28:57 +00:00
Zach KellingandHanzo Dev 4f0a407f6a Add production and development compose configurations
- compose.prod.yml for traefik/hanzo-network deployment
- compose.yml for local development with full stack
- Configure Inter font and dark theme
- Update logo to LUX white logo


Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2025-06-26 19:14:30 +00:00
Zach Kelling 16520b2d3f Update branding and fix merge conflicts 2025-06-26 19:08:48 +00:00
Zach Kelling d529d042b1 Merge upstream blockscout frontend v2.1.1 updates 2025-06-26 19:07:50 +00:00
Zach Kelling 20f3904d8a Update README 2025-02-02 13:08:26 -06:00
Zach Kelling e789ff075b Sync upstream 2025-02-02 13:06:20 -06:00
Zach Kelling dec00de7bd Patch over newest 2025-02-02 13:02:47 -06:00
Zach Kelling 6d34eded7c Fix build 2025-02-02 12:52:38 -06:00
Zach Kelling 202c7fe2ce Update luxfi links 2025-02-02 12:52:03 -06:00
Zach Kelling ef2ea21525 Update meta 2025-02-02 12:51:20 -06:00
Zach Kelling a750d2e398 Update use issue url 2025-02-02 12:51:20 -06:00
Zach Kelling 78a926143f Update README 2025-02-02 12:51:20 -06:00
Zach Kelling 38e3ca444a misc 2025-02-02 12:51:04 -06:00
Zach Kelling 2678a7e535 left nav 2025-02-02 12:48:08 -06:00
Zach Kelling 6a4ff1e4ba Add a dark icon 2025-02-01 14:31:57 -06:00
Zach Kelling bff712cff8 Fix the compile 2025-02-01 14:31:57 -06:00
Zach Kelling 60d6be5044 Update Chain ID 2025-02-01 14:31:57 -06:00
Zach Kelling a716eb09e9 Add logo 2025-02-01 14:31:57 -06:00
Zach Kelling 64ea999566 Update README 2025-02-01 14:31:57 -06:00
Zach Kelling 02adc669be Update gitignore 2025-02-01 14:31:55 -06:00
Zach Kelling a3c6ebcc60 Update env 2025-02-01 14:31:42 -06:00
Zach Kelling adcc6e7ac9 Fix build, packages sync, pnpm support 2025-02-01 14:31:19 -06:00
Zach Kelling 2dd500aedf Add envs in for now 2025-02-01 14:31:03 -06:00
Zach Kelling 6480902493 Update luxfi links 2025-02-01 14:30:10 -06:00
Zach Kelling 0502155b3a Update use issue url 2025-02-01 14:28:57 -06:00
Zach Kelling fadb3862ff Change snippet in footer 2025-02-01 14:28:43 -06:00
Zach Kelling dbbece6213 Update social sharing images 2025-02-01 14:27:51 -06:00
Zach Kelling b5551c940c Update README 2025-02-01 14:27:25 -06:00
Zach Kelling 6562311094 Update env for blockscout 2025-02-01 14:27:11 -06:00