@vike-io/cli 0.13.1 → 0.15.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 (59) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +33 -19
  3. package/package.json +4 -4
  4. package/skills/vike/SKILL.md +144 -192
  5. package/skills/vike-alerts-setup/SKILL.md +37 -6
  6. package/skills/vike-alerts-webhook/SKILL.md +15 -8
  7. package/skills/vike-candles/SKILL.md +9 -2
  8. package/skills/vike-core/SKILL.md +16 -12
  9. package/skills/vike-hl-position-match/SKILL.md +8 -8
  10. package/skills/vike-hl-top-traders/SKILL.md +46 -11
  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 +2 -1
  14. package/skills/vike-polymarket-markets/SKILL.md +12 -7
  15. package/skills/vike-polymarket-smart-money/SKILL.md +38 -13
  16. package/skills/vike-polymarket-trader/SKILL.md +23 -20
  17. package/skills/vike-smart-money-discovery/SKILL.md +26 -32
  18. package/skills/vike-stream/SKILL.md +98 -0
  19. package/skills/vike-token-holders/SKILL.md +2 -1
  20. package/skills/vike-token-research/SKILL.md +22 -14
  21. package/skills/vike-token-screener/SKILL.md +35 -28
  22. package/skills/vike-token-transfers/SKILL.md +21 -11
  23. package/skills/vike-wallet-balances/SKILL.md +19 -13
  24. package/skills/vike-wallet-batch/SKILL.md +18 -14
  25. package/skills/vike-wallet-compare/SKILL.md +2 -0
  26. package/skills/vike-wallet-counterparties/SKILL.md +5 -1
  27. package/skills/vike-wallet-discover/SKILL.md +17 -10
  28. package/skills/vike-wallet-ens/SKILL.md +8 -4
  29. package/skills/vike-wallet-label-provenance/SKILL.md +25 -16
  30. package/skills/vike-wallet-pnl-history/SKILL.md +4 -1
  31. package/skills/vike-wallet-portfolio/SKILL.md +23 -21
  32. package/skills/vike-wallet-summary/SKILL.md +22 -9
  33. package/skills/vike-wallet-trace/SKILL.md +15 -11
  34. package/skills/vike-wallet-transactions/SKILL.md +3 -1
  35. package/skills.sh.json +17 -15
  36. package/src/auth.js +1 -1
  37. package/src/commands/alerts.js +85 -15
  38. package/src/commands/call.js +32 -0
  39. package/src/commands/candles.js +11 -15
  40. package/src/commands/doctor.js +4 -4
  41. package/src/commands/hl.js +274 -0
  42. package/src/commands/init.js +1 -1
  43. package/src/commands/labels.js +1 -1
  44. package/src/commands/perp.js +10 -9
  45. package/src/commands/polymarket.js +105 -5
  46. package/src/commands/search.js +10 -0
  47. package/src/commands/stream.js +308 -0
  48. package/src/commands/token.js +2 -0
  49. package/src/commands/tool-command.js +27 -0
  50. package/src/commands/wallet.js +24 -3
  51. package/src/index.js +10 -1
  52. package/src/mcp-client.js +37 -16
  53. package/skills/vike-cross-venue-perps/SKILL.md +0 -52
  54. package/skills/vike-hl-trader-profile/SKILL.md +0 -65
  55. package/skills/vike-perp-funding-arb/SKILL.md +0 -53
  56. package/skills/vike-perp-screener/SKILL.md +0 -48
  57. package/skills/vike-perp-spread-arb/SKILL.md +0 -38
  58. package/skills/vike-polymarket-screener/SKILL.md +0 -59
  59. 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".
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
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)
@@ -0,0 +1,98 @@
1
+ ---
2
+ name: vike-stream
3
+ description: Live events over WebSocket with `vike-data stream` - Hyperliquid fills, liquidations, positions, liquidation risk, order walls, closed candles, TWAPs, ledger, leverage changes and funding; HL cohort flow, indices and cohort bias; on-chain transfers on eth, bsc, base and hyperevm; Polymarket trades, resolutions, price moves and new markets - printed as NDJSON, resumed by cursor after any drop. Use when the user wants to "watch", "tail", "follow live", "stream" or "be notified as it happens" rather than query history.
4
+ allowed-tools: Bash(vike-data:*)
5
+ ---
6
+
7
+ # vike-stream
8
+
9
+ ```bash
10
+ vike-data stream <hl|hl-cohorts|onchain|polymarket> --channel <channel...> [--filter key=value ...] [--cursor <cursor>]
11
+ ```
12
+
13
+ Connects to `wss://stream.vike.io/v1/stream/<path>` with the API key in the `X-API-KEY` header, subscribes once per
14
+ `--channel`, and prints one JSON object per line on stdout: every `event` frame and every `gap` frame, exactly as the
15
+ server sent them. Status lines (subscribed, reconnecting, errors) go to stderr. It runs until Ctrl-C.
16
+
17
+ | Path | Channels |
18
+ |---|---|
19
+ | `hl` | `hl.fills`, `hl.liquidations`, `hl.positions`, `hl.liq_risk`, `hl.order_walls`, `hl.candles`, `hl.twaps`, `hl.ledger`, `hl.leverage`, `hl.funding` |
20
+ | `hl-cohorts` | `hl.cohort_flow`, `hl.indices`, `hl.cohort_bias` |
21
+ | `onchain` | `chain.transfers` |
22
+ | `polymarket` | `pm.trades`, `pm.resolutions`, `pm.price_moves`, `pm.new_markets` |
23
+
24
+ The server decides what each path serves: `vike-data stream info` prints the current channels and filter keys, and a
25
+ channel the path does not serve is refused with `unknown_channel` and the list. The CLI has no channel list of its own.
26
+
27
+ `hl.candles` is the Hyperliquid candle stream: closed bars, filtered by `coin`, `interval` (`1m 5m 15m 30m 1h 4h 1d`),
28
+ `market` (`perp` or `spot`) and `dex` (`HL` or a HIP-3 dex). The old `wss://data.vike.io/v1/stream` is closed (410).
29
+
30
+ ## Examples
31
+
32
+ ```bash
33
+ # Hyperliquid BTC and ETH fills of $100k or more, by smart wallets
34
+ vike-data stream hl --channel hl.fills --filter coin=BTC,ETH --filter min_usd=100000 --filter "pnl_cohort=3x smart,2x smart"
35
+
36
+ # Live 1-minute and 1-hour BTC and ETH perp candles (closed bars)
37
+ vike-data stream hl --channel hl.candles --filter coin=BTC,ETH --filter interval=1m,1h --filter market=perp
38
+
39
+ # Every liquidation and every fill of one wallet, on one connection
40
+ vike-data stream hl --channel hl.liquidations hl.fills --filter wallet=0x1111111111111111111111111111111111111111
41
+
42
+ # USDC transfers on base worth $1M+
43
+ vike-data stream onchain --channel chain.transfers --filter chain=base --filter token=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 --filter min_usd=1000000
44
+
45
+ # Keep only the events, with jq
46
+ vike-data stream polymarket --channel pm.trades --filter min_usd=10000 | jq -c 'select(.type == "event") | .event'
47
+ ```
48
+
49
+ `--filter` applies to every `--channel` of the command; a key the channel does not take is refused by the server
50
+ with the key's name. List keys (`wallet`, `coin`, `token`, `market`, `chain`, cohorts, ...) take comma-separated
51
+ values and repeat; `side`, `direction`, `event`, `axis`, `move`, `role` take one value; `true` / `false` is sent as a yes/no (`contract=false`); `min_usd`, `min_amount`, `min_move`
52
+ take a number. Channel fields and filter keys: https://vike.io/docs/data/reference/stream-channels
53
+
54
+ ## Without a socket
55
+
56
+ These are MCP calls: they open no connection, so they never replace one.
57
+
58
+ ```bash
59
+ vike-data stream info --json # every path, channel, filter key, limit and close code
60
+ vike-data stream check hl.fills --filter coin=BTC --filter min_usd=50000 # the server's own validator; exit 1 if refused
61
+ vike-data stream events hl.liquidations --filter coin=BTC --since-ms 1793178870000 --json # stored events (3 days), paged by --cursor
62
+ vike-data stream connections --hours 24 --json # your recent connections: who closed whom (4410), events sent
63
+ ```
64
+
65
+ Run `stream check` before a long-running `stream`: it shows the filter exactly as the server will apply it (with
66
+ the `hl.fills` default `min_usd` of 1000 added) or the server's error naming the bad key.
67
+
68
+ ## Reading the output
69
+
70
+ - Keep the **frame's** `cursor` (the top-level one, not `event.cursor`) of the last line you handled. `--cursor <it>`
71
+ on the next run resumes from there, up to 3 days back; older is `cursor_expired` and the stream continues from now.
72
+ - The CLI resumes by itself after any drop (restart, network, slow reader) from the last cursor of each subscription.
73
+ Delivery is at least once: drop a repeated `event.event_id`.
74
+ - A `gap` frame (`reason: channel_idle`) means the channel was not running between `from` and `to` (nobody was
75
+ subscribed). It does not mean nothing happened; read that window from the REST endpoints or the `hl` / `polymarket`
76
+ commands. For what a socket missed while the channel was running, `vike-data stream events <channel> --cursor <c>`.
77
+ - `hl.fills` without `min_usd` gets a $1,000 floor; `min_usd=0` is every fill (hundreds per second).
78
+ `chain.transfers` unfiltered is a firehose; `min_usd` on it drops unpriced transfers.
79
+
80
+ ## One connection per key
81
+
82
+ On each path, one API key holds one connection; an account holds at most 3. A second program on the same key and
83
+ path takes over, and the first exits with `replaced (4410)` and does not reconnect (two programs reconnecting would
84
+ take the connection from each other forever). Give each program its own key (`VIKE_API_KEY=... vike-data stream ...`).
85
+ `vike-data stream connections` shows which of your connections closed which.
86
+ Exit 1 also on `HTTP 401` / `4401` (the key) and on a refused subscription (`bad_subscription`, `unknown_channel`).
87
+
88
+ ## Anti-patterns
89
+
90
+ - Don't run two `vike-data stream` processes on the same key and path: they replace each other.
91
+ - Don't treat silence as "nothing happened" in the first minutes: an idle channel starts on demand (up to ~12 minutes
92
+ for `hl.indices` and `hl.liq_risk`).
93
+ - Don't use the stream for history: it keeps 3 days. Use the query commands.
94
+
95
+ ## Pairs well with
96
+
97
+ - `vike-alerts-setup`: a stored rule that notifies by webhook without a running process.
98
+ - `vike-hl-top-traders`: pick the wallets to put in a `wallet` filter.
@@ -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>".
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
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,6 +1,6 @@
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.
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
4
  allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
@@ -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,6 +1,6 @@
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".
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
4
  allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
@@ -10,33 +10,43 @@ allowed-tools: Bash(vike-data:*)
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,6 +1,6 @@
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".
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
4
  allowed-tools: Bash(vike-data:*)
5
5
  ---
6
6
 
@@ -10,15 +10,17 @@ allowed-tools: Bash(vike-data:*)
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