Adds .hanzo/workflows/cicd.yml calling the canonical pipeline and drops the
GitHub-hosted workflows it replaces. Lands here because this is where the repo
is written — git.hanzo.ai is upstream and github.com is its push mirror, so the
same change made on github.com never reaches the runner fleet.
The explorer shipped three sign-in systems. Two were Blockscout's and both
spoke to its /account/* backend, which this deployment does not run — measured,
every one of those endpoints 404s on api-explore.lux.network:
/account/get_csrf 404 /account/send_otp 404 /account/siwe_message 404
/account/user/info 404 /account/confirm_otp 404 /account/authenticate_via_* 404
So none of it could ever have worked. It is deleted, not re-pointed: the email
+ one-time-code modal, the SIWE wallet login, the CSRF handshake that fired on
every page render, the Dynamic.xyz provider, and the dev page that let you
paste a session cookie by hand. Rewriting any of it against our own backend
would have been building custom auth, which we do not do.
What is left is the standard OIDC client we already had, finished:
* PKCE (S256). This client is public — it runs in a browser and can hold no
secret — so the verifier is the only thing binding a redeemed code to the
page that asked for it. IAM advertises S256 in its discovery document and
we were not sending a challenge at all.
* userinfo went to <issuer>/api/userinfo, which is a 404 and an /api/ path we
do not serve. It is /v1/iam/oauth/userinfo, per IAM's own discovery.
* logout now ends the IdP session (end_session_endpoint) instead of only
dropping our cookie and leaving the user signed in upstream.
All three live in lib/oidc.ts, which already said never to rebuild these paths
at a call site.
The header's provider switch collapses to two states — signed in with IAM, or
account disabled and this is the wallet/settings menu. `rewards` is stated off:
its gate read authProvider === 'auth0', so it was already unreachable.
The ConfigMaps carried NEXT_PUBLIC_OIDC_CLIENT_ID=lux-explore-client-id, a
client that has never existed, so authorize answered 400 unknown client_id.
IAM names clients <org>-explore; all four brands now say so, and hanzo/zoo/pars
get the OIDC keys they never had.
Typecheck: no new error classes, production errors 26 -> 22.
Co-authored-by: Hanzo Dev <[email protected]>
The magnifying glass was drawn over the leading "S" of the placeholder. The
cause is not the search bar: @luxfi/ui's InputGroup measures its adornments
correctly and then throws the measurement away, because the clone is guarded on
`displayName === 'FieldInput'` — a component that does not exist in the package
— and the props it would have set (`ps`/`pe`) are Chakra style props that the
Tailwind/gui Input spreads onto the DOM and ignores. Both halves are leftovers
of the Chakra→Tailwind port, so EVERY InputGroup in the app is unpadded; the
header is just the one you look at every day. Patched at the primitive
(patches/@[email protected]) rather than hand-tuning padding at one call
site: the offset is the measured width of the actual adornment, so it stays
right when the adornment changes, and FilterInput / revoke's SearchInput / the
showcase are fixed by the same change. Measured at 1440x900: the icon overlapped
the text by 24px and the kbd chip by 52px; both are now 0.
The measurement also moves to a layout effect and stops blanking value and
placeholder on first render. That blanking was inert while the guard swallowed
the clone; with the clone live it flips the field from controlled to
uncontrolled on mount, which React warns about and which can eat a keystroke.
ClearButton spread `className` over its own visibility classes, so a caller
passing one clobbered `invisible` — the header showed a clear button on an empty
field. Merged instead, at the component.
Placeholder is now "Search or ask anything", and Cmd/Ctrl-K opens an assistant.
Nothing in this repo, @luxfi/ui or @hanzo/gui ships a command palette or chat
(no cmdk, no palette, one dialog primitive), so this is the smallest thing that
works: the existing Dialog, one global listener, and a server-side proxy that
holds the credential. The key is deliberately not NEXT_PUBLIC_, so a deployment
without one gets a dialog that says exactly that instead of failing silently.
Off unless NEXT_PUBLIC_AI_ASSISTANT_ENABLED is set — Ctrl+K is the browser's
address-bar shortcut and claiming it to show an error would be worse than not
claiming it.
Validators read 5 on a network running 20. useCurrentValidators asks ONE
P-Chain, the one this deployment points at, but Lux, Hanzo, Zoo and Pars are
each sovereign L1s with their own P-Chain and their own validator set — measured
2026-08-06, five each, with four disjoint NodeID sets. The registry gains the
node origin per chain; absence of it is the signal that a chain has no publicly
reachable node (SPC and Osage are in-cluster only), and those are reported
`unavailable` rather than counted as zero. Stake is deliberately NOT summed:
each chain bonds its own currency.
The proxy resolves `?chain=` through the registry and never from the request, so
it cannot be pointed at an arbitrary origin. The new envs are registered with
the envs-validator and documented in ENVS.md — the schema rejects unknown
NEXT_PUBLIC_* variables and runs at container start, so an undeclared one stops
the pod from booting.
Co-authored-by: Hanzo Dev <[email protected]>
Restoring the paths map got tsc through, and the image build moved on to the
next command on the same line:
> tsc -p ./tsconfig.json && tsc-alias -p ./tsconfig.json
tsc-alias error: compilerOptions.rootDir is required with implicit baseUrl
tsc infers a rootDir from the inputs and is content; tsc-alias will not, and
without baseUrl there is nothing for it to fall back to. The inferred value was
already the repo root — the emit lands in build/configs, build/lib, build/ui —
so stating it changes no output. Verified by emitting either way: the JS tree is
identical, and only tsconfig.tsbuildinfo moves, since its path is computed
relative to rootDir.
feature-reporter overrides the inherited paths map, which TypeScript
replaces rather than merges. That was survivable while the root config
set baseUrl -- bare specifiers resolved against it with no paths entry,
and this file's own "./nextjs/..." resolved against it too. The
TypeScript 7 migration dropped baseUrl for an explicit paths map, so the
override began yielding neither, and "./nextjs/..." started resolving
relative to feature-reporter/ where no such file exists.
tsc then failed on toolkit/* and types/*, which fails the image build at
Dockerfile:87 -- so no explore image has been produced since v1.1.13 and
production still serves it, including the homepage crash and the search
crash whose fixes have been on main since Aug 4.
Lists every alias the include-set reaches, as the working sibling
envs-validator already does. tsc -p is clean and emits.
The first pass left three classes of config that BOTH tsc 5.9 and tsc 7
reject. Each was proven against both compilers before changing:
TS5090 A `paths` target must be relative once `baseUrl` is gone. The
first pass skipped the "./" prefix wherever baseUrl pointed at
the config's own directory, reasoning it was semantically
equivalent. It is not — without baseUrl a non-relative target
is rejected outright, by 5.9 as well as 7.
TS5110 `moduleResolution: node16` requires `module: node16`. The first
pass mapped commonjs projects to node16 resolution alone, which
BROKE those configs for the current toolchain. Both are now set.
TS5102 `downlevelIteration` is also removed in TS7; it was missing from
the dead-flag list.
Verified: repos that tsc 7 previously refused (base-studio, js-sdk, kv-js)
now report zero config errors on tsc 7 AND tsc 5.9.
Co-Authored-By: Hanzo Dev <[email protected]>
TypeScript 7 is the native Go compiler and removes `baseUrl` and
`moduleResolution: node|node10`. Both appear here, so `tsc` from TS7
refuses the config outright (TS5102 / TS5108) and cannot typecheck.
`paths` targets resolve relative to `baseUrl` when it is set and relative
to the tsconfig file otherwise. Every `baseUrl` folded here already
pointed at the config's own directory, so dropping it moves nothing and
the targets are left byte-identical. Where a baseUrl pointed elsewhere,
each affected target was rewritten as join(baseUrl, target).
`moduleResolution` was chosen from the declared `module`: commonjs ->
node16, esnext/preserve -> bundler. Configs whose `module` is unset or
exotic were left alone rather than guessed at.
The result is accepted by BOTH toolchains, so nothing has to upgrade
TypeScript in lockstep. Verified on hanzo/chat packages/api: tsc 5.9
779 -> 778 errors (no regression), and tsc 7.0.2 now runs the project
in 2s where it previously refused the config.
Co-Authored-By: Hanzo Dev <[email protected]>
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 <[email protected]>
- 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
The `tsc` npm package (v2.0.4) is a warning shim, not the TypeScript
compiler. With pnpm, npx resolves it before the real tsc from the
typescript package. Fix by removing it and using direct bin names.
- Replace yarn v1 with pnpm 10.11.0 across all build configs
- Move misplaced deps to devDependencies (cspell, esbuild, @openzeppelin/contracts, @next/bundle-analyzer, @types/papaparse, @types/react-scroll)
- Remove stale @types/[email protected] override — use correct React 19 types (fixes 22 type errors)
- Convert yarn resolutions to pnpm.overrides
- Update Dockerfile, Dockerfile.lux, CI workflows, and all shell scripts
- Add .npmrc with shamefully-hoist for Next.js compatibility
- Add outputFileTracingRoot to next.config.js
* 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]>
* 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
* 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
* increase timeouts for multichain and essential dapps config generators
---------
Co-authored-by: Max Alekseenko <[email protected]>
* 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]>
* UI/UX: Dropdown DeFi button fixes
Resolves#3104
* move chain menu to the right of the topbar
* add list mode to chains menu
* rollback price diff on mobile
* fix links in approvals list
* pass check-summed hash to safe API call
* make tx hash optional for token transfers
* fix multiple public tag submission
* update screenshots
* use DataListDisplay for revoke
* force to send credential only with general API requests
* prefer formatted date label over date default formatting when saving chart data as csv
* add abort failed status for zeta chain CCTX
* update specify sdk
* rename ENV for native token address
* add ENV to hide native coin price in topbar
* rename routes for name services
* fix chart csv export file
* fix tests
---------
Co-authored-by: Max Alekseenko <[email protected]>
Co-authored-by: isstuev <[email protected]>
* MegaETH: uptime dashboard
Fixes#2906
* basic implementation of mini-blocks
* update socket url and time format
* update mega eth preset
* customize flashblocks name
* clean up
* update color theme variable for mega eth
* [skip ci] don't show alert "scanning new mini-blocks"