@vike-io/cli 0.13.1 → 0.14.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 (45) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +10 -10
  3. package/package.json +1 -1
  4. package/skills/vike/SKILL.md +119 -191
  5. package/skills/vike-alerts-setup/SKILL.md +1 -0
  6. package/skills/vike-candles/SKILL.md +2 -2
  7. package/skills/vike-core/SKILL.md +13 -12
  8. package/skills/vike-hl-position-match/SKILL.md +7 -7
  9. package/skills/vike-hl-top-traders/SKILL.md +46 -11
  10. package/skills/vike-perp-funding/SKILL.md +82 -0
  11. package/skills/vike-perp-overview/SKILL.md +69 -0
  12. package/skills/vike-polymarket-market-detail/SKILL.md +2 -1
  13. package/skills/vike-polymarket-markets/SKILL.md +12 -7
  14. package/skills/vike-polymarket-smart-money/SKILL.md +38 -13
  15. package/skills/vike-polymarket-trader/SKILL.md +23 -20
  16. package/skills/vike-smart-money-discovery/SKILL.md +26 -32
  17. package/skills/vike-token-holders/SKILL.md +2 -1
  18. package/skills/vike-token-research/SKILL.md +22 -14
  19. package/skills/vike-token-screener/SKILL.md +35 -28
  20. package/skills/vike-token-transfers/SKILL.md +21 -11
  21. package/skills/vike-wallet-balances/SKILL.md +19 -13
  22. package/skills/vike-wallet-batch/SKILL.md +18 -14
  23. package/skills/vike-wallet-compare/SKILL.md +2 -0
  24. package/skills/vike-wallet-counterparties/SKILL.md +5 -1
  25. package/skills/vike-wallet-discover/SKILL.md +17 -10
  26. package/skills/vike-wallet-ens/SKILL.md +8 -4
  27. package/skills/vike-wallet-label-provenance/SKILL.md +25 -16
  28. package/skills/vike-wallet-pnl-history/SKILL.md +4 -1
  29. package/skills/vike-wallet-portfolio/SKILL.md +23 -21
  30. package/skills/vike-wallet-summary/SKILL.md +22 -9
  31. package/skills/vike-wallet-trace/SKILL.md +15 -11
  32. package/skills/vike-wallet-transactions/SKILL.md +3 -1
  33. package/skills.sh.json +10 -15
  34. package/src/auth.js +1 -1
  35. package/src/commands/init.js +1 -1
  36. package/src/commands/labels.js +1 -1
  37. package/src/commands/perp.js +5 -4
  38. package/src/commands/wallet.js +3 -3
  39. package/skills/vike-cross-venue-perps/SKILL.md +0 -52
  40. package/skills/vike-hl-trader-profile/SKILL.md +0 -65
  41. package/skills/vike-perp-funding-arb/SKILL.md +0 -53
  42. package/skills/vike-perp-screener/SKILL.md +0 -48
  43. package/skills/vike-perp-spread-arb/SKILL.md +0 -38
  44. package/skills/vike-polymarket-screener/SKILL.md +0 -59
  45. package/skills/vike-router/SKILL.md +0 -54
@@ -14,7 +14,7 @@ vike-data wallet discover
14
14
  [--sort volume|inflow|outflow|net_flow|tx_count|pnl]
15
15
  [--order asc|desc]
16
16
  [--chain ethereum|bsc]
17
- [--size N] # max 20
17
+ [--size N] # default 10, max 20
18
18
  [--json]
19
19
  ```
20
20
 
@@ -24,26 +24,33 @@ vike-data wallet discover
24
24
  |---|---|
25
25
  | "Top whales by volume this week" | `--sort volume --window 7d` |
26
26
  | "Biggest accumulators last 30d" | `--sort net_flow --window 30d --order desc` |
27
- | "Top realized-PnL traders all-time" | `--sort pnl --window all` |
28
27
  | "Wallets dumping the most this 24h" | `--sort outflow --window 24h` |
29
28
  | "Most active traders last 7d" | `--sort tx_count --window 7d` |
29
+ | "Best PnL" | `--sort pnl --window all`: an ordering only, see below |
30
30
 
31
- ## Output columns
31
+ ## Output
32
32
 
33
- `address`, `label` (when known), `volume_usd`, `inflow_usd`, `outflow_usd`, `net_flow_usd`, `tx_count`, `realized_pnl_usd`.
33
+ An object `{ "wallets": [...], "total": N }`. `total` is the size of the matching population, not the number of rows.
34
+
35
+ Each wallet: `address`, `volume`, `inflow`, `outflow`, `net_flow`, `tx_count`, `tokens_traded`, `first_seen`, `last_active`, `realized_pnl`, `tokens_profitable`, `pnl_available`. USD columns are already plain dollars.
36
+
37
+ There is **no label column** and no `*_usd` suffix. To name the wallets, pass the addresses to `vike-data wallet batch`.
34
38
 
35
39
  ## Reading tips
36
40
 
37
- - Labeled wallets first — `label = "binance_cold_t1"` means it's a CEX hot/cold wallet, not a discretionary trader.
38
- - Always filter mentally for unlabeled wallets first if the user wants "real traders" (not exchanges).
39
- - For PnL sort, realized PnL only — open positions are NOT counted. Use `vike-data perp top-traders` for HL perps PnL (which includes unrealized).
41
+ - **`realized_pnl` is a ranking key, not a dollar figure.** Stored values are wrong for many wallets (a measurement found 233 of 500 sampled Ethereum leaderboard wallets at 10× or more above the rebuilt value, and the top rows can show a profit thousands of times the wallet's own volume). Use `--sort pnl` only to order wallets against each other, never quote `realized_pnl`, and never call `pnl_available: 1` a guarantee. It is computed from on-chain transfers; Hyperliquid PnL is a different dataset (`vike-data perp top-traders`, realized PnL only: open positions are not included).
42
+ - `first_seen` here is not a lifetime first-seen (it disagrees with `wallet summary`); read it as "first seen in this dataset".
43
+ - Labeled wallets first: after `wallet batch`, `entity = "binance"` / `wallet_type = "cex"` means a CEX hot or cold wallet, not a discretionary trader. Filter those out if the user wants "real traders".
44
+ - Top volume wallets are almost always bots, routers and venues. `net_flow` is the more informative sort for "who is accumulating", and even then check the wallet type.
40
45
 
41
46
  ## Anti-patterns
42
47
 
43
- - `--size > 20` is silently clamped to 20. Run a second call with offset (not currently supported — limit applies hard) if you need more.
44
- - `--sort pnl` is only meaningful on `--window 30d` or longer; 24h PnL is noise.
48
+ - `--size > 20` is silently clamped to 20, and there is no offset: the tool is a top-of-leaderboard view. Don't promise a deeper list.
49
+ - Don't build "smart money" lists on `--sort pnl` (see `vike-smart-money-discovery` for the supported route).
50
+ - Don't use this for a single wallet: `wallet summary` is the right call.
45
51
 
46
52
  ## Pairs well with
47
53
 
54
+ - `vike-data wallet batch <addr...>` to label the rows
48
55
  - `vike-data wallet summary <address>` to drill into any interesting row
49
- - `vike-smart-money-discovery` for a composite multi-signal read
56
+ - `vike-smart-money-discovery` for the smart-money read
@@ -16,23 +16,27 @@ vike-data wallet ens <address> [--json]
16
16
 
17
17
  ```bash
18
18
  vike-data wallet ens 0xd8da6bf26964af9d7eed9e03e53415d37aa96045
19
- # → { "address": "0xd8da...", "ens": "vitalik.eth" }
19
+ # → { "address": "0xd8da...", "ens": "vitalik.eth", "source": "local" }
20
20
 
21
21
  vike-data wallet ens 0x28c6c06298d514db089934071355e5743bf21d60
22
- # → { "address": "0x28c6...", "ens": null } (most exchange wallets have no ENS)
22
+ # → { "address": "0x28c6...", "ens": null, "source": "local" } (most exchange wallets have no ENS)
23
23
  ```
24
24
 
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 "who is this"
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)
29
29
  - When you're about to display a leaderboard with addresses — enrich each row with ENS if available
30
30
 
31
+ ## Direction
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`.
34
+
31
35
  ## Anti-patterns
32
36
 
33
37
  - Don't replace the address with the ENS name in tool output — show BOTH. The address is canonical; ENS is a display layer that can change ownership.
34
38
  - Don't ENS-lookup hundreds of addresses in a leaderboard at once — credits add up. Usually ENS-lookup only the top 5-10 rows the user is likely to act on.
35
- - A `null` response is normal, not an error. Most wallets don't have ENS.
39
+ - A `null` response is normal, not an error. Most wallets don't have ENS. The exception: `ens: null` with `source: "rpc"` may only mean the resolvers were unreachable, so retry once before saying the wallet has no name.
36
40
 
37
41
  ## Pairs well with
38
42
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: vike-wallet-label-provenance
3
- description: Multi-source label cascade for any ETH wallet — shows what every upstream label provider 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".
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".
4
4
  allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
@@ -14,6 +14,8 @@ 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.
18
+
17
19
  ## Example
18
20
 
19
21
  ```bash
@@ -27,37 +29,44 @@ vike-data labels 0x28C6c06298d514Db089934071355E5743bf21d60 # Binance Hot Wa
27
29
  "address": "0x...",
28
30
  "found": true,
29
31
  "consensus": {
30
- "entity": "Binance",
32
+ "entity": "binance",
31
33
  "wallet_type": "cex",
32
- "cex_product": "spot",
33
- "user_subtype": "",
34
- "risk_flag": "",
35
- "confidence": "High"
34
+ "cex_product": "retail",
35
+ "user_subtype": "active",
36
+ "risk_flag": null,
37
+ "confidence": "medium"
36
38
  },
37
39
  "sources": [
38
- { "source": "provider_a", "label": "Binance 14", "entity": "Binance", "category": "CEX" },
39
- { "source": "provider_b", "label": "Binance Hot Wallet" },
40
- { "source": "provider_c", "label": "Binance: Hot Wallet 14" },
41
- { "source": "provider_d", "label": "Binance" },
42
- { "source": "heuristic:cold_t1", "confidence": 0.94 }
40
+ { "source": "provider_a", "label": "Binance: Hot Wallet (0x28C)", "entity": "Binance", "category": "Hot Wallet" },
41
+ { "source": "provider_b", "label": "Binance 14", "entity": "binance", "category": null },
42
+ { "source": "provider_c", "label": "Binance: Hot Wallet", "entity": "binance", "category": "exchange" },
43
+ { "source": "provider_d", "label": "binance", "entity": "binance", "category": null },
44
+ { "source": "heuristic:cold_t1", "label": "binance", "confidence": 0.94 }
43
45
  ],
44
46
  "source_count": 5
45
47
  }
46
48
  ```
47
49
 
50
+ Sources are anonymised on the wire (`provider_a`, `provider_b`, ...). There are at most 6 raw sources (Arkham, OLI, Blockscout, Dune, the MEW darklist, Etherscan tags), plus the heuristic classifier as a `heuristic:*` source. `source_count` includes the heuristic.
51
+
48
52
  ## Reading
49
53
 
50
- - **5+ sources agree** → very high confidence; ship the label without caveats
51
- - **2-3 sources agree on same entity** → high confidence
52
- - **Only 1 source + heuristic** → moderate; mention "labeled by X"
53
- - **0 sources, only heuristic** → low; mention "predicted by heuristic"
54
- - **0 sources, no heuristic** → genuinely unknown wallet (most retail addresses)
54
+ - **4+ raw sources agree on the entity** → very high confidence; ship the label without caveats. Six is the ceiling, and most labelled wallets have 1-3.
55
+ - **2-3 sources agree on the same entity** → high confidence
56
+ - **Only 1 source (± heuristic)** → moderate; mention "labeled by one source"
57
+ - **Only the heuristic** → low; mention "predicted by heuristic"
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".
60
+
61
+ Early answers (before 2026-10-19) carried only the Arkham-derived source and the heuristic, so older transcripts undercount sources.
55
62
 
56
63
  ## Anti-patterns
57
64
 
58
65
  - Don't quote any single provider's category field as "the category" — provider taxonomies vary; the `consensus.wallet_type` is the unified field.
59
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.
60
68
 
61
69
  ## Pairs well with
62
70
 
63
71
  - `vike-data wallet summary <addr>` — for the flow metrics of the labeled wallet
72
+ - `vike-data wallet batch <addr...>` — label many addresses, or another chain
@@ -15,6 +15,8 @@ vike-data wallet pnl-history <address>
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".
19
+
18
20
  ## Output
19
21
 
20
22
  ```json
@@ -35,10 +37,11 @@ vike-data wallet pnl-history <address>
35
37
 
36
38
  **This is NET INFLOW USD, not realized PnL.** True realized PnL requires WAC (weighted-average cost) accounting per token, which we don't do in this fast tool. A wallet that bought $10K and sold $10K of the same token at the SAME price would show $0 here — but if they sold higher, true PnL would be positive (and this tool wouldn't reflect that). Use this for direction + trend, not for tax-grade PnL.
37
39
 
38
- For lifetime realized PnL: `vike-data wallet discover --sort pnl --window all`.
40
+ There is no reliable realized-PnL figure for a wallet in the CLI: `wallet discover` carries a `realized_pnl` column, but it is only an ordering key (many stored values are wrong), so never quote it as dollars.
39
41
 
40
42
  ## Reading
41
43
 
44
+ - The series is **sparse**: one point per day that had activity, not one per day of the range. Zero-fill the calendar before charting or diffing.
42
45
  - `cumulative_net_flow_usd` ramping up = wallet has been accumulating $
43
46
  - Big positive day with high `tx_count` = single large buy (deposit / acquisition / token purchase)
44
47
  - Big negative day with high `tx_count` = sell-down or large transfer out
@@ -1,34 +1,36 @@
1
1
  ---
2
2
  name: vike-wallet-portfolio
3
- description: Composite wallet portfolio view — combines ENS + labels + ERC-20 balances + DeFi positions + recent net flow 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").
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").
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.
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.
10
10
 
11
11
  ## Workflow (run in parallel where possible)
12
12
 
13
13
  ```bash
14
14
  ADDR=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
15
15
 
16
- vike-data wallet ens $ADDR --json & # cheap, ~1 credit
17
- vike-data labels $ADDR --json & # cheap, ~1 credit
18
- vike-data wallet summary $ADDR --json & # cheap, ~2 credits
19
- vike-data wallet balances $ADDR --json & # multi-chain, ~3 credits
20
- vike-data wallet pnl-history $ADDR --days 30 --json &
16
+ vike-data wallet ens $ADDR --json & # 1 credit
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
21
21
  wait
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`.
25
+
24
26
  ## Report template
25
27
 
26
28
  > **`<ENS or 0x...>` — wallet snapshot**
27
- > - **Identity:** `<ens.eth>` · `<entity (from labels)>` · `<wallet_type>` (confidence: `<H/M/L>`)
28
- > - **Total ERC-20:** `$X` across `<chains>`. Top 3 by USD: `<symbol1 $X>`, `<symbol2 $Y>`, ...
29
- > - **DeFi positions:** `$Y` across `<protocols count>` protocols. Top: `<Aave V3 $X>`, ...
30
- > - **30d net flow:** `+/-$Z` (cumulative)
31
- > - **Activity:** `<tx_count>` txns last 30d, `<unique_tokens>` unique tokens traded
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.
32
+ > - **Activity:** `<tx_count>` transfers in 30d, `<tokens_traded>` tokens traded all-time.
33
+ > - **Top counterparties:** `<entity or address>` · `$volume`, ...
32
34
  > - **Vibe check:** `<saver / trader / farmer / institutional / inactive / fresh>`
33
35
 
34
36
  ## Vibe-check rubric
@@ -36,17 +38,16 @@ wait
36
38
  | Pattern | Label |
37
39
  |---|---|
38
40
  | `wallet_type = "cex"` or `"market_maker"` | **Institutional** |
39
- | 80%+ in stablecoins, low tx count | **Saver / dry powder** |
40
- | 50+ unique tokens 30d, low avg holding USD | **Airdrop farmer** |
41
- | High tx count, balanced sent/received | **Active trader** |
42
- | Big DeFi positions, low ERC-20 balance | **DeFi native** |
43
- | Big ERC-20 holdings, no DeFi | **HODLer** |
44
- | Zero activity 30d | **Inactive** |
45
- | First-seen < 30d ago | **Fresh wallet** |
41
+ | 80%+ of priced holdings in stablecoins, low tx count | **Saver / dry powder** |
42
+ | `tokens_traded` 50+, low average holding USD | **Airdrop farmer** |
43
+ | High tx count, balanced inflow / outflow | **Active trader** |
44
+ | Big priced holdings, low tx count | **HODLer** |
45
+ | Zero `tx_count` in `30d` | **Inactive** |
46
+ | `first_seen` (from `all`) < 30d ago | **Fresh wallet** |
46
47
 
47
48
  ## Cost
48
49
 
49
- ~5 parallel calls, ~9 credits total. Use sparingly — only when the user wants the FULL picture, not a single dimension.
50
+ 6 calls, about 11 credits. Use sparingly — only when the user wants the FULL picture, not a single dimension.
50
51
 
51
52
  ## When to use a focused skill instead
52
53
 
@@ -56,4 +57,5 @@ wait
56
57
 
57
58
  ## Pairs well with
58
59
 
59
- - `vike-smart-money-discovery` to put the wallet in context vs the broader top-PnL cohort
60
+ - `vike-wallet-trace` to follow the money out of the wallet
61
+ - `vike-smart-money-discovery` to put a token the wallet trades in context
@@ -12,24 +12,37 @@ 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.
16
+
15
17
  ## Output
16
18
 
17
- Per-window rows: `window`, `volume_usd`, `inflow_usd`, `outflow_usd`, `net_flow_usd`, `tx_count`, `unique_tokens`.
19
+ A JSON object keyed by window: `all`, `90d`, `30d`, `7d`, `24h`. Each window holds:
20
+
21
+ `total_volume`, `total_inflow`, `total_outflow`, `net_flow` (USD), `tx_count`, `tokens_traded`, `first_seen`, `last_active`.
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.
25
+ - A window with no activity is present and zeroed (`24h` often is), not omitted.
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`.
18
28
 
19
29
  ## Reading tips
20
30
 
21
- - **Net flow >> 0** = accumulator. Inflow heavy → still buying.
22
- - **Net flow << 0** = distributor. Outflow heavy → still selling.
23
- - **Volume high, net flow ≈ 0** = trader/MM (churn). Look at counterparty patterns separately.
24
- - **Unique tokens high (>50)** = farmer / spray-and-pray. Lower signal per token.
25
- - **Unique tokens low (<5), high volume** = concentrated conviction.
31
+ - **`net_flow` >> 0** = accumulator. Inflow heavy → still buying.
32
+ - **`net_flow` << 0** = distributor. Outflow heavy → still selling.
33
+ - **Volume high, `net_flow` ≈ 0** = trader/MM (churn). Look at counterparty patterns separately.
34
+ - **`tokens_traded` high (>50)** = farmer / spray-and-pray. Lower signal per token.
35
+ - **`tokens_traded` low (<5), high volume** = concentrated conviction.
36
+ - Lifetime `all` against a quiet `30d` (e.g. 900k lifetime transactions, 18 in 30d) = a long-lived wallet that is quiet now. Don't size a wallet up on `all` alone.
26
37
 
27
38
  ## Anti-patterns
28
39
 
29
- - Don't claim a wallet is "smart money" based on summary alone — cross-reference with labels and PnL: `vike-data wallet discover --sort pnl` to see if this address is in the top-PnL set.
30
- - A single big inflow can dominate `net_flow_usd` for a window — eyeball `tx_count` to gauge whether it's one trade or many.
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
+ - 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.
31
43
 
32
44
  ## Pairs well with
33
45
 
34
- - `vike-data wallet discover` to see if this wallet ranks in any leaderboard
46
+ - `vike-data labels <addr>` / `vike-data wallet batch` to say who the wallet is
47
+ - `vike-data wallet balances <addr>` for current holdings
35
48
  - `vike-data token transfers` after identifying which tokens the wallet trades
@@ -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. 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 "where did funds from X go" / "follow the money 3 hops out" / "trace the network around this wallet" / wallet investigation.
4
4
  allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
@@ -14,10 +14,12 @@ vike-data wallet trace <address>
14
14
  [--depth N] (1-5, default 2)
15
15
  [--width N] (1-10, default 5)
16
16
  [--window 24h|7d|30d|90d|all]
17
- [--min-usd N] (default 10000 — prunes noise)
17
+ [--min-usd N] (default 10000; 0 selects the default, pass 0.01 to include small transfers)
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".
22
+
21
23
  ## Output
22
24
 
23
25
  ```json
@@ -25,13 +27,12 @@ vike-data wallet trace <address>
25
27
  "root": "0xabc...",
26
28
  "depth": 2, "width": 5, "window": "30d", "min_usd": 10000,
27
29
  "nodes": [
28
- { "address": "0xabc...", "depth": 0, "total_volume_usd": 0.0 },
29
- { "address": "0xdef...", "depth": 1, "total_volume_usd": 250000, "label": "Binance", "wallet_type": "cex" },
30
- { "address": "0x123...", "depth": 2, "total_volume_usd": 45000, "label": null, "wallet_type": null },
30
+ { "address": "0xabc...", "depth": 0, "total_volume_usd": 450000, "label": null, "wallet_type": null },
31
+ { "address": "0xdef...", "depth": 1, "total_volume_usd": 250000, "label": "binance", "wallet_type": "cex" },
31
32
  ...
32
33
  ],
33
34
  "edges": [
34
- { "from": "0xabc...", "to": "0xdef...", "volume_usd": 200000, "tx_count": 4 },
35
+ { "from": "0xabc...", "to": "0xdef...", "volume_usd": 200000, "out_usd": 150000, "in_usd": 50000, "tx_count": 4 },
35
36
  ...
36
37
  ],
37
38
  "stats": { "node_count": 23, "edge_count": 31, "max_depth_reached": 2 }
@@ -40,18 +41,20 @@ vike-data wallet trace <address>
40
41
 
41
42
  ## Reading the graph
42
43
 
43
- - **Root (depth 0)** = the wallet you traced from. `total_volume_usd` = 0 because it's where edges originate.
44
+ - **Direction lives in `out_usd` / `in_usd`, not in `from` / `to`.** `from` is the side that was expanded first, not the sender. For an edge, `out_usd` flowed `from → to`, `in_usd` flowed `to → from`, and `volume_usd` is their sum. To answer "where did X's money go", rank the root's edges by the outflow side, not by `volume_usd`.
45
+ - **Root (depth 0)** = the wallet you traced from. Its `total_volume_usd` is the sum of its own edges in this graph (not zero, and not its whole activity). The same holds for every node.
44
46
  - **Depth 1** = direct counterparties. Most useful layer.
45
47
  - **Depth 2-3** = "friend-of-friend" — useful for finding where funds end up.
46
- - **Edge volume_usd** = the volume between those two specific addresses, NOT cumulative.
48
+ - **Edge `volume_usd`** = the volume between those two specific addresses, NOT cumulative. One edge per wallet pair.
47
49
  - **`wallet_type = "cex"`** at depth 1 = funds went to / came from an exchange. Often the END of the trail (anonymous from there).
48
50
  - **Unlabeled wallet with high volume at depth 1-2** = potentially related wallet, investigate with `vike-data labels`.
51
+ - Only transfers of at least `--min-usd` count, so an empty or small graph can mean "nothing above the floor".
49
52
 
50
53
  ## Parameter tuning
51
54
 
52
55
  | Parameter | Effect | Use when |
53
56
  |---|---|---|
54
- | `--depth 1` | Direct counterparties only | "Who does X trade with" — same as `wallet counterparties` |
57
+ | `--depth 1` | Direct counterparties only | Same data as `wallet counterparties`, plus the direction split |
55
58
  | `--depth 2` | One degree of separation | Default. Reveals immediate networks. |
56
59
  | `--depth 3+` | Wider net | Investigation / OSINT. Returns much more data; graph gets noisy. |
57
60
  | `--width 3` | Top 3 per hop | Cleaner, focused on biggest flows |
@@ -60,13 +63,14 @@ vike-data wallet trace <address>
60
63
 
61
64
  ## Cost note
62
65
 
63
- Tool credits = 4 per call (heavier than other graph-less tools). Graph explodes exponentially with depth — depth 3 + width 10 = up to 1000 nodes per scan. Use `--depth 2 --width 5` as default.
66
+ 4 credits per call (the heaviest tool). Cost grows with depth × width, but the server silently stops after 300 wallet expansions, so a wide, deep trace (for example depth 3 × width 10) is cut rather than unbounded. If `max_depth_reached` is below `--depth`, either the branches ran out under `--min-usd` or the cap cut the graph: say which you cannot tell. Use `--depth 2 --width 5` as the default.
64
67
 
65
68
  ## Anti-patterns
66
69
 
67
70
  - Don't trace through CEX deposits. Once funds enter Binance/Coinbase, the trail goes opaque (CEX internal accounting, not on-chain). Note CEX nodes and stop following.
68
71
  - Don't depth-5 by default. Graph blows up; results become noise.
69
72
  - Don't ignore `min_usd` — without it, dust transfers create false-positive edges.
73
+ - Don't read `from` as the sender.
70
74
 
71
75
  ## Visual graph (web UI)
72
76
 
@@ -80,6 +84,6 @@ Tell them to click the **Graph** tab. It renders the same trace data as a force-
80
84
 
81
85
  ## Pairs well with
82
86
 
83
- - `vike-data labels <addr>` — identify any interesting node
87
+ - `vike-data labels <addr>` / `vike-data wallet batch <addr...>` — identify the nodes
84
88
  - `vike-data wallet compare <addr_a> <addr_b>` — confirm relatedness once trace surfaces candidates
85
89
  - `vike-data wallet transactions <addr>` — drill into specific transfers between two nodes
@@ -19,6 +19,8 @@ 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".
23
+
22
24
  ## Examples
23
25
 
24
26
  ```bash
@@ -34,7 +36,7 @@ vike-data wallet txs 0xabc... --token 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
34
36
 
35
37
  ## Output columns
36
38
 
37
- `time`, `tx_hash`, `from_address`, `to_address`, `token_address`, `value_usd`, `direction` (in/out), `block`.
39
+ `time`, `tx_hash`, `from_address`, `to_address`, `token_address`, `usd`, `direction` (in/out), `block`. The USD key is `usd`, and `usd: 0.0` means the transfer is **unpriced**, not worthless: `--min-usd` therefore also hides unpriced transfers. The native coin shows as `token_address` `0x0000000000000000000000000000000000000000`.
38
40
 
39
41
  Sorted descending by time (most recent first).
40
42
 
package/skills.sh.json CHANGED
@@ -4,16 +4,15 @@
4
4
  "groupings": [
5
5
  {
6
6
  "title": "Quick start",
7
- "description": "Start here. The umbrella skill auto-routes user questions to the right specialized skill below.",
7
+ "description": "Start here. The umbrella skill routes user questions to the right specialized skill below; vike-core covers install and auth.",
8
8
  "skills": [
9
9
  "vike",
10
- "vike-router",
11
10
  "vike-core"
12
11
  ]
13
12
  },
14
13
  {
15
14
  "title": "Tokens",
16
- "description": "Resolve, screen, and research tokens across 11 chains. Smart-money inflow, holders, recent transfers.",
15
+ "description": "Resolve, screen, and research tokens on Ethereum, BSC and Base. Smart-money inflow (Ethereum), holders, top buyers and sellers.",
17
16
  "skills": [
18
17
  "vike-token-search",
19
18
  "vike-token-research",
@@ -25,7 +24,7 @@
25
24
  },
26
25
  {
27
26
  "title": "Wallets",
28
- "description": "Per-wallet profile, PnL, counterparty graphs, ENS, batch labelling, label provenance.",
27
+ "description": "Per-wallet profile, flows, counterparty graphs, ENS, batch labelling, label provenance.",
29
28
  "skills": [
30
29
  "vike-wallet-summary",
31
30
  "vike-wallet-portfolio",
@@ -43,20 +42,17 @@
43
42
  },
44
43
  {
45
44
  "title": "CEX perps",
46
- "description": "Funding-rate arb + cross-venue mark-price spreads across Binance, Bybit, OKX, Aster, Hyperliquid.",
45
+ "description": "Funding-rate arb and per-symbol venue comparison, plus cross-venue perp price gaps and a market snapshot.",
47
46
  "skills": [
48
- "vike-perp-funding-arb",
49
- "vike-perp-spread-arb",
50
- "vike-perp-screener",
51
- "vike-cross-venue-perps"
47
+ "vike-perp-funding",
48
+ "vike-perp-overview"
52
49
  ]
53
50
  },
54
51
  {
55
52
  "title": "Hyperliquid perps",
56
- "description": "Deep on-chain HL coverage: top traders, full trader profiles, and share-card reverse-lookup.",
53
+ "description": "Top traders (and checking one address against the leaderboard) and share-card reverse-lookup.",
57
54
  "skills": [
58
55
  "vike-hl-top-traders",
59
- "vike-hl-trader-profile",
60
56
  "vike-hl-position-match"
61
57
  ]
62
58
  },
@@ -69,18 +65,17 @@
69
65
  },
70
66
  {
71
67
  "title": "Polymarket",
72
- "description": "Prediction-market discovery, single-market deep-dives, trader profiles, and smart-money leaderboards.",
68
+ "description": "Prediction-market discovery, single-market deep-dives, trader profiles, and smart-money signals with a market overview.",
73
69
  "skills": [
74
70
  "vike-polymarket-markets",
75
71
  "vike-polymarket-market-detail",
76
72
  "vike-polymarket-trader",
77
- "vike-polymarket-smart-money",
78
- "vike-polymarket-screener"
73
+ "vike-polymarket-smart-money"
79
74
  ]
80
75
  },
81
76
  {
82
77
  "title": "Alerts",
83
- "description": "Create, list, edit, delete price + flow alerts; register HTTPS webhooks with HMAC delivery.",
78
+ "description": "Create, list, edit, delete on-chain transfer alerts (USD thresholds per token); register HTTPS webhooks with HMAC delivery.",
84
79
  "skills": [
85
80
  "vike-alerts-setup",
86
81
  "vike-alerts-webhook"
package/src/auth.js CHANGED
@@ -40,7 +40,7 @@ export function clearApiKey() {
40
40
  }
41
41
 
42
42
  export function getEndpoint() {
43
- return process.env.VIKE_MCP_URL || 'https://vike.io/mcp';
43
+ return process.env.VIKE_MCP_URL || 'https://data.vike.io/mcp';
44
44
  }
45
45
 
46
46
  export function requireApiKey() {
@@ -31,7 +31,7 @@ export function registerInit(program) {
31
31
  const path = saveApiKey(key);
32
32
  console.log(`Saved to ${path}`);
33
33
 
34
- console.log('Verifying connection to vike.io/mcp ...');
34
+ console.log('Verifying connection to data.vike.io/mcp ...');
35
35
  const { status, body } = await ping({ apiKey: key });
36
36
  if (status !== 200 || body?.error) {
37
37
  console.error(`Endpoint returned HTTP ${status}: ${JSON.stringify(body)}`);
@@ -5,7 +5,7 @@ export function registerLabels(program) {
5
5
  // `vike-data labels <address>` — multi-source label provenance for one wallet
6
6
  program
7
7
  .command('labels <address>')
8
- .description('Multi-source label cascade for a wallet (10+ providers + in-house heuristic + consensus view)')
8
+ .description('Multi-source label cascade for an Ethereum wallet (up to 6 label sources + in-house heuristic + consensus view)')
9
9
  .option('--json', 'Emit JSON')
10
10
  .action(async (address, opts) => {
11
11
  try {
@@ -9,7 +9,7 @@ export function registerPerp(program) {
9
9
 
10
10
  cmd
11
11
  .command('funding')
12
- .description('Funding rates per venue, or cross-venue funding-arb opportunities')
12
+ .description('Funding rates per venue (raw per-interval rate + interval_h), or the top 5 cross-venue funding-arb rows')
13
13
  .option('--symbol <s>', 'Specific symbol (e.g. BTC). Omit for top arb opportunities.')
14
14
  .option('--json', 'Emit JSON')
15
15
  .action(async (opts) => {
@@ -21,8 +21,8 @@ export function registerPerp(program) {
21
21
 
22
22
  cmd
23
23
  .command('spreads')
24
- .description('Cross-venue spot-perp spread arbitrage opportunities')
25
- .option('--symbol <s>', 'Specific symbol. Omit for full matrix.')
24
+ .description('Cross-venue perp price gaps: the 10 widest (buy on one venue, sell on another)')
25
+ .option('--symbol <s>', 'Filter those 10 to one symbol (often empty). Omit for all.')
26
26
  .option('--json', 'Emit JSON')
27
27
  .action(async (opts) => {
28
28
  try {
@@ -43,8 +43,9 @@ export function registerPerp(program) {
43
43
  .option('--json', 'Emit JSON')
44
44
  .action(async (opts) => {
45
45
  try {
46
+ // The tool renamed `coin` to `symbol` on 2026-10-19; `--coin` stays the flag users know.
46
47
  const r = await callTool('hl_position_match', {
47
- coin: opts.coin,
48
+ symbol: opts.coin,
48
49
  side: opts.side,
49
50
  leverage: Number(opts.leverage),
50
51
  entry_price: Number(opts.entry),
@@ -9,7 +9,7 @@ export function registerWallet(program) {
9
9
 
10
10
  cmd
11
11
  .command('summary <address>')
12
- .description('Aggregate metrics: volume / inflow / outflow / pnl across windows')
12
+ .description('Aggregate metrics: volume / inflow / outflow / net flow / tx count across 24h-all windows')
13
13
  .option('--json', 'Emit JSON')
14
14
  .action(async (address, opts) => {
15
15
  try {
@@ -137,8 +137,8 @@ export function registerWallet(program) {
137
137
 
138
138
  cmd
139
139
  .command('balances <address>')
140
- .description('Current ERC-20 holdings across major EVM chains')
141
- .option('--chains <list>', 'Comma-separated chains (eth,bsc,base,arbitrum,polygon,optimism)')
140
+ .description('Current token holdings, read from the chain, on the chains the server scans')
141
+ .option('--chains <list>', 'Comma-separated chain names to scan (default: all the server scans; see `vike-data schema --pretty`)')
142
142
  .option('--min-usd <n>', 'Filter dust below this USD value (default $1; recommend $100+ for noisy wallets)', '1')
143
143
  .option('--json', 'Emit JSON')
144
144
  .action(async (address, opts) => {