@vike-io/cli 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +32 -14
  3. package/package.json +4 -4
  4. package/skills/vike/SKILL.md +75 -37
  5. package/skills/vike-alerts-setup/SKILL.md +42 -10
  6. package/skills/vike-alerts-webhook/SKILL.md +18 -10
  7. package/skills/vike-candles/SKILL.md +10 -2
  8. package/skills/vike-core/SKILL.md +6 -3
  9. package/skills/vike-daily-brief/SKILL.md +68 -0
  10. package/skills/vike-follow-the-money/SKILL.md +60 -0
  11. package/skills/vike-hl-asset-briefing/SKILL.md +48 -0
  12. package/skills/vike-hl-builder-intel/SKILL.md +39 -0
  13. package/skills/vike-hl-cohort-backtest/SKILL.md +61 -0
  14. package/skills/vike-hl-cohort-positioning/SKILL.md +58 -0
  15. package/skills/vike-hl-liquidation-radar/SKILL.md +49 -0
  16. package/skills/vike-hl-position-match/SKILL.md +4 -3
  17. package/skills/vike-hl-top-traders/SKILL.md +22 -9
  18. package/skills/vike-hl-trader-profile/SKILL.md +65 -0
  19. package/skills/vike-perp-crowding/SKILL.md +49 -0
  20. package/skills/vike-perp-funding/SKILL.md +4 -1
  21. package/skills/vike-perp-overview/SKILL.md +23 -3
  22. package/skills/vike-pm-l2-archive/SKILL.md +50 -0
  23. package/skills/vike-pm-market-diligence/SKILL.md +60 -0
  24. package/skills/vike-polymarket-market-detail/SKILL.md +20 -15
  25. package/skills/vike-polymarket-markets/SKILL.md +2 -1
  26. package/skills/vike-polymarket-smart-money/SKILL.md +1 -0
  27. package/skills/vike-polymarket-trader/SKILL.md +2 -1
  28. package/skills/vike-smart-money-discovery/SKILL.md +4 -3
  29. package/skills/vike-stream/SKILL.md +99 -0
  30. package/skills/vike-token-holder-diligence/SKILL.md +58 -0
  31. package/skills/vike-token-holders/SKILL.md +6 -4
  32. package/skills/vike-token-research/SKILL.md +6 -6
  33. package/skills/vike-token-screener/SKILL.md +3 -3
  34. package/skills/vike-token-search/SKILL.md +2 -1
  35. package/skills/vike-token-smart-money-trend/SKILL.md +57 -0
  36. package/skills/vike-token-transfers/SKILL.md +8 -6
  37. package/skills/vike-wallet-balances/SKILL.md +9 -7
  38. package/skills/vike-wallet-batch/SKILL.md +3 -3
  39. package/skills/vike-wallet-compare/SKILL.md +2 -2
  40. package/skills/vike-wallet-counterparties/SKILL.md +2 -2
  41. package/skills/vike-wallet-discover/SKILL.md +3 -1
  42. package/skills/vike-wallet-ens/SKILL.md +2 -2
  43. package/skills/vike-wallet-label-provenance/SKILL.md +5 -4
  44. package/skills/vike-wallet-pnl-history/SKILL.md +2 -2
  45. package/skills/vike-wallet-portfolio/SKILL.md +10 -8
  46. package/skills/vike-wallet-summary/SKILL.md +6 -6
  47. package/skills/vike-wallet-trace/SKILL.md +4 -3
  48. package/skills/vike-wallet-transactions/SKILL.md +2 -2
  49. package/skills/vike-wallet-who-is/SKILL.md +50 -0
  50. package/skills/vike-wallets-related/SKILL.md +52 -0
  51. package/skills.sh.json +34 -12
  52. package/src/commands/alerts.js +85 -15
  53. package/src/commands/call.js +32 -0
  54. package/src/commands/candles.js +11 -15
  55. package/src/commands/doctor.js +4 -4
  56. package/src/commands/hl.js +274 -0
  57. package/src/commands/perp.js +5 -5
  58. package/src/commands/polymarket.js +105 -5
  59. package/src/commands/search.js +10 -0
  60. package/src/commands/stream.js +308 -0
  61. package/src/commands/token.js +2 -0
  62. package/src/commands/tool-command.js +27 -0
  63. package/src/commands/wallet.js +21 -0
  64. package/src/index.js +10 -1
  65. package/src/mcp-client.js +37 -16
@@ -9,7 +9,7 @@ allowed-tools: Bash(vike-data:*)
9
9
  ## Command
10
10
 
11
11
  ```bash
12
- vike-data token holders <token_address> [--chain ethereum|bsc|base] [--limit N] [--json]
12
+ vike-data token holders <token_address> [--chain ethereum|bsc|base|hyperevm] [--limit N] [--json]
13
13
  ```
14
14
 
15
15
  ## Examples
@@ -34,10 +34,12 @@ vike-data token holders 0x6982508145454ce325ddbe47a25d4ec3d2311933 --limit 20
34
34
 
35
35
  ## Anti-patterns
36
36
 
37
- - "Top holders" here means cumulative net inflow over our recorded transfer history — NOT current on-chain balance. A wallet that bought $10M and sold $9M shows `net_flow_usd = $1M`, even if current balance is zero. The top rows are very often intermediaries (exchange wallets, lending protocols, MEV bots) with huge `volume_usd` against a small net: read this as "who moves the most of this token". **Always call this out** when reporting top holders. For what one specific wallet holds right now use `vike-data wallet balances <addr>` (Ethereum and BSC).
38
- - There is no concentration metric (top-N share of supply) in the output; don't compute one from `net_flow_usd`.
37
+ - "Top holders" here means cumulative net inflow over our recorded transfer history — NOT current on-chain balance. A wallet that bought $10M and sold $9M shows `net_flow_usd = $1M`, even if current balance is zero. The top rows are very often intermediaries (exchange wallets, lending protocols, MEV bots) with huge `volume_usd` against a small net: read this as "who moves the most of this token". **Always call this out** when reporting top holders. For the largest current BALANCES use `vike-data call token_holders --args '{"token_address":"0x...","chain":"ethereum","limit":50,"sort":"balance"}'` (adds `balance`, `value_usd`, `supply_pct`; not on every chain), and for what one wallet holds `vike-data wallet balances <addr> --chains <chain>`.
38
+ - Don't compute a share of supply from `net_flow_usd`; the balance ranking above has `supply_pct`.
39
39
  - Don't list `tx_count = 1` whales as "smart money" without context — could be an airdrop receiver who never sold.
40
- - For BSC tokens, pass `--chain bsc` explicitly; default is ethereum.
40
+ - Pass `--chain` explicitly for anything but Ethereum (`bsc`, `base`, `hyperevm`); the default is ethereum.
41
+ - **It is slow on busy tokens**: the tool scans the whole chain for the token (tens of seconds). Run it once and don't retry in a loop.
42
+ - To classify the top holders (exchange, contract, fresh, risk-flagged) use `vike-token-holder-diligence`.
41
43
 
42
44
  ## Pairs well with
43
45
 
@@ -18,13 +18,12 @@ Multi-call token research workflow. It characterises WHO is moving the token (th
18
18
 
19
19
  2. **Recent buyers + sellers** (parallel calls)
20
20
  ```bash
21
- vike-data token transfers <addr> --tab bought --period 24h --chain <chain> --json
22
- vike-data token transfers <addr> --tab sold --period 24h --chain <chain> --json
21
+ vike-data token transfers <addr> --tab bought --period 24h --chain <chain> --hide-contracts --json
22
+ vike-data token transfers <addr> --tab sold --period 24h --chain <chain> --hide-contracts --json
23
23
  ```
24
- Each call returns the top 10 wallets for one side.
24
+ Each call returns the top 10 net buyers or net sellers, ranked by net USD; `--hide-contracts` leaves out the pools and routers we know of.
25
25
 
26
- 3. **Read `net_tokens`, not `bought`.** `bought` counts every inbound transfer (flash-loan and router round trips included). Merge the two lists by `address`, then:
27
- - drop rows where `|net_tokens|` is below 1% of `max(bought, sold)`: they are round trips, not a position;
26
+ 3. **Read `net_tokens` and `net_usd`** (a net buyer's `net_usd` is negative). Merge the two lists by `address`, then:
28
27
  - label the rest with `vike-data wallet batch <addrs...> --chain <chain>` and drop CEX / router / contract rows if the user wants "real" flow;
29
28
  - split what is left into net accumulators (`net_tokens > 0`) and net distributors (`net_tokens < 0`) and add up each side's `|net_usd|`.
30
29
 
@@ -54,5 +53,6 @@ Step 1: free. Step 2: 2 calls × 2 credits. Step 3 labels: 2 credits. Total ≈
54
53
 
55
54
  ## Pairs well with
56
55
 
57
- - `vike-smart-money-discovery` to see whether the smart-money cohort is flowing into the token
56
+ - `vike-smart-money-discovery` to see whether the smart-money cohort is flowing into the token; `vike-token-smart-money-trend` for its direction over time
57
+ - `vike-token-holder-diligence` for who sits at the top (exchanges, contracts, fresh wallets, risk flags)
58
58
  - `vike-perp-funding` if the token has a perp listing (BTC/ETH/SOL/major alts)
@@ -10,7 +10,7 @@ allowed-tools: Bash(vike-data:*)
10
10
 
11
11
  ```bash
12
12
  vike-data token screener
13
- [--chain ethereum|bsc|base]
13
+ [--chain ethereum|bsc|base|hyperevm]
14
14
  [--window 24h|7d|30d|90d]
15
15
  [--sort volume|net_inflow|holders|smart_inflow]
16
16
  [--limit N] (default 20, max 100)
@@ -20,7 +20,7 @@ vike-data token screener
20
20
  [--json]
21
21
  ```
22
22
 
23
- `--smart-money-only` and `--sort smart_inflow` exist for `--chain ethereum` only; on `bsc` and `base` they are a 400.
23
+ `--smart-money-only` and `--sort smart_inflow` exist for `--chain ethereum` only; on `bsc`, `base` and `hyperevm` they are a 400.
24
24
 
25
25
  ## Examples
26
26
 
@@ -76,7 +76,7 @@ vike-data token screener --min-volume 1000000 --min-holders 100 --sort net_inflo
76
76
  - Don't use `--window 24h --sort smart_inflow` for hot-new-token discovery: smart money usually positions before the 24h window; try `--window 7d`.
77
77
  - Don't omit `--min-holders` when sorting by `holders`: junk airdrops with 50,000 one-transaction addresses dominate the top otherwise.
78
78
  - Don't omit `--min-volume` when sorting by `net_inflow`: tiny tokens with $100 net flow can rank high in % terms.
79
- - Don't use `--smart-money-only` on `bsc` or `base`: it is a 400, not an empty result.
79
+ - Don't use `--smart-money-only` on `bsc`, `base` or `hyperevm`: it is a 400, not an empty result.
80
80
 
81
81
  ## Cost note
82
82
 
@@ -11,7 +11,7 @@ Symbol/name → address resolver.
11
11
  ## Command
12
12
 
13
13
  ```bash
14
- vike-data token search <query> [--chain ethereum|bsc|base] [--limit N] [--json]
14
+ vike-data token search <query> [--chain ethereum|bsc|base|hyperevm] [--limit N] [--json]
15
15
  ```
16
16
 
17
17
  ## Example
@@ -26,6 +26,7 @@ vike-data token search PEPE --chain ethereum --limit 5
26
26
  ## When to use
27
27
 
28
28
  - Any time the user mentions a token by symbol — always confirm the address before downstream calls.
29
+ - `--chain hyperevm` searches a small registry (about 50 tokens), so no match may only mean the token is not in it. For a name across every chain, plus live price and the vike.io page, `vike-data search <name>` (its `tokens` section).
29
30
  - The default chain is **ethereum**; if the user asks "what's the address of CAKE", default to **bsc** if the symbol is bsc-native.
30
31
 
31
32
  ## Anti-patterns
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: vike-token-smart-money-trend
3
+ description: Is the smart-money cohort entering, holding or exiting one Ethereum token over time - the cohort's net flow across 24h, 7d, 30d and 90d, differenced into disjoint slices, then the wallets behind the latest move. Use when the user asks "is smart money still buying X" / "did smart money exit X" / "how long has smart money been accumulating X" / "smart money trend for X".
4
+ allowed-tools: Bash(vike-data:*)
5
+ ---
6
+
7
+ # vike-token-smart-money-trend
8
+
9
+ Direction over time for ONE token, on **Ethereum only** (`--smart-money-only` and `--sort smart_inflow` are a 400 on bsc, base and hyperevm). For "which tokens is the cohort buying right now" use `vike-smart-money-discovery`. About 18 credits.
10
+
11
+ ## Chain
12
+
13
+ ```bash
14
+ vike-data token search ENA --chain ethereum --limit 3 --json # 0 the address
15
+ vike-data token screener --chain ethereum --window 24h --sort smart_inflow --smart-money-only --limit 100 --json # 3
16
+ vike-data token screener --chain ethereum --window 7d --sort smart_inflow --smart-money-only --limit 100 --json # likewise 30d, 90d
17
+ # find the token's row in each
18
+ vike-data token transfers <addr> --tab bought --period 7d --chain ethereum --hide-contracts --json # 2 top 10 net buyers
19
+ vike-data token transfers <addr> --tab sold --period 7d --chain ethereum --hide-contracts --json # 2 top 10 net sellers
20
+ vike-data wallet batch <those addresses> --chain ethereum --json # 2 drop cex / dex / market_maker rows
21
+ ```
22
+
23
+ ## Reading
24
+
25
+ In smart-money mode a row is the COHORT's flow in that token: `net_flow_usd` = `in_usd` - `out_usd`, `unique_holders` = cohort wallets active, `tx_count`. Rows are sorted by `net_flow_usd`. The token absent from the top 100 means its cohort net flow is below the 100th row's, not that the cohort has no flow. Skip `0x000...0` (the native coin).
26
+
27
+ **The windows overlap, so difference them** into disjoint slices before reading a trend. A window of N days is every UTC calendar day from `today - N` to today (today still in progress), so `24h` is yesterday plus today, not a rolling 24 hours:
28
+
29
+ | Slice | = | Calendar days |
30
+ |---|---|---|
31
+ | newest | 24h | today and yesterday |
32
+ | rest of the week | 7d - 24h | the 6 days before |
33
+ | rest of the month | 30d - 7d | the 23 days before that |
34
+ | rest of the quarter | 90d - 30d | the 60 days before that |
35
+
36
+ **Compare signs, not magnitudes**: the slices differ in length and today is partial. Example, ENA on 2026-10-19: 24h +$14.9M, 7d +$38.3M, 30d +$27.9M, 90d +$54.0M, so newest +$14.9M, rest of the week +$23.4M, rest of the month -$10.4M, rest of the quarter +$26.1M: the cohort sold for three weeks, then came back in the last week.
37
+
38
+ | Newest | Rest of week | Rest of month | Read |
39
+ |---|---|---|---|
40
+ | + | + | + | sustained accumulation |
41
+ | + | + | - | re-accumulation: turned from seller to buyer |
42
+ | + | - | any | a short buy after a quiet or selling week: weak until the week confirms |
43
+ | - | + | any | reducing after a build |
44
+ | - | - | - | distribution |
45
+
46
+ Then name the wallets behind the latest slice from the two `token transfers` lists. They are ranked by net USD (`--tab bought` = net buyers, whose `net_usd` is NEGATIVE: net USD bought is `-net_usd`); `net_tokens` is the net in whole tokens. `--hide-contracts` leaves out the pools and routers we know of; still drop the rows `wallet batch` calls `cex`, `dex` or `market_maker`: an exchange hot wallet can top the net-buyer list.
47
+
48
+ ## Anti-patterns
49
+
50
+ - No tool lists cohort members, and the `token transfers` lists are the top 10 net movers, not the cohort: say the named wallets are the largest net movers, not proven cohort members.
51
+ - Don't read a 1-day sign as a trend, and don't read a screener sign as a price call.
52
+ - Don't use it on bsc, base or hyperevm; there the answer is "no cohort data", not "no smart money".
53
+
54
+ ## Pairs well with
55
+
56
+ - `vike-smart-money-discovery` (which tokens), `vike-token-screener` (columns), `vike-token-holder-diligence` (who holds it)
57
+ - `vike-perp-crowding` if the token has a perp listing
@@ -12,7 +12,8 @@ allowed-tools: Bash(vike-data:*)
12
12
  vike-data token transfers <token_address>
13
13
  [--tab bought|sold] # default sold; ONE side per call
14
14
  [--period 1h|24h|7d|30d] # default 24h
15
- [--chain ethereum|bsc|base|all]
15
+ [--chain ethereum|bsc|base|hyperevm|all]
16
+ [--hide-contracts] # leave out the pools, routers and other contracts we know of
16
17
  [--json]
17
18
  ```
18
19
 
@@ -20,8 +21,8 @@ There is no `--limit`: every call returns the top 10 wallets for that side. For
20
21
 
21
22
  ## When to use
22
23
 
23
- - "Who's accumulating X?" → `--tab bought --period 24h`, then read `net_tokens`
24
- - "Who's dumping X?" → `--tab sold --period 24h`, then read `net_tokens`
24
+ - "Who's accumulating X?" → `--tab bought --period 24h --hide-contracts`
25
+ - "Who's dumping X?" → `--tab sold --period 24h --hide-contracts`
25
26
  - "Smart money on X this week" → `--tab bought --period 7d`, label the addresses with `vike-data wallet batch`
26
27
 
27
28
  ## Output columns
@@ -32,7 +33,7 @@ There is no `qty`, `usd_value`, `label` or `tx_count` column. To label an addres
32
33
 
33
34
  ## Reading tips
34
35
 
35
- - **`bought` is every inbound transfer, not purchases.** It includes flash-loan and router round trips. A wallet at the top of `--tab bought` with `bought ≈ sold` and `net_tokens ≈ 0` is a bot or venue passing tokens through, not a buyer. **Rank and judge by `net_tokens`** (bought − sold): positive = net accumulator, negative = net distributor.
36
+ - **The rows are the top 10 NET buyers (`--tab bought`) or net sellers, ranked by net USD.** Wallets that only pass the token through (bought ≈ sold) are not listed, but a row can still be a pool, vault or settlement contract: `--hide-contracts` leaves out the ones we know of, and `wallet batch` labels the rest. `net_tokens` (bought − sold) is the net in whole tokens.
36
37
  - **Signs differ by convention.** `net_usd = usd_received − usd_spent`, so a net buyer has `net_tokens > 0` and `net_usd < 0`, and a net seller has `net_usd > 0`. Do not read a positive `net_usd` as "bought".
37
38
  - The two sides of the same period are separate top-10 lists. The same wallet in both = market maker / churn, not a signal.
38
39
  - The window ends at the token's newest PRICED row, not at the current time. For an illiquid token it can be hours behind "now".
@@ -41,12 +42,13 @@ There is no `qty`, `usd_value`, `label` or `tx_count` column. To label an addres
41
42
 
42
43
  ## Anti-patterns
43
44
 
44
- - Don't call a wallet a buyer or seller from `bought` / `sold` alone. Check `net_tokens`.
45
+ - Don't call a contract row a buyer: use `--hide-contracts`, then label what is left.
45
46
  - Don't request `--chain all` unless you really need cross-chain: it maps the address to the token's address on each chain and is slower.
46
47
  - 1h period is sparse for low-liquidity tokens. Use 24h as the default starting window.
47
- - Don't treat the 10 rows as the token's whole market: they are the top 10 by volume on one side.
48
+ - Don't treat the 10 rows as the token's whole market: they are the top 10 net movers on one side.
48
49
 
49
50
  ## Pairs well with
50
51
 
51
52
  - `vike-data wallet batch <addr...>` to label the rows and drop CEX / router rows
52
53
  - `vike-data wallet summary <addr>` to profile any interesting buyer/seller
54
+ - `vike-token-smart-money-trend` to put the buyers next to the smart-money cohort's flow over time
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: vike-wallet-balances
3
- description: Current token balances for a wallet on the chains the server scans (Ethereum and BSC today), read from the chain at request time, with a USD value where the token is priced. Use when the user asks "what does this wallet hold" / "current portfolio of X" / "show top holdings".
3
+ description: Current token balances for a wallet on Ethereum, BSC, Base and HyperEVM, read from the chain at request time, with a USD value where the token is priced. Use when the user asks "what does this wallet hold" / "current portfolio of X" / "show top holdings".
4
4
  allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
@@ -10,12 +10,12 @@ allowed-tools: Bash(vike-data:*)
10
10
 
11
11
  ```bash
12
12
  vike-data wallet balances <address>
13
- [--chains ethereum,bsc] (default: every chain the server scans)
13
+ [--chains ethereum,bsc,base,hyperevm] (default: all four)
14
14
  [--min-usd 1] (hide holdings worth less; default 1)
15
15
  [--json]
16
16
  ```
17
17
 
18
- `vike-data schema --pretty` shows the current chain list. A chain the tool does not scan is not silently skipped: it is named in `chain_errors`.
18
+ Scanning all four chains is slow (tens of seconds for a busy wallet): pass `--chains` with the chain you need. Any other chain (arbitrum, polygon...) is not skipped silently: it is named in `chain_errors`. Each holding carries its own `chain`, so this is also the quickest way to see WHERE a wallet's value is before choosing `--chain` for the per-chain wallet commands.
19
19
 
20
20
  ## Example
21
21
 
@@ -33,17 +33,19 @@ vike-data wallet balances 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 --chains et
33
33
  "holdings": [
34
34
  { "chain": "ethereum", "symbol": "ENS", "name": "Ethereum Name Service", "address": "0xc183...", "balance": 1144.04, "balance_raw": "1144036076063671431479", "usd_value": 6843.62, "usd_price": 5.982 },
35
35
  { "chain": "ethereum", "symbol": "WEI", "address": "0x0000...", "balance": 1.0, "balance_raw": "1", "usd_value": null, "usd_price": null },
36
- { "chain": "ethereum", "symbol": "ETH", "name": "ETH", "address": null, "balance": 2.5, "balance_raw": "2500000000000000000", "usd_value": null, "usd_price": null }
36
+ { "chain": "ethereum", "symbol": "ETH", "name": "ETH", "address": null, "balance": 2.5, "balance_raw": "2500000000000000000", "usd_value": 9500.0, "usd_price": 3800.0 }
37
37
  ]
38
38
  }
39
39
  ```
40
40
 
41
- Holdings are sorted by `usd_value` descending with unpriced rows (the native coin among them) last. `chain_errors` appears only when a requested chain was refused or failed.
41
+ Holdings are sorted by `usd_value` descending with unpriced rows last. `chain_errors` appears only when a requested chain was refused or failed.
42
42
 
43
43
  ## Reading
44
44
 
45
45
  - **`usd_value: null` is a holding, not an error**: the token has no price feed. `total_usd` sums only priced holdings, so read it as a floor, never as net worth, and never infer "worthless" from a null.
46
- - **The chain's native coin (ETH, BNB) is a row** with `usd_value: null`, and it is **left out of `total_usd`**. Report the native balance from its own `balance` field. It is always listed, whatever `--min-usd` says.
46
+ - **The chain's native coin (ETH, BNB, HYPE) is a row** whenever its balance is not zero, whatever `--min-usd` says, with a USD value (counted in `total_usd`) where a price exists.
47
+ - **On `base` and `hyperevm` a row has `symbol`, `name`, `balance` and `usd_value` only for tokens we map and price** (about 170 on base, about 50 on hyperevm). `--min-usd 0` adds every other token the wallet holds, with its contract `address` and `balance_raw` and the rest `null`: often thousands of airdrop-spam rows, so use it deliberately.
48
+ - `hyperevm` is the HyperEVM chain only: HyperCore (Hyperliquid spot or perp accounts) is not included; Hyperliquid perp equity is `vike-data hl wallet <address>`.
47
49
  - **Any `--min-usd` above 0 also drops unpriced holdings** (an unpriced holding cannot show it clears the floor). `--min-usd 0` lists everything, including airdrop spam.
48
50
  - `total_usd` covers `chains_scanned` only. The wallet may hold value on chains the tool does not scan: say so when relevant.
49
51
  - Stablecoin-heavy wallet → likely waiting for a buy / parked dry powder
@@ -53,7 +55,7 @@ Holdings are sorted by `usd_value` descending with unpriced rows (the native coi
53
55
 
54
56
  ## Anti-patterns
55
57
 
56
- - Don't report `total_usd` as the wallet's value without "of priced tokens" and the native balance next to it.
58
+ - Don't report `total_usd` as the wallet's value without "of priced tokens".
57
59
  - For wallets with 100+ tokens, the response is large — use `--min-usd 100` or higher to focus on meaningful holdings.
58
60
  - This is a point-in-time read, not history. For how the wallet got here use `wallet pnl-history`.
59
61
 
@@ -10,7 +10,7 @@ allowed-tools: Bash(vike-data:*)
10
10
 
11
11
  ```bash
12
12
  vike-data wallet batch <addr1> <addr2> <addr3> ...
13
- [--chain ethereum|bsc|base] # default ethereum; labels and flows are read from THAT chain's tables
13
+ [--chain ethereum|bsc|base|hyperevm] # default ethereum; labels and flows are read from THAT chain's tables
14
14
  [--json]
15
15
  ```
16
16
 
@@ -37,8 +37,8 @@ One row per INPUT address (preserves input order — useful when joining back to
37
37
  ## Chain behaviour
38
38
 
39
39
  - `--chain` picks the label table and the 30-day flow table. Before 2026-10-19 it was accepted and ignored (`bsc` and `base` returned Ethereum labels), so earlier results for those chains are Ethereum's.
40
- - **The four 30-day fields (`net_30d_usd`, `volume_30d_usd`, `tx_30d`, `tokens_30d_count`) are `null`, not 0,** where we hold no flow data: every `bsc` address, and any address we have no label for (`found: false`). Don't report null as zero activity.
41
- - `found: false` = the address is not in that chain's label table. It is not proof the wallet is new or clean.
40
+ - **The four 30-day fields (`net_30d_usd`, `volume_30d_usd`, `tx_30d`, `tokens_30d_count`) are `null`, not 0,** for an address we have no label for (`found: false`). Don't report null as zero activity.
41
+ - `found: false` = the address is not in that chain's label table. It is not proof the wallet is new or clean. Labels are sparse on `hyperevm`, so most rows there will be `found: false`.
42
42
 
43
43
  ## Reading
44
44
 
@@ -10,13 +10,13 @@ allowed-tools: Bash(vike-data:*)
10
10
 
11
11
  ```bash
12
12
  vike-data wallet compare <address_a> <address_b>
13
- [--chain ethereum|bsc|base]
13
+ [--chain ethereum|bsc|base|hyperevm]
14
14
  [--window 24h|7d|30d|90d|180d|all]
15
15
  [--limit N] (max 50)
16
16
  [--json]
17
17
  ```
18
18
 
19
- Compares exactly two wallets. `--chain base` is accepted, but per-wallet transfer data is documented for Ethereum and BSC: treat an empty Base result as "not covered", not "no shared activity".
19
+ Compares exactly two wallets on one chain (`ethereum`, `bsc`, `base` or `hyperevm`; shared-counterparty labels come from that chain's own label table). Busy wallets are slow (about 20 s for a pair of market makers). For the full verdict with exchanges and routers removed, use `vike-wallets-related`.
20
20
 
21
21
  ## Output
22
22
 
@@ -10,13 +10,13 @@ allowed-tools: Bash(vike-data:*)
10
10
 
11
11
  ```bash
12
12
  vike-data wallet counterparties <address>
13
- [--chain ethereum|bsc|base]
13
+ [--chain ethereum|bsc|base|hyperevm]
14
14
  [--window 24h|7d|30d|90d|180d|all]
15
15
  [--limit N] (max 50)
16
16
  [--json]
17
17
  ```
18
18
 
19
- `--chain base` is accepted, but per-wallet transfer data is documented for Ethereum and BSC: treat an empty Base result as "not covered", not "no activity".
19
+ Chains: `ethereum`, `bsc`, `base`, `hyperevm`. `entity` / `wallet_type` come from THAT chain's label table (empty string when unlabelled). `wallet summary` names the chain it answered for; run this per chain for the others.
20
20
 
21
21
  ## Example
22
22
 
@@ -13,11 +13,13 @@ vike-data wallet discover
13
13
  [--window 24h|7d|30d|90d|all]
14
14
  [--sort volume|inflow|outflow|net_flow|tx_count|pnl]
15
15
  [--order asc|desc]
16
- [--chain ethereum|bsc]
16
+ [--chain ethereum|bsc|base|hyperevm]
17
17
  [--size N] # default 10, max 20
18
18
  [--json]
19
19
  ```
20
20
 
21
+ **On `base` and `hyperevm` pass `--window all`**: the command sends `30d` by default, and the shorter windows there answer only while they were rebuilt in the last 2 days (otherwise a 400). `ethereum` and `bsc` take every window.
22
+
21
23
  ## When to use
22
24
 
23
25
  | Question | Flags |
@@ -25,12 +25,12 @@ vike-data wallet ens 0x28c6c06298d514db089934071355e5743bf21d60
25
25
  ## When to use
26
26
 
27
27
  - Right after any tool returns a wallet address — show ENS as a secondary label
28
- - When the user pastes an address and asks "what is its ENS name" (for "who is this", start with `vike-data labels <addr>`; ENS is a display name, not an identity)
28
+ - When the user pastes an address and asks "what is its ENS name" (for "who is this", use `vike-wallet-who-is`; ENS is a display name, not an identity)
29
29
  - When you're about to display a leaderboard with addresses — enrich each row with ENS if available
30
30
 
31
31
  ## Direction
32
32
 
33
- **Reverse only: address → name.** There is no name → address lookup: if the user gives `vitalik.eth`, say the tool cannot resolve it and ask for the address. The only parameter is `address`.
33
+ **Reverse only: address → name.** This command has no name → address lookup; for `vitalik.eth` run `vike-data search vitalik.eth`, which searches the address the name points to. The only parameter is `address`.
34
34
 
35
35
  ## Anti-patterns
36
36
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: vike-wallet-label-provenance
3
- description: Multi-source label cascade for an Ethereum wallet — shows what each upstream label source AND our in-house heuristic classifier says about an address, with consensus entity/type and per-source attribution. Use when the user asks "who is this address" / "what do you know about this wallet" / "is this address labeled" / "why is this wallet labeled X".
3
+ description: Multi-source label cascade for an Ethereum wallet — shows what each upstream label source AND our in-house heuristic classifier says about an address, with consensus entity/type and per-source attribution. Use when the user asks "what do the label sources say about 0x..." / "is this address labeled" / "why is this wallet labeled X" / "do the sources agree on this label".
4
4
  allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
@@ -14,7 +14,7 @@ The headline differentiator: we don't just show a label, we show **which sources
14
14
  vike-data labels <address> [--json]
15
15
  ```
16
16
 
17
- Ethereum wallets only. For another chain, or many addresses, use `vike-data wallet batch --chain ethereum|bsc|base`, which reads each chain's own label table.
17
+ Ethereum wallets only. For another chain, or many addresses, use `vike-data wallet batch --chain ethereum|bsc|base|hyperevm`, which reads each chain's own label table. For "who is this wallet" as a whole (labels, ENS, chain, exchanges, counterparties) use `vike-wallet-who-is`.
18
18
 
19
19
  ## Example
20
20
 
@@ -56,7 +56,7 @@ Sources are anonymised on the wire (`provider_a`, `provider_b`, ...). There are
56
56
  - **Only 1 source (± heuristic)** → moderate; mention "labeled by one source"
57
57
  - **Only the heuristic** → low; mention "predicted by heuristic"
58
58
  - **`found: true` with no sources** → the wallet is in our label table but no raw source labels it
59
- - **`found: false`** → the wallet is missing from our labelled-wallet table, and no source is consulted at all. It does NOT prove that no provider labels it. Say "not in our label table", not "unlabeled" or "clean".
59
+ - **`found: false`** → every source was read and none knows the address, and it is not in our label table (`found` is true when ANY source knows it). It does NOT prove the wallet is clean or new: our sources do not cover every wallet. Say "no label source knows it", not "clean".
60
60
 
61
61
  Early answers (before 2026-10-19) carried only the Arkham-derived source and the heuristic, so older transcripts undercount sources.
62
62
 
@@ -64,7 +64,8 @@ Early answers (before 2026-10-19) carried only the Arkham-derived source and the
64
64
 
65
65
  - Don't quote any single provider's category field as "the category" — provider taxonomies vary; the `consensus.wallet_type` is the unified field.
66
66
  - A `risk_flag` of `scam` / `sanctioned` / `phishing` is high-stakes — always mention it explicitly, never bury it.
67
- - Don't use this for a BSC or Base address: it reads Ethereum tables only.
67
+ - Don't use this for a BSC, Base or HyperEVM address: the consensus reads Ethereum tables only (only source `provider_e`, Polymarket wallets and their funders, answers on any EVM chain).
68
+ - `consensus.wallet_type` can be wrong when sources disagree (the entity "vitalik buterin" read `dex` because one source says sushiswap): read the `sources` before trusting the type.
68
69
 
69
70
  ## Pairs well with
70
71
 
@@ -10,12 +10,12 @@ allowed-tools: Bash(vike-data:*)
10
10
 
11
11
  ```bash
12
12
  vike-data wallet pnl-history <address>
13
- [--chain ethereum|bsc|base]
13
+ [--chain ethereum|bsc|base|hyperevm]
14
14
  [--days N] (max 365, default 30)
15
15
  [--json]
16
16
  ```
17
17
 
18
- `--chain base` is accepted, but per-wallet transfer data is documented for Ethereum and BSC: treat an empty Base result as "not covered", not "no activity".
18
+ Chains: `ethereum`, `bsc`, `base`, `hyperevm`, one chain per call.
19
19
 
20
20
  ## Output
21
21
 
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: vike-wallet-portfolio
3
- description: Composite wallet view — combines ENS + labels + token balances + recent flow + top counterparties in one report. Use when the user gives a wallet address and asks for a complete picture ("full report on X" / "everything about this wallet" / "wallet snapshot" / "who is this wallet").
3
+ description: Holdings-and-activity snapshot of one wallet — ENS, labels, token balances across Ethereum, BSC, Base and HyperEVM, recent flow and top counterparties in one report. Use when the user gives a wallet address and asks for a complete picture ("full report on X" / "everything about this wallet" / "wallet snapshot" / "what does this wallet hold and do").
4
4
  allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
7
7
  # vike-wallet-portfolio
8
8
 
9
- Multi-call playbook for a complete wallet snapshot. It reports what the tools return: identity, token balances, flows and counterparties. There is **no DeFi-position data** in any tool, so never report protocol positions.
9
+ Multi-call playbook for a complete wallet snapshot. It reports what the tools return: identity, token balances, flows and counterparties. There is **no DeFi-position data** in any tool, so never report protocol positions. For identity alone ("who is this", "is it an exchange") use `vike-wallet-who-is`.
10
10
 
11
11
  ## Workflow (run in parallel where possible)
12
12
 
@@ -15,20 +15,20 @@ ADDR=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
15
15
 
16
16
  vike-data wallet ens $ADDR --json & # 1 credit
17
17
  vike-data labels $ADDR --json & # 1 credit
18
- vike-data wallet summary $ADDR --json & # 2 credits
19
- vike-data wallet balances $ADDR --json & # 3 credits (Ethereum and BSC)
20
- vike-data wallet counterparties $ADDR --window 30d --limit 10 --json & # 2 credits
18
+ vike-data wallet summary $ADDR --json & # 2 credits - names its `chain`
19
+ vike-data wallet balances $ADDR --json & # 3 credits - all four chains; add --chains to narrow (faster)
21
20
  wait
21
+ vike-data wallet counterparties $ADDR --chain <summary.chain> --window 30d --limit 10 --json # 2 credits
22
22
  ```
23
23
 
24
- Then label the counterparties in one call: `vike-data wallet batch <cp1> <cp2> ... --json` (2 credits). A top counterparty that is a CEX tells you which exchange the wallet uses; an unlabelled high-volume counterparty is worth a `wallet compare` or `wallet trace`.
24
+ Then label the counterparties with an empty `entity` in one call: `vike-data wallet batch <cp1> <cp2> ... --chain <summary.chain> --json` (2 credits). A top counterparty that is a CEX tells you which exchange the wallet uses; an unlabelled high-volume counterparty is worth a `wallet compare` or `wallet trace`.
25
25
 
26
26
  ## Report template
27
27
 
28
28
  > **`<ENS or 0x...>` — wallet snapshot**
29
29
  > - **Identity:** `<ens.eth>` · `<entity (from labels)>` · `<wallet_type>` (confidence: `<H/M/L>`). If `labels` says `found: false`, say "not in our label table".
30
- > - **Priced token holdings:** `$X` (floor: unpriced tokens and the native coin are excluded from the total) across `<chains_scanned>`. Top 3 by USD: `<symbol1 $X>`, ... Native balance: `<n ETH/BNB>`.
31
- > - **30d flow:** `+/-$Z` net (`summary["30d"].net_flow`), one chain.
30
+ > - **Priced token holdings:** `$X` (floor: unpriced tokens are excluded; on Base and HyperEVM only mapped and priced tokens show) across `<chains_scanned>`. Top 3 by USD: `<symbol1 $X on chain>`, ... Native balance: `<n ETH/BNB/HYPE>`.
31
+ > - **30d flow on `<chain>`:** `+/-$Z` net (`summary["30d"].net_flow`), one chain.
32
32
  > - **Activity:** `<tx_count>` transfers in 30d, `<tokens_traded>` tokens traded all-time.
33
33
  > - **Top counterparties:** `<entity or address>` · `$volume`, ...
34
34
  > - **Vibe check:** `<saver / trader / farmer / institutional / inactive / fresh>`
@@ -51,9 +51,11 @@ Then label the counterparties in one call: `vike-data wallet batch <cp1> <cp2> .
51
51
 
52
52
  ## When to use a focused skill instead
53
53
 
54
+ - "Who is X" / "is it an exchange" → `vike-wallet-who-is`
54
55
  - "Just labels for X" → `vike-wallet-label-provenance`
55
56
  - "What does X hold" → `vike-wallet-balances`
56
57
  - "Top counterparties of X" → `vike-wallet-counterparties`
58
+ - "X's Hyperliquid account" → `vike-hl-trader-profile`
57
59
 
58
60
  ## Pairs well with
59
61
 
@@ -12,19 +12,19 @@ allowed-tools: Bash(vike-data:*)
12
12
  vike-data wallet summary <address> [--json]
13
13
  ```
14
14
 
15
- No chain flag: one call returns every window, for one chain.
15
+ No chain flag: one call returns every window, for one chain. To ask a given chain use the tool directly: `vike-data call wallet_summary --args '{"address":"0x...","chain":"base"}'` (`ethereum`, `bsc`, `base` or `hyperevm`).
16
16
 
17
17
  ## Output
18
18
 
19
- A JSON object keyed by window: `all`, `90d`, `30d`, `7d`, `24h`. Each window holds:
19
+ A JSON object with a `chain` field and one block per window: `all`, `90d`, `30d`, `7d`, `24h`. Each window holds:
20
20
 
21
21
  `total_volume`, `total_inflow`, `total_outflow`, `net_flow` (USD), `tx_count`, `tokens_traded`, `first_seen`, `last_active`.
22
22
 
23
- - **One chain only.** The figures are for the chain where the wallet was most recently active, never summed across chains, and the response does not say which. For a specific chain use `wallet transactions --chain` or `wallet pnl-history --chain`.
24
- - **`tokens_traded`, `first_seen` and `last_active` are all-time** and repeat in every window: read them from `all` and ignore the copies. There is no per-window token count.
23
+ - **One chain only, named in `chain`.** Without a chain the figures are for the more recently active of Ethereum and BSC, never summed; Base or HyperEVM answer only for a wallet with no priced Ethereum or BSC volume. Always say which chain the numbers are for; `wallet balances` shows which chain holds the value.
24
+ - **`tokens_traded` is per window** (distinct tokens moved in it). **`first_seen` and `last_active` are all-time** and repeat in every window: read them from `all`.
25
25
  - A window with no activity is present and zeroed (`24h` often is), not omitted.
26
26
  - Refreshed nightly: a wallet active in the last hours may not show yet.
27
- - It carries no PnL, no holdings, no labels and no Hyperliquid data. For those: `wallet balances`, `labels` / `wallet batch`, and `perp top-traders`.
27
+ - It carries no PnL, no holdings, no labels and no Hyperliquid data. For those: `wallet balances`, `labels` / `wallet batch`, and `hl wallet`.
28
28
 
29
29
  ## Reading tips
30
30
 
@@ -39,7 +39,7 @@ A JSON object keyed by window: `all`, `90d`, `30d`, `7d`, `24h`. Each window hol
39
39
 
40
40
  - Don't claim a wallet is "smart money" based on summary alone: it has no PnL. Check labels with `vike-data labels <addr>` or `vike-data wallet batch`.
41
41
  - A single big inflow can dominate `net_flow` for a window — eyeball `tx_count` to gauge whether it's one trade or many.
42
- - Don't describe the result as "across ETH/BSC/Base": it is one chain.
42
+ - Don't describe the result as "across ETH/BSC/Base/HyperEVM": it is one chain.
43
43
 
44
44
  ## Pairs well with
45
45
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: vike-wallet-trace
3
- description: Counterparty graph traversal from a root wallet outward. At each hop, expand to the top N counterparties by USD volume; edges carry the direction of the flow. Use when the user asks "where did funds from X go" / "follow the money 3 hops out" / "trace the network around this wallet" / wallet investigation.
3
+ description: Counterparty graph traversal from a root wallet outward. At each hop, expand to the top N counterparties by USD volume; edges carry the direction of the flow. Use when the user asks for "the counterparty graph of X" / "trace 3 hops around this wallet" / "show the network around X" / "who is connected to this wallet within N hops".
4
4
  allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
@@ -10,7 +10,7 @@ allowed-tools: Bash(vike-data:*)
10
10
 
11
11
  ```bash
12
12
  vike-data wallet trace <address>
13
- [--chain ethereum|bsc|base]
13
+ [--chain ethereum|bsc|base|hyperevm]
14
14
  [--depth N] (1-5, default 2)
15
15
  [--width N] (1-10, default 5)
16
16
  [--window 24h|7d|30d|90d|all]
@@ -18,7 +18,7 @@ vike-data wallet trace <address>
18
18
  [--json]
19
19
  ```
20
20
 
21
- `--chain base` is accepted, but per-wallet transfer data is documented for Ethereum and BSC: treat an empty Base result as "not covered", not "no activity".
21
+ Chains: `ethereum`, `bsc`, `base`, `hyperevm`; node labels come from that chain's own label table. The command expands each hop by combined volume in both directions; the tool also takes `direction` `out` (where funds went) or `in` (where they came from), reached with `vike-data call wallet_trace --args '{"address":"0x...","direction":"out","depth":2}'`.
22
22
 
23
23
  ## Output
24
24
 
@@ -87,3 +87,4 @@ Tell them to click the **Graph** tab. It renders the same trace data as a force-
87
87
  - `vike-data labels <addr>` / `vike-data wallet batch <addr...>` — identify the nodes
88
88
  - `vike-data wallet compare <addr_a> <addr_b>` — confirm relatedness once trace surfaces candidates
89
89
  - `vike-data wallet transactions <addr>` — drill into specific transfers between two nodes
90
+ - `vike-follow-the-money` — the incident playbook (order of calls, stop rules, a live watch); `vike-wallets-related` — evidence of a shared owner
@@ -10,7 +10,7 @@ allowed-tools: Bash(vike-data:*)
10
10
 
11
11
  ```bash
12
12
  vike-data wallet transactions <address> # alias: vike-data wallet txs
13
- [--chain ethereum|bsc|base]
13
+ [--chain ethereum|bsc|base|hyperevm]
14
14
  [--direction in|out|all]
15
15
  [--days N] (max 365)
16
16
  [--limit N] (max 500)
@@ -19,7 +19,7 @@ vike-data wallet transactions <address> # alias: vike-data wallet txs
19
19
  [--json]
20
20
  ```
21
21
 
22
- `--chain base` is accepted, but per-wallet transfer data is documented for Ethereum and BSC: treat an empty Base result as "not covered", not "no activity".
22
+ Chains: `ethereum`, `bsc`, `base`, `hyperevm`. The same address has a separate history per chain: pass `--chain` for each.
23
23
 
24
24
  ## Examples
25
25
 
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: vike-wallet-who-is
3
+ description: Say who is behind one EVM address from vike's search, its label sources, ENS name, the chain it is active on, the exchanges it uses and its biggest counterparties. Tells an exchange, fund, market maker or contract from an ordinary user. Use when the user asks "who is 0x..." / "whose wallet is this" / "is this an exchange or a fund" / "which exchange does this wallet use" / "what kind of wallet is this".
4
+ allowed-tools: Bash(vike-data:*)
5
+ ---
6
+
7
+ # vike-wallet-who-is
8
+
9
+ Identity playbook for ONE address: what vike already calls it, labels, ENS, the chain that matters, which exchanges and wallets it moves money with. About 12 credits. For holdings and a flow snapshot use `vike-wallet-portfolio`.
10
+
11
+ ## Chain
12
+
13
+ ```bash
14
+ ADDR=0x28C6c06298d514Db089934071355E5743bf21d60
15
+ vike-data search $ADDR --json # 1 entity, HL trader, vault, builder, Polymarket wallet: whatever vike knows it as
16
+ vike-data labels $ADDR --json # 1 label sources + consensus (Ethereum label table)
17
+ vike-data wallet ens $ADDR --json # 1 reverse ENS; "ens" can be null
18
+ vike-data wallet summary $ADDR --json # 2 READ its `chain` field before anything else
19
+ vike-data wallet exchange-usage $ADDR --chain <summary.chain> --window 365d --json # 3 which exchanges, with USD and shares
20
+ vike-data wallet counterparties $ADDR --chain <summary.chain> --window 90d --limit 20 --json # 2
21
+ vike-data wallet batch <counterparties with an empty entity> --chain <summary.chain> --json # 2, max 100 addresses
22
+ ```
23
+
24
+ Chains: `ethereum`, `bsc`, `base`, `hyperevm` on every wallet command here. The user gave a name, not an address? `vike-data search vitalik.eth` searches the address an ENS name points to.
25
+
26
+ ## Reading each step
27
+
28
+ - **`search`**: its `wallets`, `traders`, `vaults`, `builders` and `polymarket` sections say where vike already knows the address (a labelled entity, a Hyperliquid trader, a Polymarket proxy and its owner). Empty sections are not evidence of anything.
29
+ - **`labels`**: `found: false` = not in our label table; it is not proof the wallet is an ordinary user. Otherwise read `consensus` (`entity`, `wallet_type`, `confidence`, `risk_flag`) AND `sources[]`. When sources disagree the consensus type can be wrong: for `0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045` the entity is "vitalik buterin" but `wallet_type` read `dex` because one source says "sushiswap". Report the entity the sources agree on, not the type.
30
+ - **`summary.chain`** is the more recently active of ethereum and bsc, never a sum; base or hyperevm only for a wallet with no priced ethereum/bsc volume. If the figures look tiny, run `vike-data wallet balances $ADDR` (each holding carries its `chain`) and ask that chain directly: `vike-data call wallet_summary --args '{"address":"0x...","chain":"base"}'`.
31
+ - **`exchange-usage`**: `exchanges[]` with `sent_usd`, `recv_usd`, `sent_share`, first and last seen; `pattern: "sweeps_to_single_cex"` means 90%+ of its outgoing USD went to one exchange: an OBSERVED pattern, not proof it is a deposit address. Figures are a lower bound (an unlabelled exchange address is invisible; labels are sparse on hyperevm). A very active wallet is refused over a long window: narrow `--window`.
32
+ - **`counterparties`** rows already carry `entity` and `wallet_type` (empty string when unlabelled); only the empty ones need `wallet batch`, which adds `confidence`, `risk_flag` and 30-day flow from that chain's own tables.
33
+ - **The wallet itself is `cex`**: it is the exchange's own wallet, not a person. `wallet_type: dex` on a counterparty is a router or pool: many of them = an active trader, not a relationship.
34
+ - Optional, "who funded it": `vike-data wallet first-funder $ADDR --chain <chain>` gives the earliest inbound coin and token transfers with the senders' labels. It is not proof of the funder: contract calls and bridges are absent and history starts on a different date per chain (`coverage.history_from`).
35
+
36
+ ## Answer template
37
+
38
+ > `<ENS or 0x...>` is `<entity>` (`<wallet_type>`, confidence `<c>`, `<n>` sources agree). Active on `<chain>`; 90d volume `$X`, last active `<date>`. Exchanges: `<entity>` `$sent` / `$received`. It mostly deals with `<top labelled counterparties>`; the largest unlabelled counterparty is `<0x...>` ($V). `<Not labelled: say so.>`
39
+
40
+ ## Anti-patterns
41
+
42
+ - Don't name a real-world person from a label, and don't claim two wallets share an owner: that is `vike-wallets-related`, and it is evidence, not proof.
43
+ - Don't read `summary` as the wallet's whole activity: it is one chain.
44
+ - Don't call a wallet "clean" because `risk_flag` is empty or `found` is false.
45
+
46
+ ## Pairs well with
47
+
48
+ - `vike-wallet-label-provenance` for the raw per-source labels, `vike-wallet-portfolio` for holdings
49
+ - `vike-follow-the-money` to see where its money went, `vike-wallets-related` to test a link between two addresses
50
+ - `vike-hl-trader-profile` when `search` lists it as a Hyperliquid trader, `vike-polymarket-trader` for a Polymarket wallet