User story / Problem statement
As a dApp user, I want the party, contract, and update ids the dApp renders to be clickable and resolve to their ledger record, so I can verify what happened without leaving the app. Today they link nowhere unless VITE_EXPLORER_URL points at an external explorer.
Expected outcome
Three routes — /party/:id, /contract/:id, /update/:id — render the record read through the connected wallet session's ledgerApi, plus a search box that resolves a pasted id. Pointing VITE_EXPLORER_URL at the app's own origin makes every existing Identifier link land in-app, with no change to the components rendering them.
Acceptance criteria
Alternatives considered
scan-web-ui expects a super validator's full scan API; a separate proxy backend adds a deployment. The wallet session already carries a token that reads.
Technical notes
Every read needs filtersByParty naming a party the token can read — filtersForAnyParty returns 403. These endpoints require an eventFormat body and reject requestingParties. A contract resolves only for a stakeholder party, else CONTRACT_EVENTS_NOT_FOUND, so coverage is the connected party and the vesting operator, not the network. src/utils/env.ts demands an absolute http(s) URL, so an own-origin EXPLORER needs a per-environment value or a src/utils/config.ts change.
User story / Problem statement
As a dApp user, I want the party, contract, and update ids the dApp renders to be clickable and resolve to their ledger record, so I can verify what happened without leaving the app. Today they link nowhere unless
VITE_EXPLORER_URLpoints at an external explorer.Expected outcome
Three routes —
/party/:id,/contract/:id,/update/:id— render the record read through the connected wallet session'sledgerApi, plus a search box that resolves a pasted id. PointingVITE_EXPLORER_URLat the app's own origin makes every existingIdentifierlink land in-app, with no change to the components rendering them.Acceptance criteria
src/pages/Explorer/holds the three route components, registered insrc/routes.tsxsrc/backend/config.tsshares theledgerApiseam, asLiteBackenddoesGET /v2/parties/{party}POST /v2/events/events-by-contract-idwith aneventFormatbodyPOST /v2/updates/update-by-idPOST /v2/updates/flatswith anupdateFormatbodygetExplorerLink's detectionVITE_EXPLORER_URLcan resolve to the app's own origin.env.example, thearchitecture.mdseam and the README env note updatedAlternatives considered
scan-web-uiexpects a super validator's full scan API; a separate proxy backend adds a deployment. The wallet session already carries a token that reads.Technical notes
Every read needs
filtersByPartynaming a party the token can read —filtersForAnyPartyreturns 403. These endpoints require aneventFormatbody and rejectrequestingParties. A contract resolves only for a stakeholder party, elseCONTRACT_EVENTS_NOT_FOUND, so coverage is the connected party and the vesting operator, not the network.src/utils/env.tsdemands an absolute http(s) URL, so an own-originEXPLORERneeds a per-environment value or asrc/utils/config.tschange.