On a Zoo, Hanzo, Pars, SPC or Osage host the validators page listed every L1
in the registry, and /dex rendered the Lux D-Chain markets. The network total
now sums every L1 only on the Lux primary-network explorer, and /dex answers
404 anywhere else. isPrimaryNetworkHost() is the same predicate as
isPrimaryNetworkExplorer(), taking the host from the request.
Co-authored-by: Hanzo Dev <[email protected]>
One family. Font stacks name Zen and fall back to the native faces, tokens
name the role rather than a face, and the packages that used to supply a
face now point at @hanzo/font.
Self-hosted @font-face blocks are removed rather than renamed: rewriting the
family in one would leave a src pointing at a file this repo no longer ships.
@hanzo/font carries the binaries and declares the faces, so the local copies
go with the declaration that used them.
Comments naming a face we no longer use are deleted, not reworded.
luxd serves chain routes under /v1/chain, and the node, cli and sdk releases
already ship it. The deployed gateways still answer the old prefix, so remote
reads break until they are redeployed; the estate moves together rather than
sitting half converted.
Lines that record an observation - a probe, a status code, a past release -
keep the prefix they were written against, as do URLs on hosts that are not
ours. Avalanche endpoints move to /ext/bc, which is the path that host serves.
The rename to /v1/chain is real in luxd source, but the deployed fleet has not
taken it yet: probed just now, api.lux.network, api.lux-test.network,
api.zoo.network and api.hanzo.network each answer 200 on /v1/bc/C/rpc and 404 on
/v1/chain/C/rpc. Composing /v1/chain against those hosts reaches nothing, which
is the failure the rename set out to prevent.
The move belongs with the node redeploy, not ahead of it.
luxd serves chain routes under /v1/chain; the /v1/bc prefix it replaced is
gone, so anything composing it reaches nothing. Lines that record an
observation - a probe, a status code, a past release - keep the prefix they
were written against, as do URLs on hosts that are not ours.
The explorer had no way for a person to change how it reads. Colour mode was
the only control, and it is one bit.
@hanzo/appearance stores the preference and puts it on <html>; what the numbers
mean is bound in styles/tokens.css. Type rides the root font size, so every
Tailwind rung — all of them in rem — moves from one declaration and nothing is
restated. Density rides --spacing, the single base every p-*, m-* and gap-*
computes from. Both default to 1, so an install that never opens the panel
renders exactly what it rendered before; measured in a browser against the
production build: 16px root, p-4 at 16px, unchanged.
@hanzo/design's token sheets stay out. They declare --text-*, --radius-* and
--breakpoint-* — the names Tailwind v4 publishes — outside any layer, and v4
compiles utilities to var() references rather than baked values, so importing
them silently reanchors the app: --text-base 16px to 14px, --radius-lg 8px to
12px. Two sets under one set of names is a fork, not a migration. They become
the ramps when Tailwind leaves and there is one ramp to own.
The boot script is hashed for CSP from the same call that renders it, the way
the adbutler scripts are. A pasted literal goes stale on the next release of
the package and fails silently — policy parses, browser drops the script, page
paints at the defaults.
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.
/chains showed fifteen rows on every network, from a hardcoded table. Four of
them — T, R, I, O — are registered on no network at all; the node answers
"there is no ID with alias: T". A fifth, M, runs on devnet alone. And every
/chains/<slug> page printed the same four numbers: the primary network's
validator count, its total stake, its chain count, its threshold. Nothing on
Q-Chain's page was about Q-Chain. Fifteen pages, one set of facts.
The network already knows its own answer. platform.getBlockchains is the chain
list, and it is per-network for free: mainnet and testnet report nine chains,
devnet reports ten including M. That is what /chains lists now, joined with
configs/app/primaryChains.ts for presentation only — a chain the network
reports and we have no metadata for still gets a row, because the network is
the source of truth and our table is not.
Three facts per chain, each read from that chain:
* the blockchain ID, from the registry — the thing that actually tells one
chain from another, and it was already on screen while the numbers above
it were not
* whether the node has bootstrapped it, from info.isBootstrapped, which the
gateway routes for every chain. This is how Q-Chain's page now says
Syncing where the other nine say Bootstrapped: Q has not come up on any of
the three networks and is the sole reason all three report healthy:false
* its head, in its own dialect — eth_blockNumber for C, platform.getHeight
for P, xvm.getHeight for X. Not avm: that service is gone from this build,
and asking it returns "can't find service" rather than a height
Validators are the P-Chain's model, so they render on the P-Chain and nowhere
else. The head is labelled for the model it comes from — the X-Chain's is an
accepted height, not a block height.
Where a chain has no head to read, it says so. The gateway routes exactly P, X
and C on all three networks; D, A, B, Z, G, K and Q are registered and
bootstrapped on the node but their RPC 404s from a browser. Proof it is the
route and not the chain: C-Chain's own blockchain ID, /v1/bc/25td8att…/rpc,
404s while /v1/bc/C/rpc returns a height — same chain, same node. Those pages
read "No public RPC" and say plainly that the chain is registered and running
but not published. A zero there would have read as a measurement.
One proxy replaces the P-only one. /v1/pchain hardcoded /v1/bc/P; /v1/node/
<endpoint> resolves the endpoint against the primary-chain table and never
treats it as a URL. A chain the gateway does not route comes back 200 carrying
a JSON-RPC error rather than 502 — nothing is broken, and 502 put a red failed
request in the console of eight of the ten chain pages.
Deleted: CHAIN_INDEXER_URLS and the hook that read it — fifteen hostnames of
the shape api-indexer-<x>chain.lux.network, none of which resolve. Fifteen of
fifteen NXDOMAIN. It fetched them on every chain page and rendered the null.
Measured on mainnet, 1440x900 and 390x844, fresh context per URL: 20 of 20
chain/screen rows agree with RPC on both status and head — C-Chain 1,107,826
against a live head bracketed at 1,107,822..1,107,829, P and X at 0, seven
reading No public RPC, Q Syncing while the rest are Bootstrapped. /chains
lists the same ten chains the P-Chain reports, and 10 of 10 row links reach a
real page. Zero 4xx or 5xx from our own origin.
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]>
Every phone visitor got "Oops! Something went wrong" instead of the
explorer. Desktop and tablet were clean, which is why it survived.
@hanzogui v5 ships WITHOUT an animation driver by design; the app has to
supply one. `@luxfi/ui`'s own config (packages/ui/src/lux.config.ts) has
carried `animations` from `@hanzogui/config/v5-css` since it was written —
this second, hand-rolled config predates that and never got the key. gui's
Sheet reads `useAnimatedNumber` straight off the driver and calls
`.setValue()` on the result, so with no driver it threw
TypeError: Cannot read properties of undefined (reading 'setValue')
at SheetImplementationCustom.useIsomorphicLayoutEffect
into the error boundary. Every @luxfi/ui Drawer here — Burger, mobile
search, wallet and profile sheets — mounts ONLY below the mobile
breakpoint, so the crash was viewport-gated and invisible above it.
Measured on the home page, one variable changed:
390px before "Oops! Something went wrong" after full page, 0 pageerrors
834px before renders after renders
1440px before renders after renders
and /validators at 390px now reads 5 validators / 2,500,000,000 LUX, which
is what platform.getCurrentValidators returns.
The real lesson is the duplicate config, not the missing key: this app
hand-rolls a gui config that @luxfi/ui already owns. Folding it onto the
umbrella's is the follow-up.
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.
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).
@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.
@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).
- 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
- 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
- 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()
- A-Chain (AI): dashboard with models, providers, attestations tabs
- D-Chain (DEX): markets, orderbook, trades, pools tabs
- API hooks with mock data (ready for indexer integration)
- Navigation items and route registration for /ai and /dex
- Redesign NetworkOverview homepage with Blockscout Stats, LatestBlocks,
and LatestTxs alongside P-chain network stats and chain cards
- Add ChainSwitcher dropdown to TopBar for switching between C-Chain,
Zoo, Hanzo, SPC, and Pars explorer instances
- Create /chains/[slug] chain detail page with chain info, validators,
subnet chains, and stats (modeled after Avalanche L1 Details)
- Make ChainsPage rows clickable with links to chain detail pages
- Register /chains/[slug] route in all metadata/analytics files
- Add /bridge page with cross-chain transfer route tracker
- Show bridge routes between Primary Network chains and L1 subnets
- Add Network Stats section (validators, chains, stake, uptime) to Stats page
- Add Bridge to navigation menu
- Register /bridge route in nextjs-routes, metadata, and mixpanel
Google Fonts registers the font as 'Geist', not 'Geist Sans'. The CSS
font-family mismatch caused the font to never load, falling back to
system sans-serif. Also adds an SVG favicon with the triangle icon
(SVG favicons take priority over PNG/ICO in modern browsers).
- Preserve default dayjs locale formats (L, LL, LT, LTS, etc.) in
updateLocale to prevent TypeError on format() calls
- Switch default font from Inter/Poppins to Geist Sans throughout
- Remove gas tracker stats and Add Network button from top bar
- Replace placeholder logo/icon fallbacks with Lux triangle branding
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]>
* 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
* 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]>
* 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]>
* adds clusters api configs
* adds clusters api configs
* adds api types
* adds props routes and titles for cluster pages
* adds query param enum for clusters api
* adds clusters svg
* adds dynamic page routes
* adds clusters entity ui in ui/shared/entities
* adds functions to detect input type; will be used to check whether a user is searching for a cluster name vs a evm address
* adds stubs for loading skeleton view
* adds pagination hook
* adds query param hooks for clusters trpc endpoints
* adds query param hooks for clusters trpc endpoints
* adds components that make up the /clusters ui
* adds components for /cluster ui
* adds clusters api endpoint to query by cluster id
* implements call to cluster id endpoint to get ac
tive chain count
* adds clusters search types and in api category
* creates clusters search hook and wraps useQuickSearchQuery hook
* replaces useQuickSearchQuery for useSearchWithClusters hook for both functionality
* add search suggestion ui
* adds optional chaining to handle react re-render when search type changes
* adds cluster ui to ui/pages/address on address details
* prevents clicking on cluster suggestion if address is non EVM
* adds util functions for testability along with tests, for action bar component logic
* refactor - extract clusters display logic wit
h tests
* refactor: extract page utilities from Clusters.tsx with tests
* adds jest testing infra for react components
* adds hook testing coverage
* adds component and integration tests
* adds detectInputType util tests
* removes generic parameters from clusters pagination types
* replaces any type with proper cluster config types
* adds cluster routes to metadata and analytics mappings
* updates order and stacks action bar items vertically when mobile view
* repositions clusters logo
* refactors search logic to render community clusters in search sugge
st
* adding clusters env vars
- add NEXT_PUBLIC_CLUSTERS_API_HOST and NEXT_PUBLIC_CLUSTERS_CDN_URL env vars
- configure clusters api integration in configs/app/apis.ts and features/clusters.ts
- adds clusters env vars to test env (.env.jest and .env.localhost)
- update CI deploy configs for both review envs
- add env vars validation schema
- document new vars in ENVS.md with usage examples
* centers directory/leaderboard toggle in mobile view
* resizes and sets proper color to logo in entity component
* hides clusters nav when clusters env is missing
* removes duplicate trailing slashes in cluster community names
* Bump `react` to v19 (#2782)
Co-authored-by: tom <[email protected]>
* change links to ton explorer
* fix internal links in ENVS.md file
* tx info: tac operation stage could be an array
* fix display of ad banner
* tac ui updates
* add more "button click" events
* update clock icon
* update screenshots
* fix age filter reset
* change tac operation status once again
* fix address icon tooltip content
* [skip ci] label released issues workflow: don't override release tag if it exists
* puzzle-15 (#2471)
* puzzle-15
* puzzle-review
* puzzle game
* puzzle fixes
* separate puzzle feature in readme
* fix testnet and rollup stage badges
* New styles for pagination and "Add / Remove" buttons (#2791)
* update styles for add / remove buttons
* update pagination styles
* change border color for filled inputs
* change row gap for alerts
* update icons and screenshots
* fix tests
* update buttons for contract method form
* update screenshot
* Gas tracker: bug fixes and improvements (#2792)
* Gas tracker page: hide `Gas price history` if chart is not enabled
Fixes#2781
* change default value for NEXT_PUBLIC_GAS_TRACKER_UNITS for testnets
* fix env for pw tests
* Public tags form improvements (#2796)
* adjust validation of comment field
* add icon url to public tag form
* update screenshots
* fix ts
* NFT marketplaces: make `collection_url` and `instance_url ` optional (#2797)
Fixes#2614
* Bump brace-expansion from 1.1.11 to 1.1.12 in /deploy/tools/affected-tests (#2801)
Bump brace-expansion in /deploy/tools/affected-tests
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.11 to 1.1.12.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)
---
updated-dependencies:
- dependency-name: brace-expansion
dependency-version: 1.1.12
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
* allow toaster to render custom description
* Encode the address hash for links to the TON chain (#2813)
Encode the address hash for links to the TON chain.
* Support redirects for known address discrepancies (#2799)
* Support redirects for known address discrepancies
Fixes#2793
* fix redirect to internal txs in the block
* add address user ops redirect
* Celo: support L2 epochs (#2784)
* epochs page
* epoch rewards distribution
* epoch election rewards
* address epoch rewards
* block epoch tag
* add some tests
* adjust epoch details for L1 epochs
* support non-finalized epochs
* fixes after design review
* add truncation to block numbers on mobile
* update epochs table layout
* update timestamp hint
* fix bug with subheading of first epoch
* fixes of mobile view
* update screenshots
* Icons in footer links (#2809)
* Icons in footer links
Fixes#2539
* fix envs validator
* Metadata: send address to fetchers once visited (#2814)
* Metadata: send address to fetchers once visited
Fixes#2723
* fix ts
* replaces jest-dom matchers with standard matchers
* makes /clusters page default view the directory instead of leaderboard, including jest coverage
* updates columnn name from backing to total backing, in leaderboard display
* alphabetically reorders clusters export
* adds Cluster section to the Table of Cont
ents at top of page
* removes redundant Flex component wrapper around ClustersEntity
* uses standard toolkit values for border radius and color
* uses getFeaturePayload util instead of type coercion
* extends ImageProps interface to ClusterIconProps, and uses getFeaturePayload util instead of type coercion
* adds evm address regexp in regexp.ts as single source of truth
* updates imports for files that used form validator address regexp to use single source of truth
* removes unused args, unnecessary type coercions and memoizations. upper snake case constant values.
* sets correct action bar height using ACTION_BAR_HEIGHT_DESKTOP constant
* implements TimeFormatToggle to Joined column
* simplifies conditionals and removes unnecessary Box component wrapper
* displays standard 404 error screen on erroneous ClusterDetails query
* standardizes details page to display ETH value and time in line with rest of app
* removes redundant debouncing
* moves useQueryParams hook to lib/router and updates imports and test to account
* moves config.features.cluster
s.isEnabled to top of the function and utilizes select function of useQuery in useAp
iQuery
* removes unnecessary 3rd column and isContractVerified since it is always false
* checks clusters enable for placeholder
* makes isClusterClickable condition more generic for future repurpose
* splits isEvmAddress out to general purpose utility in lib/address, update imports and test
* moves all cluster hooks and tests to lib/clusters folder
* wraps action bar with standard button wrapper
* makes nextjs-routes mock condition stricter
* adds mock clusters api data
* adds pw tests for cluster detail page
* adds pw tests for clusters directory page
* adds pw tests for clustersentity ui component
* adds mock envs for pw tests
* adds clusters api host and cdn url to env.pw
* fixes resolve react-hooks/rules-of-hooks violation in cluster search while keeping search optimization
* throws error instead of using app error component
* uses semantic token to reference color as per standard method in chakra ui
* removes empty or loading state pw tests
* pw tests - uses mockAssetResponse for icons, removes redundant tests, and updates vie
wport to narrow test case
* migrates all clusters pw tests from page.route to mockApiResponse
* updates docker generated pw screenshots
* removes object cloning in useSearchWithClusters hook
* uses standardized chakra name for backgroundColor
* resolves Clusters.pw.tsx docker screen generation issues and updates screenshots
* removes unneeded screenshots for Cluster.pw.tsx
* standardizes mobile testing approach with +@mobile tag by removing explicit viewport config, updates screenshots
* reverts expanded pw test coverage for ClustersEntity
* removes all clusters pw screenshots
* removes nested describe which was resulting in a failed test
* uploads latest docker generated screenshots for pw
* force trigger for conflict check
* removes repeating var from blockchainNavItems array
* fix screenshot merge conflicts - use upstream versions
* updates yarn.lock with upstream lib
* fix jest tests by mocking useQuery directly to resolve QueryClient context issues
* creates global mock object and proper typing to reduce duplication
* updates clusters pw screenshots with docker generation. update helia to 3.2.0 and pinned esbuild to 0.21.5. update docker dep script.
* updates yarn.lock
* removes unused imports from upstream/main
* add vite aliases for @libp2p/utils and @helia/verified-fetch to resolve playwright build failures
* updates pw screenshots for hero banner, home page and desktop header
* downgrades helia to v2.6.12
* revert changes in yarn.lock file related to helia package
* updates yarn.lock with helia downgrade
* revert changes in yarn.lock
* move clusters to the tab on the name service page
* fix tests
* small tweaks
* update screenshots
---------
Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Richard Oh <[email protected]>
Co-authored-by: Max Alekseenko <[email protected]>
Co-authored-by: isstuev <[email protected]>
Co-authored-by: Igor Stuev <[email protected]>
Co-authored-by: Hanzo Dev <[email protected]>
Co-authored-by: Richard J Oh <[email protected]>