You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Nothing in the UI reveals that value, which bites in three places:
Stale metadata is invisible.explorer-metadata ships new networks, tokens, RPC
endpoints and logos on its own cadence — Zcash lands in feat: add zcash mainnet and testnet explorer-metadata#17 as 1.3.0-alpha.0, while the explorer is pinned
to 1.2.1-alpha.0. Until the constant moves, the app looks exactly the same as if the
data were current. There is no way to tell from the running app which metadata build is
behind what you are looking at.
The version keys the RPC cache.src/utils/rpcStorage.ts:114,127 stores it with the
cached endpoints and discards the cache when cache.version !== METADATA_VERSION. When
a user reports "my RPC list didn't refresh", this is the first thing worth knowing, and
right now it can only be recovered by reading the bundle.
Bug reports don't carry it. The footer's report-a-bug link ships the app version and
commit hash; a metadata-driven bug (missing token logo, wrong network entry) is not
reproducible without also knowing the metadata version.
Proposed Solution
1. Footer — the version at a glance.src/components/common/Footer.tsx already renders t("footer.versionLabel", { version: appVersion, hash: formattedCommitHash }), linking to
the commit. Extend it with the metadata version:
v1.2.6-alpha 1a21a35 · meta 1.2.1-alpha.0
The string lives at footer.versionLabel in src/locales/{en,es,ja,pt-BR,zh}/common.json
(line 47) — either extend that key with a {{metadataVersion}} placeholder or add a
sibling key, in all five locales.
2. Settings → Advanced — the detail. The cacheData section in src/components/pages/settings/index.tsx (~line 1660) is where cache clearing already
lives, so it is the natural home for a read-only metadata info block: version, build time,
entity counts, and the jsDelivr base URL as an openable link.
That data is already published and currently unused by the explorer — @openscan/metadata writes dist/manifest.json in its build:
Nothing in src/ fetches manifest.json today. Add a getMetadataManifest() to MetadataService, following the same shape as the existing rpcs/all.json fetch, and
cache it like the other metadata responses. Showing buildTime alongside the pinned
version also distinguishes "we're on an old version" from "the CDN served us a stale copy".
3. Optional — drift hint. Compare the pinned version against the published dist-tag and
show a subtle "newer metadata available" note. If this is implemented, be careful which tag
it queries: the tags are currently split —
latest -> 1.0.1
alpha -> 1.2.1-alpha.0
so a naive check against latest would report a downgrade.
Acceptance Criteria
The metadata version is visible in the footer next to the app version and commit hash
Settings → Advanced shows the metadata version, build time and entity counts, read
from dist/manifest.json
MetadataService exposes a getMetadataManifest() helper, cached like its siblings
The base jsDelivr URL is shown (or linked) so the exact source can be opened
New/changed strings added for all five locales (en, es, ja, pt-BR, zh)
The UI degrades gracefully when manifest.json cannot be fetched — the pinned
constant still renders, since it is known without a network call
Summary
Surface the
@openscan/metadataversion the app is actually consuming, so it can be readoff the screen instead of inferred from the source.
Motivation
METADATA_VERSIONis a hardcoded constant insrc/services/MetadataService.ts:10that pins every metadata fetch to one jsDelivr URL:
Nothing in the UI reveals that value, which bites in three places:
explorer-metadataships new networks, tokens, RPCendpoints and logos on its own cadence — Zcash lands in
feat: add zcash mainnet and testnet explorer-metadata#17 as
1.3.0-alpha.0, while the explorer is pinnedto
1.2.1-alpha.0. Until the constant moves, the app looks exactly the same as if thedata were current. There is no way to tell from the running app which metadata build is
behind what you are looking at.
src/utils/rpcStorage.ts:114,127stores it with thecached endpoints and discards the cache when
cache.version !== METADATA_VERSION. Whena user reports "my RPC list didn't refresh", this is the first thing worth knowing, and
right now it can only be recovered by reading the bundle.
commit hash; a metadata-driven bug (missing token logo, wrong network entry) is not
reproducible without also knowing the metadata version.
Proposed Solution
1. Footer — the version at a glance.
src/components/common/Footer.tsxalready renderst("footer.versionLabel", { version: appVersion, hash: formattedCommitHash }), linking tothe commit. Extend it with the metadata version:
The string lives at
footer.versionLabelinsrc/locales/{en,es,ja,pt-BR,zh}/common.json(line 47) — either extend that key with a
{{metadataVersion}}placeholder or add asibling key, in all five locales.
2. Settings → Advanced — the detail. The
cacheDatasection insrc/components/pages/settings/index.tsx(~line 1660) is where cache clearing alreadylives, so it is the natural home for a read-only metadata info block: version, build time,
entity counts, and the jsDelivr base URL as an openable link.
That data is already published and currently unused by the explorer —
@openscan/metadatawritesdist/manifest.jsonin its build:{ "version": "1.2.1-alpha.0", "buildTime": "2026-04-21T13:02:01.396Z", "counts": { "tokens": 414, "networks": 19, "rpcs": 230, "apps": 1, "organizations": 2, "supporters": 7, "donations": 0, "events": 23, "addresses": 1 } }Nothing in
src/fetchesmanifest.jsontoday. Add agetMetadataManifest()toMetadataService, following the same shape as the existingrpcs/all.jsonfetch, andcache it like the other metadata responses. Showing
buildTimealongside the pinnedversion also distinguishes "we're on an old version" from "the CDN served us a stale copy".
3. Optional — drift hint. Compare the pinned version against the published dist-tag and
show a subtle "newer metadata available" note. If this is implemented, be careful which tag
it queries: the tags are currently split —
so a naive check against
latestwould report a downgrade.Acceptance Criteria
from
dist/manifest.jsonMetadataServiceexposes agetMetadataManifest()helper, cached like its siblingsen,es,ja,pt-BR,zh)manifest.jsoncannot be fetched — the pinnedconstant still renders, since it is known without a network call