/bridge showed CONNECTED CHAINS 14, BRIDGE ROUTES 4, BRIDGE SIGNERS 5, ACTIVE
ROUTES 4 — the same four values on lux, hanzo and zoo, while its only backing
RPC 404'd twice per page load. Not one was measured:
* Connected Chains counted the keys of CHAIN_LABELS, a hardcoded lookup table,
plus an L1 list that comes back empty. It is 14 because the map has 14
entries.
* Bridge Routes and Active Routes counted four pairs unshifted into an array
three lines above, each hardcoded status: 'active'.
* Bridge Signers asked the B-Chain and, when that failed, printed the P-Chain
VALIDATOR count under a signer label. A real number, under the wrong name —
the worst of the four, because it moves.
The B-Chain is not served on any prefix: api.<brand>.network answers 404 to
/ext/bc/B/rpc and to /v1/bc/B/rpc alike, so there is no live bridge data to
show and the page has been reporting constants as measurements. Fixing the
path would have moved the 404, not the lie.
So the cards are gone, and with them lib/api/bchain, whose whole job was to
swallow that failure into zeroes. That leaves lib/api/luxnet with no caller —
the P-Chain hooks go through the /v1/pchain proxy, and getPChain/getInfo/
getHealth were re-exported and never called — so it goes too, and the luxnet
dependency with it: 889 lines of lockfile, an elliptic-curve SDK this app
never used at runtime. The retired /ext/ prefix now has no caller here at all.
What stays is what is true: the routes table, C/P/X atomic swaps marked active
and L1 transfers marked coming soon, and the paragraph that says so.
Measured, 1440x900: before, two POST https://api.lux.network/ext/bc/B/rpc per
load, both 404, four stat cards reading 14/4/5/4. After, zero /ext/ or /bc/
requests, zero stat cards, the four route rows unchanged.
Also: name every field when a broadcast becomes a block. toApiBlock spread the
raw EVMBlock and renamed three keys, so gas_used, gas_limit, base_fee_per_gas
and parent_hash stayed camelCase and arrived undefined — a live-pushed row
rendered 0 gas beside REST rows showing the real number, the same block reading
two ways depending on how it got here. It now builds the API shape explicitly,
field for field, matching formatBlock in luxfi/indexer.
The home page rendered the error boundary — "Oops! Something went wrong" —
within seconds of loading, on every explorer in the estate, with no interaction
at all:
TypeError: Cannot read properties of undefined (reading 'length')
at HashStringShorten (ui/shared/HashStringShorten.tsx:17)
The list on the home page is filled from the REST API and then kept current by
the realtime stream, and the two do not agree on what a block looks like.
/main-page/blocks answers with the API shape — `height`, and `miner` as an
address object. The indexer broadcasts a raw EVM block:
data: {"event":"blocks","chain":"cchain","data":{
"number":1090152,"miner":"0x0100...","txCount":4, ... }}
`new_block` put that straight into the same query cache, so LatestBlocksItem
handed `AddressEntity` a bare string. `address.hash` on a string is undefined,
the entity passed undefined down as its text, and HashStringShorten read
`.length` off it. Instrumented in a dev build: the four blocks that arrive over
the stream log `miner` as a string with no `height`, against six from REST that
carry both — and exactly four entities then render with no text.
TRANSLATIONS already exists as the one place a backend broadcast becomes app
data, and it already has a transform hook, so the shape is settled there rather
than at each reader. Everything downstream keeps knowing exactly one block
shape, which is what it already assumed.
The spec asserted the raw passthrough, so it encoded the bug; it now asserts
the mapped shape and covers `miner` specifically.
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.
- 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
* Contract tab: finding matching bytecode states
Fixes#2678
* handle case when there is only one sub-tab on contract tab
* tests
* prevent calling the smart contract resource twice when opening the tab
* [wip] add debug logs
* change api host for op sepolia
* rollback debug and update screenshots
* context for storing subchain config and tx view for subchain
* address page and block page for subchain
* address aggregated page: local txs tab
* connect MultichainSelect to context
* home page placeholder
* refactor subchain select state
* envs for demo
* fix ts
* clear value for l2 review
* subchain widgets on home page
* csp policies
* sockets, duck and goose
* fix socket on subchain address page
* link builder for subchain views
* update home widget
* fix time increment
* enable tx interpretator and metadata service
* generate multichain config based on every chain app config
* Fix the multichain config to work in Docker
* multichain socket test
* rename subchain-id to subchain-slug path param
* refactoring
* update chain icons on entities
* home page: latest local txs
* latest cross-chain txs
* minor improvements
* renaming, pt. 1
* rename chain routes
* enable blockchain interaction
* add loading state to icon shield
* fix build
* fix tests
* update types package
* Contract verification not appearing as completed following the message from websocket
Fixes#2618
* fix tests
* Change indexing status event name
* Replace `optimism_deposits:new_deposits` socket topic with `optimism:new_deposits`
* refactor token instance page title
* add menu item and modal with recaptcha
* initialize refresh and show loading state
* handle error state
* fix metadata atributes parser
* refactoring
* tests
* Get smart-contract bytecode from websocket
Fixes#1769
* fix test
* i am stupid 😓
* Update values.yaml.gotmpl
---------
Co-authored-by: Yan Vaskov <[email protected]>