feat(ui): surface the owning coldkey on the validator detail page (#6427)#6510
feat(ui): surface the owning coldkey on the validator detail page (#6427)#6510real-venus wants to merge 1 commit into
Conversation
…ONbored#6427) validatorDetailQuery already normalizes `coldkey` into ValidatorDetail, but the page only ever read it to decide whether the connected wallet owns this validator (the gate on the take modal). A visitor had no way to tell which account operates a hotkey: the identity chip shows self-declared operator identity, which is declared on the coldkey but never shows the coldkey itself, and the raw address appeared nowhere. Render it beside the hotkey it belongs to, public and unconditional -- no owner gating, since this is chain-public data every visitor can already read from the API. Use AccountAddress rather than a hand-rolled Link: it is the app's shared ss58 treatment (accounts link + entity hover preview + copy button) and its own contract notes /accounts/$ss58 resolves any ss58 whether hotkey or coldkey, so a coldkey needs no special case. Its `fallback` covers the null the query normalizes an absent coldkey to, so the empty case renders "Not reported" rather than a dead link. `break-all` on the value so the full 48-char address wraps at 375px instead of escaping the viewport -- the hotkey above it is shown in full too, and a truncated owner address would defeat the point of surfacing it.
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #6510 +/- ##
=======================================
Coverage 97.85% 97.85%
=======================================
Files 174 174
Lines 22196 22196
Branches 8798 8798
=======================================
Hits 21721 21721
Misses 81 81
Partials 394 394 🚀 New features to boost your workflow:
|
|
Warning ⏸️ LoopOver review result - manual review recommendedReview updated: 2026-07-17 17:31:31 UTC
Review summary Nits — 3 non-blocking
Decision drivers
Context & advisory signals — never blocks the verdict
Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.
Full command reference: https://loopover.ai/docs/loopover-commands 🧪 Experimental — new and may change. Visual preview
Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy. 🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.
|
JSONbored
left a comment
There was a problem hiding this comment.
Needs to be redesigned, not a fan of this implementation - feels out of place or just lazily thrown on there in relation to other elements/addresses.

Summary
validatorDetailQueryalready normalizescoldkeyintoValidatorDetail, but the pageonly ever read it to decide whether the connected wallet owns this validator (the gate on
the take modal). A visitor had no way to tell which account operates a hotkey: the identity
chip shows self-declared operator identity — which is declared on the coldkey but never
shows it — and the raw address appeared nowhere.
What Changed
Rendered it beside the hotkey it belongs to, public and unconditional. No owner gating:
this is chain-public data every visitor can already read straight from the API, and the
issue explicitly asks not to restrict it.
Why
AccountAddressrather than a hand-rolledLink: it's the app's shared ss58treatment —
/accounts/$ss58link + entity hover preview + copy button — and its owncontract already states that route "is the app's one lookup route for any ss58 value
regardless of whether it's a hotkey or coldkey, so this covers both." A coldkey needs no
special case.
Null handling is the component's own
fallbackpath: the query normalizes an absentcoldkey to
null, so that case renders "Not reported" rather than a dead link — no extraguard.
break-allon the value so the full 48-char address wraps at 375px instead of escapingthe viewport (verified in the mobile shots below). The hotkey above it is shown in full
too, and a truncated owner address would defeat the point of surfacing it.
Screenshots
Captured with
capture-pr-screenshots.mjsat the contract's fixed viewports(1280×800 / 768×1024 / 375×812), themes forced via
mg-theme,beforeserved from aworktree at the merge-base with the brand faces verified loaded on both, so the pair shares
one typeface.
The
aftershots showCOLDKEY 5GsbTgfvgCH4xdqSkiPb7EaBBFLHjWH5vfEALhJaewSFpZX9— a realowner address, distinct from the hotkey above it, linked to
/accounts/$ss58.before
after
before
after
before
after
before
after
before
after — wraps, no overflow
before
after
Validation
npm run lint --workspace=apps/ui— cleannpm run format:check --workspace=apps/ui— cleannpm run typecheck --workspace=apps/ui— cleannpm test --workspace=apps/ui— 1062/1062 passednpm run test:e2e --workspace=apps/ui— 25/26; the one failure isevidence-deep-link.spec.tson/subnets/1, which reproduces identically on pristinemainwithout this change (verified as a control) and is green on CI — aslow-local-hydration artifact, unrelated to this PR's route.
npm run build --workspace=apps/ui— cleanRegistry Safety
Closes #6427) — required.apps/ui/**only, 1 file.routeTree.gen.tsuntouched; screenshots hosted on a fork branch, not committed here.Closes #6427