@vike-io/cli 0.13.0 → 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 (47) hide show
  1. package/CHANGELOG.md +16 -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 +2 -1
  6. package/skills/vike-alerts-webhook/SKILL.md +1 -1
  7. package/skills/vike-candles/SKILL.md +3 -3
  8. package/skills/vike-core/SKILL.md +16 -15
  9. package/skills/vike-hl-position-match/SKILL.md +8 -8
  10. package/skills/vike-hl-top-traders/SKILL.md +47 -12
  11. package/skills/vike-perp-funding/SKILL.md +82 -0
  12. package/skills/vike-perp-overview/SKILL.md +69 -0
  13. package/skills/vike-polymarket-market-detail/SKILL.md +3 -2
  14. package/skills/vike-polymarket-markets/SKILL.md +13 -8
  15. package/skills/vike-polymarket-smart-money/SKILL.md +39 -14
  16. package/skills/vike-polymarket-trader/SKILL.md +24 -21
  17. package/skills/vike-smart-money-discovery/SKILL.md +27 -33
  18. package/skills/vike-token-holders/SKILL.md +3 -2
  19. package/skills/vike-token-research/SKILL.md +23 -15
  20. package/skills/vike-token-screener/SKILL.md +36 -29
  21. package/skills/vike-token-search/SKILL.md +1 -1
  22. package/skills/vike-token-transfers/SKILL.md +22 -12
  23. package/skills/vike-wallet-balances/SKILL.md +20 -14
  24. package/skills/vike-wallet-batch/SKILL.md +19 -15
  25. package/skills/vike-wallet-compare/SKILL.md +3 -1
  26. package/skills/vike-wallet-counterparties/SKILL.md +6 -2
  27. package/skills/vike-wallet-discover/SKILL.md +18 -11
  28. package/skills/vike-wallet-ens/SKILL.md +9 -5
  29. package/skills/vike-wallet-label-provenance/SKILL.md +26 -17
  30. package/skills/vike-wallet-pnl-history/SKILL.md +5 -2
  31. package/skills/vike-wallet-portfolio/SKILL.md +24 -22
  32. package/skills/vike-wallet-summary/SKILL.md +23 -10
  33. package/skills/vike-wallet-trace/SKILL.md +16 -12
  34. package/skills/vike-wallet-transactions/SKILL.md +4 -2
  35. package/skills.sh.json +10 -15
  36. package/src/auth.js +1 -1
  37. package/src/commands/init.js +1 -1
  38. package/src/commands/labels.js +1 -1
  39. package/src/commands/perp.js +5 -4
  40. package/src/commands/wallet.js +3 -3
  41. package/skills/vike-cross-venue-perps/SKILL.md +0 -52
  42. package/skills/vike-hl-trader-profile/SKILL.md +0 -65
  43. package/skills/vike-perp-funding-arb/SKILL.md +0 -53
  44. package/skills/vike-perp-screener/SKILL.md +0 -48
  45. package/skills/vike-perp-spread-arb/SKILL.md +0 -38
  46. package/skills/vike-polymarket-screener/SKILL.md +0 -59
  47. package/skills/vike-router/SKILL.md +0 -54
@@ -1,74 +1,68 @@
1
1
  ---
2
2
  name: vike-smart-money-discovery
3
- description: Multi-signal smart money discovery — find wallets currently accumulating a token, ranked by realized PnL track record. Use when the user asks "is smart money buying X" / "find smart money on Y chain" / "any alpha wallets in Z".
4
- allowed-tools: Bash(vike:*)
3
+ description: Smart-money discovery on Ethereum — which tokens the smart-money cohort is flowing into, and who the biggest net buyers of one token are. Use when the user asks "is smart money buying X" / "find smart money" / "any alpha wallets in Z".
4
+ allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
7
7
  # vike-smart-money-discovery
8
8
 
9
- Composite playbook — combines wallet leaderboards + token-side buyer list + label inspection.
9
+ Composite playbook built on `token screener --smart-money-only`. Smart money here means the cohort behind the screener's `smart_inflow` and `--smart-money-only`, which exist for **Ethereum only** (a 400 on bsc and base).
10
+
11
+ **What this can and cannot say.** It can say which tokens the cohort is flowing into and how much, and who the biggest net buyers of a token are. It cannot list which of those buyers belong to the cohort: no tool returns cohort membership. State that limit in the answer.
10
12
 
11
13
  ## Workflow
12
14
 
13
- ### A. Top realized-PnL wallets on a chain
15
+ ### A. Which tokens is the cohort buying?
14
16
 
15
17
  ```bash
16
- vike-data wallet discover --sort pnl --window 90d --chain ethereum --size 20 --json
18
+ vike-data token screener --chain ethereum --window 7d --sort smart_inflow --smart-money-only --limit 100 --json
17
19
  ```
18
20
 
19
- Keep only rows where:
20
- - `realized_pnl_usd > 100_000` (real conviction, not noise)
21
- - `tx_count > 20` (not a single lucky trade)
22
- - `label` is empty OR not a known CEX (these are real wallets, not exchanges)
23
-
24
- That set = your "smart money universe" for the next step.
25
-
26
- ### B. Cross-reference with a specific token
21
+ - Skip the row `0x0000000000000000000000000000000000000000`: it is the native coin, not a token you can drill into.
22
+ - Rows carry `token_address` (the `symbol` is often blank): identify tokens by address, and resolve names with `vike-data token search`.
23
+ - If the user named a token: resolve it (`vike-data token search <symbol> --limit 3 --json`) and look for its `token_address` in the rows. Present means the cohort moved it; absent from the top 100 means no visible cohort inflow in that window.
27
24
 
28
- If the user asks about a specific token, resolve it first:
25
+ ### B. Who is accumulating it?
29
26
 
30
27
  ```bash
31
- vike-data token search <symbol> --chain <chain> --limit 3 --json
28
+ vike-data token transfers <addr> --tab bought --period 7d --json
32
29
  ```
33
30
 
34
- Then list its recent buyers:
31
+ The list is the **top 10 by volume**, not the cohort. **Rank on `net_tokens`**, not `bought`: `bought` counts every inbound transfer, flash-loan and router round trips included. Keep rows with a clearly positive `net_tokens`; drop rows where `net_tokens` is near zero.
32
+
33
+ ### C. Strip the intermediaries
35
34
 
36
35
  ```bash
37
- vike-data token transfers <addr> --tab bought --period 7d --chain <chain> --json
36
+ vike-data wallet batch <addr1> <addr2> ... --json
38
37
  ```
39
38
 
40
- **Intersect** the buyer addresses with your smart-money universe from step A. Any overlap = a smart-money wallet currently accumulating this token.
41
-
42
- ### C. Profile each match
39
+ Drop rows labelled `cex`, `dex`, router or contract. What is left are the real net buyers of the token.
43
40
 
44
- For every overlap address, run:
41
+ ### D. Profile the survivors (cap at 5)
45
42
 
46
43
  ```bash
47
44
  vike-data wallet summary <addr> --json
48
45
  ```
49
46
 
50
- Report:
51
- - Address
52
- - Known label (if any)
53
- - 90d realized PnL
54
- - 7d net flow on this token
55
- - 30d total volume
47
+ Report address, label (if any), the token's `net_tokens` and `net_usd` over the window, and the wallet's 30d volume.
56
48
 
57
49
  ## Verdict template
58
50
 
59
- > **Smart-money take on $TOKEN:** N of top-20 90d-PnL wallets (>$100k realized) bought $TOKEN in the last 7 days. Strongest names: `<addr1> (+$X PnL, label?)`, `<addr2> ...`. Aggregate net flow into $TOKEN from this cohort: $Y. **Read: accumulation / churn / no-signal.**
51
+ > **Smart-money take on $TOKEN (7d):** the cohort's `smart_inflow` into $TOKEN is $Y (screener rank #R by `smart_inflow`). Among the top-10 net buyers, N survive the label filter; the largest are `<addr1> (net_tokens X, label?)`. **Read: accumulation / churn / no-signal.** The cohort members themselves are not listed by any tool.
60
52
 
61
53
  ## Anti-patterns
62
54
 
63
- - Don't accept any wallet labeled as a CEX (binance/coinbase/bybit/etc.) as "smart money" — they're aggregators.
64
- - Don't lower the PnL threshold to <$50k just to find more matches; below that, signal-to-noise is poor.
65
- - Single-token wallets (`unique_tokens < 3`) are usually airdrop-flippers, not strategic.
55
+ - Don't rank wallets by `wallet discover --sort pnl` and intersect them with a token's buyers: `realized_pnl` is stored wrongly for many wallets and is only an ordering key, and the overlap with a 10-row buyer list is almost always empty.
56
+ - Don't accept any wallet labeled as a CEX (binance/coinbase/bybit/etc.) as "smart money": they are aggregators.
57
+ - Don't use `--window 24h` for the screen: smart money usually positions before the 24h window.
58
+ - Single-token wallets (`tokens_traded < 3` in `wallet summary`) are usually airdrop-flippers, not strategic.
66
59
 
67
60
  ## Cost note
68
61
 
69
- 3 calls per discovery: 1× `wallet discover`, 1× `token transfers`, then 1× `wallet summary` per match (cap at 5).
62
+ Screener (3 credits) + `token transfers` (2) + `wallet batch` (2) + up to 5 × `wallet summary` (2).
70
63
 
71
64
  ## Pairs well with
72
65
 
66
+ - `vike-token-screener` for the filters and the column meanings
73
67
  - `vike-token-research` for the price/flow context
74
- - `vike-perp-funding-arb` if the token has a perp listing (positioning bias)
68
+ - `vike-perp-funding` if the token has a perp listing (positioning bias)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: vike-token-holders
3
3
  description: Top holders of an ERC-20 token by cumulative net inflow USD, with known labels. Use when the user asks "top holders of X" / "who holds the most of token Y" / "is whale Z holding token A".
4
- allowed-tools: Bash(vike:*)
4
+ allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
7
7
  # vike-token-holders
@@ -34,7 +34,8 @@ vike-data token holders 0x6982508145454ce325ddbe47a25d4ec3d2311933 --limit 20
34
34
 
35
35
  ## Anti-patterns
36
36
 
37
- - "Top holders" here means cumulative net inflow over all time — NOT current on-chain balance (which would require querying the contract directly). A wallet that bought $10M and sold $9M shows `net_flow_usd = $1M`, even if current balance is zero. **Always call this out** when reporting top holders.
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`.
38
39
  - Don't list `tx_count = 1` whales as "smart money" without context — could be an airdrop receiver who never sold.
39
40
  - For BSC tokens, pass `--chain bsc` explicitly; default is ethereum.
40
41
 
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: vike-token-research
3
- description: Full token research playbook — search → transfers → chart → flow direction → buyer/seller verdict. Use when the user asks "research <token>" or "what's happening with <token>".
4
- allowed-tools: Bash(vike:*)
3
+ description: Token research playbook — search → transfers (both sides) → net-flow read → buyer/seller verdict. Use when the user asks "research <token>" or "what's happening with <token>".
4
+ allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
7
7
  # vike-token-research
8
8
 
9
- Multi-call token research workflow.
9
+ Multi-call token research workflow. It characterises WHO is moving the token (the top wallets on each side), not the token's total flow, and it has no price chart.
10
10
 
11
11
  ## Steps
12
12
 
@@ -14,37 +14,45 @@ Multi-call token research workflow.
14
14
  ```bash
15
15
  vike-data token search <symbol> --chain <chain> --limit 3 --json
16
16
  ```
17
- Pick the highest-volume match; capture the address.
17
+ Pick the canonical match; capture the address.
18
18
 
19
19
  2. **Recent buyers + sellers** (parallel calls)
20
20
  ```bash
21
21
  vike-data token transfers <addr> --tab bought --period 24h --chain <chain> --json
22
22
  vike-data token transfers <addr> --tab sold --period 24h --chain <chain> --json
23
23
  ```
24
+ Each call returns the top 10 wallets for one side.
24
25
 
25
- ## Verdict heuristics
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;
28
+ - label the rest with `vike-data wallet batch <addrs...> --chain <chain>` and drop CEX / router / contract rows if the user wants "real" flow;
29
+ - 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
+
31
+ 4. **Optional context** (Ethereum only): `vike-data token screener --window 7d --sort smart_inflow --smart-money-only --limit 100 --json` and look for the token's address in the rows to see whether the smart-money cohort is flowing into it.
26
32
 
27
- After step 2, classify direction-of-pressure:
33
+ ## Verdict heuristics
28
34
 
29
- | Buyer count vs seller count (24h) | Verdict |
35
+ | Net accumulators' USD vs net distributors' USD (24h) | Verdict |
30
36
  |---|---|
31
- | Buyers > 2× sellers and net inflow > $1M | **Accumulation** |
32
- | Sellers > 2× buyers and net outflow > $1M | **Distribution** |
33
- | Roughly even (within 1.5×) | **Churn / range-bound** |
34
- | Both very low | **Illiquid — skip the read** |
37
+ | Accumulators > 2× distributors and > $1M | **Accumulation among the biggest movers** |
38
+ | Distributors > 2× accumulators and > $1M | **Distribution among the biggest movers** |
39
+ | Within 1.5× of each other | **Churn / range-bound** |
40
+ | Fewer than 3 rows left after dropping round trips, or all CEX / router | **No readable signal** — say the top wallets are intermediaries |
35
41
 
36
- Cross-check against the chart: distribution + falling price = bearish; accumulation + flat price = stealth bid (interesting).
42
+ State the limit with the verdict: "top 10 per side", not "the market".
37
43
 
38
44
  ## Anti-patterns
39
45
 
46
+ - Don't compare the number of buyers to the number of sellers: both lists are always 10 rows.
40
47
  - Don't run `transfers --period 30d` first — use 24h to see what's happening *now*; 30d for context only if needed.
41
48
  - Don't quote the first row of `token search` blindly — if the symbol has cross-chain collisions (`FUN`, `BEAM`, `LDO`), inspect `chain` + `address` for each result before picking.
49
+ - Don't promise a price chart: there is no candle source for an ERC-20 contract address (`vike-candles` covers Hyperliquid and Polymarket only).
42
50
 
43
51
  ## Cost note
44
52
 
45
- Step 1: cheap. Step 2: 2× cheap. Step 3: cheap. Total ≈ 4 calls.
53
+ Step 1: free. Step 2: 2 calls × 2 credits. Step 3 labels: 2 credits. Total ≈ 4 calls.
46
54
 
47
55
  ## Pairs well with
48
56
 
49
- - `vike-smart-money-discovery` to find which smart wallets are involved
50
- - `vike-perp-funding-arb` if the token has a perp listing (BTC/ETH/SOL/major alts)
57
+ - `vike-smart-money-discovery` to see whether the smart-money cohort is flowing into the token
58
+ - `vike-perp-funding` if the token has a perp listing (BTC/ETH/SOL/major alts)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: vike-token-screener
3
- description: Token discovery filter — rank tokens by volume / net inflow / holder count / smart-money inflow within a window, with min-volume and min-holder filters. Use when the user asks "what tokens are trending today" / "find tokens with smart money accumulating" / "rising tokens this week" / token discovery from scratch.
4
- allowed-tools: Bash(vike:*)
3
+ description: Token discovery filter — rank tokens by volume / net inflow / active-wallet count / smart-money inflow within a window, with min-volume and min-holder filters. Use when the user asks "what tokens are trending today" / "find tokens with smart money accumulating" / "rising tokens this week" / token discovery from scratch.
4
+ allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
7
7
  # vike-token-screener
@@ -13,70 +13,77 @@ vike-data token screener
13
13
  [--chain ethereum|bsc|base]
14
14
  [--window 24h|7d|30d|90d]
15
15
  [--sort volume|net_inflow|holders|smart_inflow]
16
- [--limit N] (max 100)
17
- [--min-volume USD] (filter dust)
18
- [--min-holders N] (require N+ unique holders)
19
- [--smart-money-only] (restrict to smart-money cohort flows)
16
+ [--limit N] (default 20, max 100)
17
+ [--min-volume USD] (drop thin tokens)
18
+ [--min-holders N] (require N+ distinct wallets active in the window)
19
+ [--smart-money-only] (restrict to smart-money cohort flows)
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.
24
+
23
25
  ## Examples
24
26
 
25
27
  ```bash
26
28
  # Trending today by volume
27
29
  vike-data token screener --window 24h --sort volume --limit 20
28
30
 
29
- # Find tokens smart money is accumulating
31
+ # Tokens the smart-money cohort is flowing into (Ethereum only)
30
32
  vike-data token screener --window 7d --sort smart_inflow --smart-money-only
31
33
 
32
- # Rising holders count (organic growth signal)
34
+ # Broad participation: most distinct wallets active in the window
33
35
  vike-data token screener --window 30d --sort holders --min-volume 100000
34
36
 
35
- # Mid-cap tokens with real activity
37
+ # Biggest net inflow among tokens with real activity
36
38
  vike-data token screener --min-volume 1000000 --min-holders 100 --sort net_inflow
37
39
  ```
38
40
 
39
41
  ## Output columns
40
42
 
41
- `token_address`, `symbol` (when known), `name`, `volume_usd`, `net_flow_usd`, `in_usd`, `out_usd`, `unique_holders`, `tx_count`.
43
+ `token_address`, `symbol`, `name`, `volume_usd`, `net_flow_usd`, `in_usd`, `out_usd`, `unique_holders`, `tx_count`.
44
+
45
+ - `symbol` is often blank and `name` null: the screener identifies tokens **by address**. Report the address. Don't invent a symbol, and don't call a blank-symbol row "unknown token" without checking the next point.
46
+ - **`0x0000000000000000000000000000000000000000` is the chain's native coin** (ETH on ethereum, BNB on bsc), not a contract. It ranks high on volume and `smart_inflow`. `vike-data token transfers` returns no buyers for it, so skip it before drilling into a screened token.
47
+ - `unique_holders` counts wallets **active in the window** (that sent or received the token), not wallets that hold it and not growth.
48
+ - `24h` spans yesterday and today (UTC calendar days), not a rolling 24 hours.
42
49
 
43
50
  ## Sort modes
44
51
 
45
52
  | Sort | What it surfaces |
46
53
  |---|---|
47
- | `volume` | Most-traded tokens (default) — captures attention-driven action |
48
- | `net_inflow` | Tokens with biggest accumulation (in > out) — "what's being bought" |
49
- | `holders` | Tokens gaining unique addresses — organic growth signal |
50
- | `smart_inflow` | Tokens our smart-money cohort is buying — alpha signal |
54
+ | `volume` | Most-traded tokens (default): attention, not direction |
55
+ | `net_inflow` | Largest `net_flow_usd` first (in > out). There is **no ascending sort**, so the bottom rows are the smallest inflows, not the biggest outflows |
56
+ | `holders` | Most distinct wallets active in the window |
57
+ | `smart_inflow` | Tokens the smart-money cohort is flowing into (Ethereum only) |
51
58
 
52
59
  ## Reading
53
60
 
54
- - **High volume + balanced in/out** = churn (DEX MM, arb bots). Low signal.
55
- - **High volume + strong net_inflow** = real demand. Worth investigating.
56
- - **Strong holder growth + flat volume** = small buys, distribution widening. Often early signal.
57
- - **`smart_inflow` mode** + high values + low overall volume = cohort is positioned BEFORE retail. Highest-conviction signal in the tool.
61
+ - **High volume + `in_usd` ≈ `out_usd`** = churn (DEX MM, arb bots). Low signal. If `in_usd` equals `out_usd` to the cent and `net_flow_usd` is exactly `0.0`, the figure is almost certainly transfer volume counted on both sides, not a quiet token.
62
+ - **High volume + strong `net_flow_usd`** = real demand. Worth investigating with `vike-data token transfers`.
63
+ - **Many active wallets + flat volume** = small transactions spread widely (airdrop claims also look like this).
64
+ - **`smart_inflow` + high values + low overall volume** = cohort positioned before retail. A screen to start from, not a verdict: confirm with `token transfers`.
58
65
 
59
66
  ## Filter tips
60
67
 
61
68
  | Goal | Filters |
62
69
  |---|---|
63
- | "Rising memecoins" | `--window 24h --sort holders --min-holders 50 --min-volume 50000` |
64
- | "Mid-cap alpha" | `--sort smart_inflow --min-volume 500000 --smart-money-only` |
65
- | "What's getting dumped" | `--sort net_inflow` then reverse — bottom rows have biggest outflows |
70
+ | "Busy memecoins" | `--window 24h --sort holders --min-holders 50 --min-volume 50000` |
71
+ | "Mid-cap smart-money inflow" | `--sort smart_inflow --min-volume 500000 --smart-money-only` |
72
+ | "What's getting dumped" | **Not answerable from the screener** (no ascending sort, no outflow rank). For one known token use `vike-data token transfers <addr> --tab sold` |
66
73
 
67
74
  ## Anti-patterns
68
75
 
69
- - Don't quote the symbol as authoritative if `symbol` is null/blank — token hasn't been mapped, identify by address instead
70
- - Don't use `--window 24h --sort smart_inflow` for hot-new-token discovery — smart money usually positions BEFORE the 24h window; try `--window 7d` for that mode
71
- - Don't omit `--min-holders` when sorting by holders — junk airdrops with 50,000 1-tx addresses dominate the top otherwise
72
- - Don't omit `--min-volume` when sorting by net_inflow — tiny tokens with $100 net flow can rank high in % terms
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
+ - Don't omit `--min-holders` when sorting by `holders`: junk airdrops with 50,000 one-transaction addresses dominate the top otherwise.
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.
73
80
 
74
81
  ## Cost note
75
82
 
76
- 3 credits per call. Cheaper than `wallet trace` (which is 4) but heavier than per-tool lookups. Use deliberately for discovery, not as a default.
83
+ 3 credits per call. Cheaper than `wallet trace` (4) but heavier than per-tool lookups. Use deliberately for discovery, not as a default.
77
84
 
78
85
  ## Pairs well with
79
86
 
80
- - `vike-data token holders <addr>` — drill into the top holders of any flagged token
81
- - `vike-data token transfers <addr>` — see WHO is buying/selling once a token is interesting
82
- - `vike-smart-money-discovery` — composite playbook starting from this screen
87
+ - `vike-data token holders <addr>`: who moves the most of a flagged token
88
+ - `vike-data token transfers <addr>`: WHO is buying/selling once a token is interesting (read `net_tokens`)
89
+ - `vike-smart-money-discovery`: composite playbook starting from this screen
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: vike-token-search
3
3
  description: Resolve a token symbol or name into the canonical contract address + chain + metadata. Use this BEFORE any other token command — most tools need the address, not the symbol.
4
- allowed-tools: Bash(vike:*)
4
+ allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
7
7
  # vike-token-search
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: vike-token-transfers
3
- description: Top buyers or top sellers of a specific token over a window. Use when the user asks "who bought X" / "who sold X" / "is whale Y buying Z".
4
- allowed-tools: Bash(vike:*)
3
+ description: Top buyers or top sellers of a specific token over a window, with net token and USD flow per wallet. Use when the user asks "who bought X" / "who sold X" / "is whale Y buying Z".
4
+ allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
7
7
  # vike-token-transfers
@@ -10,33 +10,43 @@ allowed-tools: Bash(vike:*)
10
10
 
11
11
  ```bash
12
12
  vike-data token transfers <token_address>
13
- [--tab bought|sold]
14
- [--period 1h|24h|7d|30d]
13
+ [--tab bought|sold] # default sold; ONE side per call
14
+ [--period 1h|24h|7d|30d] # default 24h
15
15
  [--chain ethereum|bsc|base|all]
16
16
  [--json]
17
17
  ```
18
18
 
19
+ There is no `--limit`: every call returns the top 10 wallets for that side. For both sides, call twice.
20
+
19
21
  ## When to use
20
22
 
21
- - "Who's accumulating X?" → `--tab bought --period 24h`
22
- - "Who's dumping X?" → `--tab sold --period 24h`
23
- - "Smart money on X this week" → `--tab bought --period 7d`, then cross-reference labels
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`
25
+ - "Smart money on X this week" → `--tab bought --period 7d`, label the addresses with `vike-data wallet batch`
24
26
 
25
27
  ## Output columns
26
28
 
27
- Each row is one wallet: `address`, `qty`, `usd_value`, `label` (if known), `tx_count`.
29
+ Each row is one wallet: `address`, `bought`, `sold`, `net_tokens`, `usd_spent`, `usd_received`, `net_usd`, `chains`. Amounts are whole tokens and plain USD. The remaining fields (`addr_short`, the `*_fmt` strings, `net_usd_raw`, `net_bar_pct`) are pre-rendered for a UI: ignore them.
30
+
31
+ There is no `qty`, `usd_value`, `label` or `tx_count` column. To label an address use `vike-data wallet batch`.
28
32
 
29
33
  ## Reading tips
30
34
 
31
- - The same wallet appearing in both `bought` and `sold` lists for the same period = market maker / churn (not a signal).
32
- - High `usd_value` with low `tx_count` = a single large discretionary trade. Worth investigating with `vike-data wallet summary <address>`.
33
- - Many small transfers from labeled exchanges = retail flow via that CEX (Binance, Coinbase, etc.).
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
+ - **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
+ - The two sides of the same period are separate top-10 lists. The same wallet in both = market maker / churn, not a signal.
38
+ - 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".
39
+ - Many small transfers from labeled exchanges = retail flow via that CEX.
40
+ - The native coin appears as `0x0000000000000000000000000000000000000000` in the screener and has no buyers here. Pass a contract address.
34
41
 
35
42
  ## Anti-patterns
36
43
 
37
- - Don't request `--chain all` unless you really need cross-chain — it's slower and returns more rows.
44
+ - Don't call a wallet a buyer or seller from `bought` / `sold` alone. Check `net_tokens`.
45
+ - 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.
38
46
  - 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.
39
48
 
40
49
  ## Pairs well with
41
50
 
51
+ - `vike-data wallet batch <addr...>` to label the rows and drop CEX / router rows
42
52
  - `vike-data wallet summary <addr>` to profile any interesting buyer/seller
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: vike-wallet-balances
3
- description: Current ERC-20 token balances for a wallet across major EVM chains (eth, bsc, base, arbitrum, polygon, optimism). Dust filtered. Use when the user asks "what does this wallet hold" / "current portfolio of X" / "show top holdings".
4
- allowed-tools: Bash(vike:*)
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".
4
+ allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
7
7
  # vike-wallet-balances
@@ -10,15 +10,17 @@ allowed-tools: Bash(vike:*)
10
10
 
11
11
  ```bash
12
12
  vike-data wallet balances <address>
13
- [--chains eth,bsc,base,arbitrum,polygon,optimism] (default = all 6)
14
- [--min-usd 1] (filter dust below this)
13
+ [--chains ethereum,bsc] (default: every chain the server scans)
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`.
19
+
18
20
  ## Example
19
21
 
20
22
  ```bash
21
- vike-data wallet balances 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 --chains eth,arbitrum
23
+ vike-data wallet balances 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 --chains ethereum
22
24
  ```
23
25
 
24
26
  ## Output
@@ -26,30 +28,34 @@ vike-data wallet balances 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 --chains et
26
28
  ```json
27
29
  {
28
30
  "address": "0x...",
29
- "total_usd": 123456.78,
30
- "chains_scanned": ["eth", "bsc", "base", "arbitrum", "polygon", "optimism"],
31
+ "total_usd": 10532.82,
32
+ "chains_scanned": ["ethereum"],
31
33
  "holdings": [
32
- { "chain": "eth", "symbol": "WETH", "name": "Wrapped Ether", "address": "0xc02a...", "balance": "12.34", "usd_value": 26345.67, "usd_price": 2134.94 },
33
- { "chain": "arbitrum", "symbol": "USDC", "address": "0xaf88...", "balance": "5000.00", "usd_value": 5000.00, "usd_price": 1.0 },
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
+ { "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 }
35
37
  ]
36
38
  }
37
39
  ```
38
40
 
39
- Holdings sorted by `usd_value` descending.
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.
40
42
 
41
43
  ## Reading
42
44
 
43
- - `total_usd` = sum across all chains scanned. Wallet might still hold value on chains not scanned (e.g. zkSync, Linea) — say so when relevant.
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.
47
+ - **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
+ - `total_usd` covers `chains_scanned` only. The wallet may hold value on chains the tool does not scan: say so when relevant.
44
49
  - Stablecoin-heavy wallet → likely waiting for a buy / parked dry powder
45
50
  - WETH/WBTC + LSTs (stETH, wstETH, rETH) → "saver" wallet, low-risk
46
51
  - 50+ random tokens → airdrop farmer
47
- - Empty `holdings` array → either no balance OR the address hasn't been indexed yet (very new wallets)
52
+ - Empty `holdings` array → no priced balance above the floor, or a very new wallet we have not seen yet.
48
53
 
49
54
  ## Anti-patterns
50
55
 
51
- - This is ERC-20 only — does NOT include native ETH/BNB/MATIC (would need separate calls; not in our current tool surface). Mention this when reporting "total holdings".
56
+ - Don't report `total_usd` as the wallet's value without "of priced tokens" and the native balance next to it.
52
57
  - For wallets with 100+ tokens, the response is large — use `--min-usd 100` or higher to focus on meaningful holdings.
58
+ - This is a point-in-time read, not history. For how the wallet got here use `wallet pnl-history`.
53
59
 
54
60
  ## Pairs well with
55
61
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: vike-wallet-batch
3
- description: Bulk label + 30d summary lookup for up to 100 addresses in one call. Use when the user pastes a CSV of addresses, asks "enrich this list with labels", or wants to quickly screen many wallets for entity / risk / activity.
4
- allowed-tools: Bash(vike:*)
3
+ description: Bulk label + 30d summary lookup for up to 100 addresses in one call, per chain. Use when the user pastes a CSV of addresses, asks "enrich this list with labels", or wants to quickly screen many wallets for entity / risk / activity.
4
+ allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
7
7
  # vike-wallet-batch
@@ -10,7 +10,7 @@ allowed-tools: Bash(vike:*)
10
10
 
11
11
  ```bash
12
12
  vike-data wallet batch <addr1> <addr2> <addr3> ...
13
- [--chain ethereum|bsc|base]
13
+ [--chain ethereum|bsc|base] # default ethereum; labels and flows are read from THAT chain's tables
14
14
  [--json]
15
15
  ```
16
16
 
@@ -24,32 +24,36 @@ vike-data wallet batch 0xd8da... 0xabc... 0xdef... --json
24
24
 
25
25
  ## Output
26
26
 
27
- One row per INPUT address (preserves input order — useful when joining back to a source CSV):
27
+ One row per INPUT address (preserves input order — useful when joining back to a source CSV). Each row echoes its own `wallet`, lower-cased: compare case-insensitively.
28
28
 
29
29
  ```json
30
30
  [
31
- { "wallet": "0xd8da...", "entity": null, "wallet_type": "user", "confidence": "Medium", "risk_flag": null, "net_30d_usd": 12000, "volume_30d_usd": 50000, "tx_30d": 42, "tokens_30d_count": 8, "found": true },
32
- { "wallet": "0xabc...", "entity": "Binance", "wallet_type": "cex", "confidence": "High", "risk_flag": null, "net_30d_usd": -5e9, "volume_30d_usd": 9e9, "tx_30d": 2000, "tokens_30d_count": 80, "found": true },
33
- { "wallet": "0xdef...", "entity": null, "wallet_type": null, "confidence": null, "risk_flag": null, "net_30d_usd": 0, "volume_30d_usd": 0, "tx_30d": 0, "tokens_30d_count": 0, "found": false }
31
+ { "wallet": "0xd8da...", "entity": "vitalik buterin", "wallet_type": "dex", "confidence": "medium", "risk_flag": "", "net_30d_usd": -70023.25, "volume_30d_usd": 70046.75, "tx_30d": 454, "tokens_30d_count": 157, "found": true },
32
+ { "wallet": "0xabc...", "entity": "binance", "wallet_type": "cex", "confidence": "high", "risk_flag": "", "net_30d_usd": -5e9, "volume_30d_usd": 9e9, "tx_30d": 2000, "tokens_30d_count": 80, "found": true },
33
+ { "wallet": "0xdef...", "entity": null, "wallet_type": null, "confidence": null, "risk_flag": null, "net_30d_usd": null, "volume_30d_usd": null, "tx_30d": null, "tokens_30d_count": null, "found": false }
34
34
  ]
35
35
  ```
36
36
 
37
- `found: false` = address has no labels AND no 30d activity in our DB (might be brand-new wallet or one we haven't indexed).
37
+ ## Chain behaviour
38
+
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.
38
42
 
39
43
  ## Reading
40
44
 
41
45
  - Filter to `wallet_type = "user"` to find real-people addresses worth investigating further
42
- - Any `risk_flag != null` → flag prominently in any user-facing report
43
- - High `volume_30d_usd` but `tx_30d = 0` shouldn't happen — if it does, indicates stale aggregate; recompute
44
- - `entity = "Binance"` + `wallet_type = "cex"` rows in a "smart money" list = false positives (CEX deposits aren't traders)
46
+ - Any `risk_flag` that is non-empty → flag prominently in any user-facing report
47
+ - `entity = "binance"` + `wallet_type = "cex"` rows in a "smart money" list = false positives (CEX deposits aren't traders)
48
+ - Use it to label the output of `token transfers`, `wallet counterparties`, `wallet discover` or `token holders` in one call
45
49
 
46
50
  ## Anti-patterns
47
51
 
48
- - Don't run individual `vike-data wallet summary` in a loop for >5 addresses — this batch is ~20× faster
49
- - Don't pass mixed-case addresses inconsistently — they're normalised but cleaner CSVs help readers
50
- - Don't expect lifetime data — this is 30d window. For lifetime use the individual `wallet summary`
52
+ - Don't run individual `vike-data wallet summary` in a loop for >5 addresses — this batch is far faster for labels and 30d activity
53
+ - Don't pass a mix of chains in one call: pick the chain the addresses were seen on
54
+ - Don't expect lifetime data — this is a 30d window. For lifetime use `wallet summary`
51
55
 
52
56
  ## Pairs well with
53
57
 
54
- - `vike-data labels <addr>` — drill into any address showing high-confidence labels
58
+ - `vike-data labels <addr>` — drill into any Ethereum address with high-confidence labels (source attribution)
55
59
  - `vike-data wallet compare <a> <b>` — pick two interesting batch results and diff them
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: vike-wallet-compare
3
3
  description: Diff two wallets — find their shared counterparties (both transacted with these addresses) and shared tokens (both touched these tokens) within a window. Use when the user asks "are these two wallets related" / "what do X and Y have in common" / "find connections between wallet A and B".
4
- allowed-tools: Bash(vike:*)
4
+ allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
7
7
  # vike-wallet-compare
@@ -16,6 +16,8 @@ vike-data wallet compare <address_a> <address_b>
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".
20
+
19
21
  ## Output
20
22
 
21
23
  ```json
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: vike-wallet-counterparties
3
3
  description: Find the top trading partners of a wallet — who it sent to and received from, ranked by combined USD volume. Use when the user asks "who does this wallet trade with" / "main counterparties of X" / "find connections between wallets".
4
- allowed-tools: Bash(vike:*)
4
+ allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
7
7
  # vike-wallet-counterparties
@@ -16,6 +16,8 @@ vike-data wallet counterparties <address>
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".
20
+
19
21
  ## Example
20
22
 
21
23
  ```bash
@@ -28,6 +30,8 @@ vike-data wallet counterparties 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 --win
28
30
 
29
31
  ## Reading
30
32
 
33
+ - `sent_usd` / `received_usd` are from the QUERIED wallet's side: `sent_usd` is what it sent to that counterparty.
34
+ - `first_seen` is the first contact inside the window, not the first ever (widening the window moves it).
31
35
  - **Sent + Received roughly equal** = active trading partner (DEX router, MM, regular counterparty)
32
36
  - **Sent >> Received** = wallet pays this counterparty (deposit address, contract call)
33
37
  - **Received >> Sent** = wallet receives from this counterparty (funding source, employer, airdrop)
@@ -37,7 +41,7 @@ vike-data wallet counterparties 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 --win
37
41
 
38
42
  ## Anti-patterns
39
43
 
40
- - Don't claim two wallets are "controlled by the same person" from counterparties alone — many people deposit to the same Binance address. Pair with `vike-wallet-clustering` (deferred) or manual investigation.
44
+ - Don't claim two wallets are "controlled by the same person" from counterparties alone — many people deposit to the same Binance address. There is no clustering tool; use `vike-data wallet compare` (shared counterparties and tokens) and `vike-data wallet trace` as evidence, and say it is only evidence.
41
45
  - Window matters: a 24h view captures recent activity but misses long-standing relationships. Default to 30d, expand to `all` for full history.
42
46
  - For tokens with high churn (memecoins), top counterparties will be dominated by Uniswap routers; filter mentally for non-DEX rows for human counterparties.
43
47