6235 Commits
Author SHA1 Message Date
zeekay 04786023fc docs(brand): add hero banner 2026-06-28 20:35:55 -07:00
zeekay 862705b65a chore(brand): dynamic hero banner 2026-06-28 20:35:54 -07:00
zeekayandGitHub 02eb92a6c1 Merge pull request #7 from luxfi/fix/explore-chain-visibility
fix(explore): enforce chain-visibility rule — lux=universal, hanzo/zoo/pars=own-only
2026-06-28 22:09:45 +00:00
zeekay eac4772aab feat(explore/primary-vms): handle all 10 Lux-primary VM types + route D-Chain to the DEX UI
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.
2026-06-28 15:08:34 -07:00
zeekay 72aa6a2ed4 test(explore/registry): prove chain-visibility rule (lux=all, brands=own-only)
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.
2026-06-28 14:40:11 -07:00
zeekay 4b0fd56069 fix(explore/registry): enforce chain-visibility rule — lux=all, brands=own-only
- 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.
2026-06-28 14:32:50 -07:00
zeekay 507a7da852 fix(realtime): swap Phoenix WebSocket transport for backend SSE
The FE connected realtime via Phoenix Channels (wss .../socket/v2), but the
Go backend serves no Phoenix endpoint — its realtime is SSE at
/v1/base/realtime (envelope {event,chain,data}). Result: repeating ws 404 ->
'Live updates temporarily delayed'.

lib/socket/sse.ts reimplements the slice of the Phoenix Socket/Channel API the
27 realtime consumers use, backed by one EventSource, behind the existing
SocketProvider/useSocketChannel/useSocketMessage seam — no consumer changes.
Envelope routes via an optional topic field or a hub-channel translation table
(blocks -> blocks:new_block/new_block today). CT harness becomes a tiny SSE
server with the same signatures. 12 vitest cases cover it.

Frontend-only; chain/indexer untouched. Data freshness remains gated on the
separate C-Chain-rollback/indexer-reorg owner items.
2026-06-28 09:01:10 -07:00
zeekay 24a6698c13 fix(explore/validators): render real P-chain data in light mode + brand currency symbol
The /validators view fetched real validators (5, 2.5e18 weight) but rendered
white-on-white in light mode — data present in DOM, invisible to users. Set
text-[var(--color-text-primary)] on each of the three lux validator component
roots so all text inherits the theme-flipping color token. Also replace the
hardcoded "LUX" stake unit with config.chain.currency.symbol (AI on Hanzo),
matching NetworkStats. No decimals change (6dp is the codebase convention,
consistent with P-chain getMinStake).
2026-06-24 05:16:12 -07:00
zooqueen 67bbfef7b0 fix(explore/stats): gate stats:lines query on stats feature flag
When no stats microservice is configured (config.features.stats.isEnabled
false), don't fire the stats:lines request that can only fail — the Stats page
already renders the live Network Overview + an honest 'being indexed' note.
Avoids a wasted erroring query on every Stats page load.
2026-06-23 21:10:33 -07:00
zooqueen 36e0db0b88 fix(explore): real validators + honest-empty stats/DEX + dropdown clip
Investor-grade data, no fabricated placeholders:

- pages/api/pchain.ts: derive node origin via new URL().origin instead of a
  regex that only stripped /ext/bc/C/rpc. Non-C-chain brands (hanzo:
  /ext/bc/hanzo/rpc) built a wrong URL -> HTML 404 -> JSON parse crash, so
  Validators/Total Stake/Connected/Uptime all showed 0/-. Now the P-chain
  proxy resolves correctly and the real validator set + stake render. Parse
  upstream defensively with a clear error instead of an opaque message.

- lib/api/dchain/useDexData.ts: delete all hardcoded DEMO_* markets/orders/
  trades/pools/overview. Return only real D-Chain (DexVM) data or honest-empty.
- ui/dex/DexPage.tsx: honest empty/error states per tab (no fake rows).

- stubs/stats.ts: neutralize STATS_COUNTER (title empty, value 0) so the
  'Placeholder Counter 9.074M' stub can never surface as real data.
- ui/pages/Stats.tsx: gate indexer-backed counters/charts on
  config.features.stats.isEnabled; always show the live chain-sourced Network
  Overview, with an honest 'being indexed' note when no stats microservice.

- ui/snippets/navigation/horizontal/NavLinkGroup.tsx: popover Content defaulted
  to overflow-hidden + tight py, clipping the last nav item (Verified
  Contracts). Override to overflow-visible with padding; bottom-start placement.
2026-06-23 21:06:19 -07:00
zooqueen 436f9522ff fix(oidc): brand-correct sign-in label from OIDC host (hanzo.id on Hanzo build) instead of hard-coded 'Lux ID' 2026-06-23 21:05:45 -07:00
zooqueen d0c277a00f docs(oidc): clarify login redirects to configured OIDC server (hanzo.id for Hanzo build), not hard-coded lux.id 2026-06-23 21:00:13 -07:00
zooqueen 401448639f docs(LLM): record multi-brand hostname-driven header logo + kaniko build/deploy (v1.0.10)
The header logo is resolved by request Host via chainRegistry getCurrentChain()
-> branding.logoContent (real @hanzo blocky-H for hanzo.network; no hardcoded
triangle). Documents the 3 render spots, the L1/L2/L3 vm gating, the on-cluster
kaniko fan-out build (no GitHub builders), and the lux-mainnet explore-fe deploy
+ universe declared state.
2026-06-23 17:31:25 -07:00
zooqueen cd9a51c3bd fix(brand): mobile NetworkIcon/NetworkLogo render chain.branding.logoContent (the per-brand mark) instead of image-URL→triangle fallback 2026-06-23 16:13:49 -07:00
zooqueen 360f793311 fix(tx): guard tx.fee?.value — luxfi indexer returns fee:null; FE must render fee-less txs without crashing (homepage Latest Txs error boundary) 2026-06-23 13:17:30 -07:00
zooqueen 7b293e3238 fix(deps): pin @hanzogui to a single instance (3.0.2) — duplicate core/popper produced two React contexts so PopperAnchor read an empty default and crashed on refs.setReference 2026-06-23 12:23:42 -07:00
zooqueen 9b057d2af9 fix(fe): override @hanzogui/floating 3.0.1→3.0.6 (React-19 setReference crash)
The Tooltip/Popover (@luxfi/ui → @hanzogui/tooltip → @hanzogui/[email protected],
hard-pinned) crashed with 'Cannot read properties of undefined (reading
setReference)' (×189, every row) under React 19 → Next error boundary 500 once
real indexer data renders. Force the fixed 3.0.6 patch via pnpm override.
2026-06-23 10:57:51 -07:00
zooqueen c605b213cd fix(explorer): brand explorers show ONLY their own chain; primary-network panels are Lux-only
isPrimaryNetworkExplorer() (getCurrentChain().vm==='EVM') gates the homepage's
validator metrics strip + the Chain-Health grid (15 primary-network chains +
cross-L1 list). Lux primary explorer (explore.lux.network +test/+dev) shows them
all; brand L2 explorers (Hanzo/Zoo/SPC/Pars) show only Hero + Stats + their own
latest blocks/txns. (Blockscout references already brand-driven via NETWORK_NAME.)
2026-06-23 08:39:07 -07:00
zooqueen a0dc379690 fix(hanzo): register explore.hanzo.network hosts + real Hanzo brand; testnet chainId 36962; single header per breakpoint
- 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).
2026-06-22 22:22:14 -07:00
zeekay 11d35f9e20 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 e02ea37851 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 95b2e563a4 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 f2dd4b7839 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 debd578aac 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 3d1120861a 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
zooqueenandHanzo Dev 46a24ae7a9 ci: target native arcd runners (evo/spark)
Replace retired self-hosted labels with native host arcd daemons:
evo (linux/amd64), spark (linux/arm64).

Co-authored-by: Hanzo Dev <[email protected]>
2026-06-07 15:58:02 -07:00
zeekay 1ff5ac4bf3 brand: audit, rip non-lux references, add .well-known/explore.json
Per the no-crossover rule, explorer source contains only Lux brand data.
Per-chain identity (subnet logo, chain name) preserved as network metadata.

Removed:
- .env.example.{hanzo,zoo,pars} — non-Lux brand build recipes
- Dockerfile.liquidity — regulated US securities brand, must not appear in OSS
- Third-party-domain hostnames from chainRegistry.ts (explore.zoo.ngo etc.)
- Non-Lux hostname suffixes from lib/white-label.ts (.hanzo.ai, .zoo.network, etc.)
- "" mention from lib/requestHost.ts comment

Kept (chain identity on Lux primary network):
- ZOO/HANZO/SPC/PARS_BRANDING constants in chainRegistry.ts
- explore-{org}.lux.network hostnames (Lux-served subnet explorers)
- DeFi terms ( Provider, add) — generic finance vocab

Added:
- public/.well-known/explore.json — federation manifest
- scripts/generate-well-known.js — regenerates manifest from chain registry
- Wired into npm build / build:next scripts
- BRAND-AUDIT.md — survey + decisions
2026-05-29 14:30:23 -07:00
zeekay a29d448964 chore(toolkit): migrate yarn → pnpm (packageManager: [email protected]) 2026-05-25 23:34:16 -07:00
zeekay 701bab090b chore: drop stale yarn.lock (project pinned to [email protected]) 2026-05-25 23:14:04 -07:00
zeekay 81a00208a8 decomplect: drop '' from spell-check dictionaries
OSS lux/explore should not carry tenant-specific brand strings.
2026-05-21 10:47:22 -07:00
zeekay 815de9c4ce ci+docs: update build-lux workflow + README 2026-05-20 16:24:35 -07:00
zeekay 8b8224cff8 ci: fix runner labels (hanzo-build pool)
Imaginary runner label `lux-build-linux-amd64` does not exist. The live
amd64 pool is `hanzo-build-linux-amd64`.

- build-lux.yml: build + deploy jobs
2026-05-19 08:02:14 -07:00
zeekay 4af015fc50 feat(brand): every brand field env-overridable; drop hardcoded "Lux Explorer"
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.
2026-05-06 10:49:30 -07:00
zeekay 07a96bd1cd ci: lux-only build — never push other-brand images to luxfi org
Per registry-separation rule (CLAUDE.md "Container Registries — NEVER
MIX"), luxfi/explore must only push the Lux brand. Other-brand images
(hanzoai/explore, zooai/explore, etc.) build from each brand's own
org repo, never from this one.

The source still supports white-label brand selection at runtime
(lib/white-label.ts inspects hostname or NEXT_PUBLIC_BRAND), so a
single Lux image can serve any brand at deploy time. Build-time brand
baking is reserved for per-org image variants — out of scope here.

Also drops the Lux-only frontend rollout list down to mainnet/testnet/
devnet — non-Lux deployments live in their own clusters.
2026-05-05 23:13:40 -07:00
zeekay cb5fb6faab ci: align build-lux.yml with luxfi org's actual ARC pool
Single-arch (amd64) brand matrix on lux-build-linux-amd64 — the only
ARC scale-set provisioned for luxfi org today. arm64 native runner is
pending; matrix is structured to add it back when the scale-set is
online (no QEMU per the no-emulation directive).

Manifest job dropped: with one arch, build-push-action publishes the
image directly under the canonical tag. Deploy job stays, switched
to lux-build-linux-amd64.
2026-05-05 21:05:56 -07:00
zeekayandGitHub c197c0e366 Merge pull request #6 from luxfi/ci/arc-hanzo-consolidation
feat: multi-brand build matrix + white-label support
2026-05-05 20:51:37 -07:00
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