@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.
- package/CHANGELOG.md +10 -0
- package/README.md +10 -10
- package/package.json +1 -1
- package/skills/vike/SKILL.md +119 -191
- package/skills/vike-alerts-setup/SKILL.md +1 -0
- package/skills/vike-candles/SKILL.md +2 -2
- package/skills/vike-core/SKILL.md +13 -12
- package/skills/vike-hl-position-match/SKILL.md +7 -7
- package/skills/vike-hl-top-traders/SKILL.md +46 -11
- package/skills/vike-perp-funding/SKILL.md +82 -0
- package/skills/vike-perp-overview/SKILL.md +69 -0
- package/skills/vike-polymarket-market-detail/SKILL.md +2 -1
- package/skills/vike-polymarket-markets/SKILL.md +12 -7
- package/skills/vike-polymarket-smart-money/SKILL.md +38 -13
- package/skills/vike-polymarket-trader/SKILL.md +23 -20
- package/skills/vike-smart-money-discovery/SKILL.md +26 -32
- package/skills/vike-token-holders/SKILL.md +2 -1
- package/skills/vike-token-research/SKILL.md +22 -14
- package/skills/vike-token-screener/SKILL.md +35 -28
- package/skills/vike-token-transfers/SKILL.md +21 -11
- package/skills/vike-wallet-balances/SKILL.md +19 -13
- package/skills/vike-wallet-batch/SKILL.md +18 -14
- package/skills/vike-wallet-compare/SKILL.md +2 -0
- package/skills/vike-wallet-counterparties/SKILL.md +5 -1
- package/skills/vike-wallet-discover/SKILL.md +17 -10
- package/skills/vike-wallet-ens/SKILL.md +8 -4
- package/skills/vike-wallet-label-provenance/SKILL.md +25 -16
- package/skills/vike-wallet-pnl-history/SKILL.md +4 -1
- package/skills/vike-wallet-portfolio/SKILL.md +23 -21
- package/skills/vike-wallet-summary/SKILL.md +22 -9
- package/skills/vike-wallet-trace/SKILL.md +15 -11
- package/skills/vike-wallet-transactions/SKILL.md +3 -1
- package/skills.sh.json +10 -15
- package/src/auth.js +1 -1
- package/src/commands/init.js +1 -1
- package/src/commands/labels.js +1 -1
- package/src/commands/perp.js +5 -4
- package/src/commands/wallet.js +3 -3
- package/skills/vike-cross-venue-perps/SKILL.md +0 -52
- package/skills/vike-hl-trader-profile/SKILL.md +0 -65
- package/skills/vike-perp-funding-arb/SKILL.md +0 -53
- package/skills/vike-perp-screener/SKILL.md +0 -48
- package/skills/vike-perp-spread-arb/SKILL.md +0 -38
- package/skills/vike-polymarket-screener/SKILL.md +0 -59
- package/skills/vike-router/SKILL.md +0 -54
|
@@ -1,74 +1,68 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: vike-smart-money-discovery
|
|
3
|
-
description:
|
|
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
|
|
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.
|
|
15
|
+
### A. Which tokens is the cohort buying?
|
|
14
16
|
|
|
15
17
|
```bash
|
|
16
|
-
vike-data
|
|
18
|
+
vike-data token screener --chain ethereum --window 7d --sort smart_inflow --smart-money-only --limit 100 --json
|
|
17
19
|
```
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
-
|
|
21
|
-
- `
|
|
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
|
-
|
|
25
|
+
### B. Who is accumulating it?
|
|
29
26
|
|
|
30
27
|
```bash
|
|
31
|
-
vike-data token
|
|
28
|
+
vike-data token transfers <addr> --tab bought --period 7d --json
|
|
32
29
|
```
|
|
33
30
|
|
|
34
|
-
|
|
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
|
|
36
|
+
vike-data wallet batch <addr1> <addr2> ... --json
|
|
38
37
|
```
|
|
39
38
|
|
|
40
|
-
|
|
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
|
-
|
|
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:**
|
|
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
|
|
64
|
-
- Don't
|
|
65
|
-
-
|
|
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
|
|
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
|
|
68
|
+
- `vike-perp-funding` if the token has a perp listing (positioning bias)
|
|
@@ -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
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
33
|
+
## Verdict heuristics
|
|
28
34
|
|
|
29
|
-
|
|
|
35
|
+
| Net accumulators' USD vs net distributors' USD (24h) | Verdict |
|
|
30
36
|
|---|---|
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
|
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
|
-
|
|
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:
|
|
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
|
|
50
|
-
- `vike-perp-funding
|
|
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 /
|
|
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]
|
|
17
|
-
[--min-volume USD]
|
|
18
|
-
[--min-holders N]
|
|
19
|
-
[--smart-money-only]
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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)
|
|
48
|
-
| `net_inflow` |
|
|
49
|
-
| `holders` |
|
|
50
|
-
| `smart_inflow` | Tokens
|
|
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 +
|
|
55
|
-
- **High volume + strong
|
|
56
|
-
- **
|
|
57
|
-
- **`smart_inflow`
|
|
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
|
-
| "
|
|
64
|
-
| "Mid-cap
|
|
65
|
-
| "What's getting dumped" |
|
|
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
|
|
70
|
-
- Don't
|
|
71
|
-
- Don't omit `--min-
|
|
72
|
-
- Don't
|
|
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` (
|
|
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
|
|
81
|
-
- `vike-data token transfers <addr
|
|
82
|
-
- `vike-smart-money-discovery
|
|
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`,
|
|
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`, `
|
|
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
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
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
|
|
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
|
|
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
|
|
14
|
-
[--min-usd 1]
|
|
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
|
|
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":
|
|
30
|
-
"chains_scanned": ["
|
|
31
|
+
"total_usd": 10532.82,
|
|
32
|
+
"chains_scanned": ["ethereum"],
|
|
31
33
|
"holdings": [
|
|
32
|
-
{ "chain": "
|
|
33
|
-
{ "chain": "
|
|
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
|
-
- `
|
|
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 →
|
|
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
|
-
-
|
|
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,6 +1,6 @@
|
|
|
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.
|
|
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
4
|
allowed-tools: Bash(vike-data:*)
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ allowed-tools: Bash(vike-data:*)
|
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
vike-data wallet 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":
|
|
32
|
-
{ "wallet": "0xabc...", "entity": "
|
|
33
|
-
{ "wallet": "0xdef...", "entity": null,
|
|
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
|
-
|
|
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
|
|
43
|
-
-
|
|
44
|
-
-
|
|
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
|
|
49
|
-
- Don't pass
|
|
50
|
-
- Don't expect lifetime data — this is 30d window. For lifetime use
|
|
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
|
|
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
|
|
@@ -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
|
|
@@ -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.
|
|
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
|
|