Wallet Profile
The Wallet Profile panel (WalletProfilePanel) is WalletWall’s compact, single-wallet
overview. It self-fetches on-chain context for one Ethereum address and presents it as a
scannable read-only summary, then hands off to the heavier Whale Watcher
workspace for full signal analysis.
The panel is a read-only intelligence surface: it never holds custody, never signs, and
never writes to a wallet.
Panel layout
The panel renders vertically:
- Identicon header — ENS or shortened address, chain badge, copy-address, and Etherscan link
- Hero balance + supporting metric cards
- Holdings strip with composition donut
- Transaction-cadence heatmap
- Transfer flow ledger (inflow / outflow)
- Behavior labels and confidence caveats
- Ranked lists — top tokens by transfer volume, top counterparties, related pools/contracts, last 20 transfers
- Contextual onward paths
Each wallet gets a deterministic 5×5 mirrored identicon derived from its address, so the
same wallet always renders the same mark. The header shows the wallet name (ENS when
available, otherwise the shortened address), an Ethereum chain badge, a copy-to-clipboard
control, and an Etherscan link.
Outbound address links are only constructed for well-formed 0x… hex addresses
(etherscanAddress()). Non-address values (ENS, protocol names) and any unsafe scheme
such as javascript: are never turned into links — this prevents DOM-based link injection
(CodeQL js/xss-through-dom).
Hero balance and metrics
A hero card shows the wallet’s native ETH balance with an estimated USD value beneath it,
alongside three supporting metric cards:
| Metric | Source |
|---|
| Native balance | ethBalance (ETH) with totalValueUSD hint |
| Transactions | txCount — labelled “Recent sample” when the dataset is sampled |
| Counterparties | uniqueCounterparties from the baseline |
| Last active | Relative time (e.g. “2 days ago”) with the absolute date as a hint |
Holdings strip and composition donut
The embedded WalletHoldingsStrip shows
priced ERC-20 holdings — or 90-day trading exposure — from /api/wallet-portfolio. When
composition is shown, a hand-rolled SVG donut (HoldingsDonut) renders the top 5 priced
holdings plus an aggregated “Other” slice, so portfolio concentration is visible at a glance.
Holdings are sourced from the configured Dune portfolio dataset. Wallets not present in
the dataset show no holdings rather than a fabricated value, and only positions above $100
are charted.
Transaction-cadence heatmap
A daily transaction-count timeline (buildActivityTimeline) drives an activity heatmap.
Transaction counts are reliable even where per-transfer USD is missing, so the cadence
stays meaningful regardless of pricing gaps. The panel labels this explicitly as cadence
from the sampled transfers — not full wallet history.
Transfer flow ledger
The transfer flow ledger (TransferFlowLedger) is a two-column inflow/outflow view of the
wallet’s largest counterparties. It replaced an earlier SVG sankey diagram, which distorted
badly because preserveAspectRatio="none" stretched its strokes into wedges. The ledger can
display either USD-denominated flow or raw transfer counts.
Holdings value vs. transfer throughput
The panel deliberately separates two things that are easy to conflate:
- Holdings (the donut and holdings strip) — what the wallet currently holds, priced.
- Transfer volume / throughput (the “Top tokens by transfer volume” list) — the
cumulative notional that has moved through the wallet across the sampled transfers.
The token volume list is tagged “Flow, not holdings” and footnoted as throughput, not
current value, with a pointer to the Holdings card for priced positions. This avoids
implying that a high-throughput wallet is necessarily a high-value one.
Behavior labels
Structural and activity descriptors (behaviorLabels) render as status badges, with
elevated-risk signals separated into a “Confidence caveats” list. Labels are observational
descriptors, not findings of wrongdoing. A DataSourceBadge reports the provider, fetch
time, and a confidence level that drops to low when fallback data is in use.
Contextual onward paths
When an onNavigate handler is supplied, the panel renders a signal-gated “Explore with
other tools” section:
| Path | When shown | Destination |
|---|
| Review Quantum Exposure | Whenever the panel has valid wallet context | Quantum route, prefilled with the wallet (qw) |
| Check Vault Readiness | Only when vault-relevant signals are present | Stablecoin Vault route, prefilled with wallet and source=wallet-profile |
Vault Readiness is gated by isVaultRelevant(): it requires a valid EVM address plus
secondary signals such as stablecoin flow before the CTA appears, so the vault path is only
offered to wallets where read-only rehearsal is actually worth evaluating. The CTA copy
states plainly that it is a read-only evaluation with no custody and no wallet writes. This
carries a source=wallet-profile context into the Stablecoin Vault readiness flow so the
destination can acknowledge where the wallet came from.
See Stablecoin Vault for the readiness journey and custody boundaries.
Deep Dive handoff
The “Deep Dive →” actions invoke onDeepDive with the profile node, transitioning from the
compact profile into the full Whale Watcher workspace
(adversarial signals, narrative engine, protocol affinity, and the Quantum Exposure section).