nansen-cli 1.7.0 → 1.9.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/AGENTS.md +118 -164
- package/CLAUDE.md +16 -19
- package/README.md +163 -112
- package/SKILL.md +170 -76
- package/package.json +3 -1
- package/scripts/check-changeset.js +28 -0
- package/src/api.js +92 -70
- package/src/chain-ids.js +19 -0
- package/src/cli.js +406 -353
- package/src/ens.js +163 -0
- package/src/trading.js +324 -25
- package/src/transfer.js +133 -2
- package/src/update-check.js +35 -0
- package/src/wallet.js +11 -9
- package/src/walletconnect-exec.js +22 -0
- package/src/walletconnect-trading.js +91 -0
- package/src/walletconnect-x402.js +215 -0
- package/vitest.e2e.config.js +10 -0
package/SKILL.md
CHANGED
|
@@ -1,136 +1,230 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: nansen-cli
|
|
3
|
-
description:
|
|
3
|
+
description: Nansen CLI for onchain analytics, smart money tracking, DEX trading, and perp markets.
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
6
|
author: nansen-ai
|
|
7
|
-
version: "1.
|
|
8
|
-
|
|
7
|
+
version: "1.8.0"
|
|
8
|
+
repository: https://github.com/nansen-ai/nansen-cli
|
|
9
|
+
compatibility: Node.js 18+. Works with Claude Code, Codex, Cursor, Windsurf, and any terminal-native agent.
|
|
9
10
|
---
|
|
10
11
|
|
|
11
12
|
# Nansen CLI
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
Onchain analytics and DEX trading for AI agents.
|
|
14
15
|
|
|
15
|
-
##
|
|
16
|
+
## Quick Reference
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
```bash
|
|
19
|
+
# Search for any token, wallet, or entity
|
|
20
|
+
nansen research search "jupiter" --type token
|
|
21
|
+
|
|
22
|
+
# Token price (OHLCV)
|
|
23
|
+
nansen research token ohlcv --token <addr> --chain solana --timeframe 1h --limit 24
|
|
24
|
+
|
|
25
|
+
# Smart Money — what are the pros buying?
|
|
26
|
+
nansen research smart-money netflow --chain solana --limit 10
|
|
27
|
+
|
|
28
|
+
# Token screener — trending tokens
|
|
29
|
+
nansen research token screener --chain solana --timeframe 24h --smart-money --limit 20
|
|
30
|
+
|
|
31
|
+
# Trade — quote then execute
|
|
32
|
+
nansen trade quote --chain solana --from <from_token_address> --to <to_token_address> --amount <base_units>
|
|
33
|
+
nansen trade execute --quote <quote-id>
|
|
34
|
+
|
|
35
|
+
# Create a wallet
|
|
36
|
+
nansen wallet create # interactive
|
|
37
|
+
NANSEN_WALLET_PASSWORD="pass" nansen wallet create # non-interactive
|
|
38
|
+
|
|
39
|
+
# Discover all commands, options, and return fields
|
|
40
|
+
nansen schema
|
|
41
|
+
```
|
|
18
42
|
|
|
19
43
|
## Setup
|
|
20
44
|
|
|
21
45
|
```bash
|
|
22
|
-
# Install globally
|
|
23
46
|
npm install -g nansen-cli
|
|
47
|
+
```
|
|
24
48
|
|
|
25
|
-
|
|
49
|
+
### Auth (pick one)
|
|
26
50
|
|
|
27
|
-
|
|
28
|
-
mkdir -p ~/.nansen && echo '{"apiKey":"YOUR_KEY","baseUrl":"https://api.nansen.ai"}' > ~/.nansen/config.json && chmod 600 ~/.nansen/config.json
|
|
51
|
+
**x402 Pay-Per-Call (no API key needed):**
|
|
29
52
|
|
|
30
|
-
|
|
31
|
-
|
|
53
|
+
```bash
|
|
54
|
+
nansen wallet create # Generates EVM + Solana keypair
|
|
55
|
+
# Fund the EVM address with USDC on Base (~$0.50 minimum)
|
|
56
|
+
export NANSEN_WALLET_PASSWORD="your-password" # Skip interactive prompt
|
|
57
|
+
# Done — CLI auto-pays $0.01-$0.05 per call
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**API Key:**
|
|
32
61
|
|
|
33
|
-
|
|
34
|
-
|
|
62
|
+
```bash
|
|
63
|
+
export NANSEN_API_KEY=your-api-key
|
|
64
|
+
# Or: nansen login --api-key YOUR_KEY
|
|
35
65
|
```
|
|
36
66
|
|
|
37
|
-
Get
|
|
67
|
+
Get a key at [app.nansen.ai/api](https://app.nansen.ai/api).
|
|
38
68
|
|
|
39
|
-
|
|
69
|
+
## Smart Money
|
|
40
70
|
|
|
41
71
|
```bash
|
|
42
|
-
|
|
43
|
-
nansen
|
|
72
|
+
nansen research smart-money netflow --chain solana --limit 10
|
|
73
|
+
nansen research smart-money dex-trades --chain solana --labels "Smart Trader" --limit 20
|
|
74
|
+
nansen research smart-money holdings --chain solana --limit 10
|
|
75
|
+
nansen research smart-money perp-trades --limit 10 # no --chain (Hyperliquid only)
|
|
76
|
+
nansen research smart-money dcas --limit 10 # no --chain (Jupiter/Solana only)
|
|
77
|
+
nansen research smart-money historical-holdings --chain solana --token-address <addr>
|
|
78
|
+
```
|
|
44
79
|
|
|
45
|
-
|
|
46
|
-
|
|
80
|
+
Labels: `Fund`, `Smart Trader`, `30D Smart Trader`, `90D Smart Trader`, `180D Smart Trader`, `Smart HL Perps Trader`
|
|
81
|
+
|
|
82
|
+
## Token Analytics
|
|
83
|
+
|
|
84
|
+
`--chain` required. Use `--token` for the token address.
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
nansen research token screener --chain solana --timeframe 24h --smart-money --limit 20
|
|
88
|
+
nansen research token info --token <addr> --chain solana
|
|
89
|
+
nansen research token indicators --token <addr> --chain solana
|
|
90
|
+
nansen research token ohlcv --token <addr> --chain solana --timeframe 1h --limit 24
|
|
91
|
+
nansen research token holders --token <addr> --chain solana --smart-money
|
|
92
|
+
nansen research token flows --token <addr> --chain solana --days 7
|
|
93
|
+
nansen research token flow-intelligence --token <addr> --chain solana
|
|
94
|
+
nansen research token who-bought-sold --token <addr> --chain solana
|
|
95
|
+
nansen research token dex-trades --token <addr> --chain solana --limit 20
|
|
96
|
+
nansen research token pnl --token <addr> --chain solana --sort total_pnl_usd:desc
|
|
97
|
+
nansen research token transfers --token <addr> --chain solana --enrich
|
|
98
|
+
nansen research token jup-dca --token <addr> # no --chain
|
|
99
|
+
nansen research token perp-trades --symbol ETH --days 7 # no --chain, uses --symbol
|
|
100
|
+
nansen research token perp-positions --symbol BTC # no --chain
|
|
101
|
+
nansen research token perp-pnl-leaderboard --symbol SOL # no --chain
|
|
47
102
|
```
|
|
48
103
|
|
|
49
|
-
|
|
104
|
+
Native tokens (SOL, ETH) are not supported on most token endpoints — use specific token addresses.
|
|
105
|
+
|
|
106
|
+
## Wallet Profiler
|
|
107
|
+
|
|
108
|
+
`--chain` and `--address` required for most commands.
|
|
50
109
|
|
|
51
|
-
### Smart Money
|
|
52
|
-
Track sophisticated market participants:
|
|
53
110
|
```bash
|
|
54
|
-
nansen
|
|
55
|
-
nansen
|
|
56
|
-
nansen
|
|
111
|
+
nansen research profiler balance --address <addr> --chain solana
|
|
112
|
+
nansen research profiler labels --address <addr> --chain ethereum
|
|
113
|
+
nansen research profiler pnl --address <addr> --chain ethereum --days 30
|
|
114
|
+
nansen research profiler pnl-summary --address <addr> --chain ethereum
|
|
115
|
+
nansen research profiler transactions --address <addr> --chain ethereum --limit 20
|
|
116
|
+
nansen research profiler historical-balances --address <addr> --chain solana --days 30
|
|
117
|
+
nansen research profiler related-wallets --address <addr> --chain ethereum
|
|
118
|
+
nansen research profiler counterparties --address <addr> --chain ethereum
|
|
119
|
+
nansen research profiler perp-positions --address <addr> # no --chain
|
|
120
|
+
nansen research profiler perp-trades --address <addr> # no --chain
|
|
121
|
+
nansen research profiler search --query "Vitalik" # no --chain
|
|
122
|
+
nansen research profiler batch --addresses "0xabc,0xdef" --chain ethereum --include labels,balance,pnl
|
|
123
|
+
nansen research profiler trace --address <addr> --chain ethereum --depth 2 --width 10 # ⚠️ makes N×width API calls
|
|
124
|
+
nansen research profiler compare --addresses "0xabc,0xdef" --chain ethereum
|
|
57
125
|
```
|
|
58
126
|
|
|
59
|
-
|
|
60
|
-
|
|
127
|
+
## Search
|
|
128
|
+
|
|
61
129
|
```bash
|
|
62
|
-
nansen
|
|
63
|
-
nansen
|
|
64
|
-
nansen
|
|
65
|
-
nansen profiler search --query "Vitalik"
|
|
130
|
+
nansen research search "jupiter" --type token
|
|
131
|
+
nansen research search "Vitalik" --type entity --limit 5
|
|
132
|
+
nansen research search "0xd8dA..." # by address
|
|
66
133
|
```
|
|
67
134
|
|
|
68
|
-
|
|
69
|
-
|
|
135
|
+
## Perps (Hyperliquid)
|
|
136
|
+
|
|
70
137
|
```bash
|
|
71
|
-
nansen
|
|
72
|
-
nansen
|
|
73
|
-
nansen token flows --token <address> --chain solana
|
|
74
|
-
nansen token pnl --token <address> --chain solana
|
|
138
|
+
nansen research perp screener --sort volume_usd:desc --limit 20
|
|
139
|
+
nansen research perp leaderboard --days 7 --limit 20
|
|
75
140
|
```
|
|
76
141
|
|
|
77
|
-
|
|
78
|
-
|
|
142
|
+
## Portfolio
|
|
143
|
+
|
|
79
144
|
```bash
|
|
80
|
-
nansen portfolio defi --wallet
|
|
145
|
+
nansen research portfolio defi --wallet <addr>
|
|
146
|
+
nansen research points leaderboard --tier green --limit 20
|
|
81
147
|
```
|
|
82
148
|
|
|
83
|
-
##
|
|
149
|
+
## Trading
|
|
84
150
|
|
|
85
|
-
-
|
|
86
|
-
- `--pretty`: Formatted JSON
|
|
87
|
-
- `--table`: Human-readable table
|
|
88
|
-
- `--stream`: NDJSON (one record per line)
|
|
89
|
-
- `--fields`: Filter specific fields
|
|
151
|
+
Two-step: quote then execute.
|
|
90
152
|
|
|
91
|
-
|
|
153
|
+
```bash
|
|
154
|
+
# Get quotes from multiple aggregators (Jupiter, OKX, LiFi)
|
|
155
|
+
nansen trade quote --chain solana \
|
|
156
|
+
--from <from_token_address> \
|
|
157
|
+
--to <to_token_address> \
|
|
158
|
+
--amount <base_units>
|
|
159
|
+
|
|
160
|
+
# Execute the best quote
|
|
161
|
+
nansen trade execute --quote <quote-id>
|
|
162
|
+
```
|
|
92
163
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
| `--chains` | Multiple chains as JSON array |
|
|
97
|
-
| `--limit` | Number of results |
|
|
98
|
-
| `--days` | Date range in days |
|
|
99
|
-
| `--sort` | Sort field (e.g., `value_usd:desc`) |
|
|
100
|
-
| `--smart-money` | Filter for Smart Money only |
|
|
164
|
+
> ⚠️ Always inspect the quote response (price, slippage, expiry) before executing.
|
|
165
|
+
> Quotes expire — if you wait too long, execute will fail. Get a fresh quote and retry.
|
|
166
|
+
> Trades are irreversible once executed on-chain.
|
|
101
167
|
|
|
102
|
-
|
|
168
|
+
**⚠️ Amounts are in base units (not human-readable):**
|
|
103
169
|
|
|
104
|
-
|
|
170
|
+
| Token | Decimals | 1 unit = |
|
|
171
|
+
|-------|----------|----------|
|
|
172
|
+
| SOL | 9 | 1000000000 lamports |
|
|
173
|
+
| ETH | 18 | 1000000000000000000 wei |
|
|
174
|
+
| USDC | 6 | 1000000 |
|
|
105
175
|
|
|
106
|
-
|
|
176
|
+
Symbol shortcuts (SOL, ETH) don't work yet — use full addresses.
|
|
107
177
|
|
|
108
|
-
|
|
178
|
+
### Common Addresses
|
|
109
179
|
|
|
110
|
-
|
|
180
|
+
**Solana:** SOL `So11111111111111111111111111111111111111112` · USDC `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` · JUP `JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN`
|
|
181
|
+
|
|
182
|
+
**Base:** ETH `0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee` · USDC `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` · DEGEN `0x4ed4e862860bed51a9570b96d89af5e1b0efefed`
|
|
183
|
+
|
|
184
|
+
## Wallet Management
|
|
111
185
|
|
|
112
|
-
Get the full API schema for programmatic use:
|
|
113
186
|
```bash
|
|
114
|
-
nansen
|
|
115
|
-
nansen
|
|
187
|
+
nansen wallet create # Create EVM + Solana keypair
|
|
188
|
+
nansen wallet list # List wallets
|
|
189
|
+
nansen wallet send --to <addr> --amount 1.5 --chain evm # Send native
|
|
190
|
+
nansen wallet send --to <addr> --chain evm --max # Send entire balance
|
|
116
191
|
```
|
|
117
192
|
|
|
118
|
-
##
|
|
193
|
+
## Common Options
|
|
119
194
|
|
|
120
|
-
|
|
195
|
+
| Option | Description |
|
|
196
|
+
|--------|-------------|
|
|
197
|
+
| `--chain` | Required for most commands. See [Supported Chains](#supported-chains) |
|
|
198
|
+
| `--token` | Token address (aliases: `--mint`, `--token-address`) |
|
|
199
|
+
| `--address` | Wallet address |
|
|
200
|
+
| `--limit` | Results per page (default 10) |
|
|
201
|
+
| `--days` | Lookback period in days (default 30) |
|
|
202
|
+
| `--sort` | Sort field:direction (e.g. `value_usd:desc`) |
|
|
203
|
+
| `--smart-money` | Filter to smart money wallets only |
|
|
204
|
+
| `--pretty` | Formatted JSON output |
|
|
205
|
+
| `--table` | ASCII table output |
|
|
206
|
+
| `--stream` | NDJSON (one record per line) |
|
|
207
|
+
| `--fields a,b` | Return only specific fields |
|
|
208
|
+
| `--cache` | Cache responses (300s TTL). **Do not use with `trade` commands** — stale prices/quotes can cause bad trades |
|
|
209
|
+
|
|
210
|
+
## Schema Introspection
|
|
121
211
|
|
|
122
|
-
|
|
212
|
+
> **Stuck?** Run `nansen schema` or `nansen schema <command>` to discover all available commands, options, and return fields.
|
|
123
213
|
|
|
124
214
|
```bash
|
|
125
|
-
#
|
|
126
|
-
|
|
215
|
+
nansen schema # Full JSON schema — all commands, options, return fields
|
|
216
|
+
```
|
|
127
217
|
|
|
128
|
-
|
|
129
|
-
nansen token holders --token So11111111111111111111111111111111111111112 --chain solana --smart-money --limit 20 --pretty
|
|
218
|
+
## Supported Chains
|
|
130
219
|
|
|
131
|
-
|
|
132
|
-
nansen profiler balance --address Gu29tjXrVr9v5n42sX1DNrMiF3BwbrTm379szgB9qXjc --chain solana --pretty
|
|
220
|
+
**Research:** `solana`, `ethereum`, `base`, `bnb`, `arbitrum`, `polygon`, `optimism`, `avalanche`, `linea`, `scroll`, `mantle`, `ronin`, `sei`, `plasma`, `sonic`, `monad`, `hyperevm`, `iotaevm`
|
|
133
221
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
222
|
+
**Trading & x402:** `solana`, `base`
|
|
223
|
+
|
|
224
|
+
## Gotchas
|
|
225
|
+
|
|
226
|
+
- Native tokens (SOL, ETH) don't work on most token endpoints — use wrapped addresses
|
|
227
|
+
- Perp commands don't take `--chain` (Hyperliquid only)
|
|
228
|
+
- `--amount` is always in base units, not human-readable
|
|
229
|
+
- Profiler `trace` makes N×width API calls — can burn credits fast
|
|
230
|
+
- x402 auth needs USDC on Base, not Solana
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nansen-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "Command-line interface for Nansen API - designed for AI agents",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -9,10 +9,12 @@
|
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"start": "node src/index.js",
|
|
12
|
+
"pretest": "node scripts/check-changeset.js",
|
|
12
13
|
"test": "vitest run",
|
|
13
14
|
"test:watch": "vitest",
|
|
14
15
|
"test:coverage": "vitest run --coverage",
|
|
15
16
|
"test:live": "NANSEN_LIVE_TEST=1 vitest run",
|
|
17
|
+
"test:swap": "vitest run --config vitest.e2e.config.js",
|
|
16
18
|
"changeset": "changeset",
|
|
17
19
|
"changeset:version": "changeset version",
|
|
18
20
|
"changeset:publish": "changeset publish"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Non-blocking check: warns if the current branch has no new changeset file
|
|
5
|
+
* compared to main. Runs as a pretest hook so agents and humans see a reminder.
|
|
6
|
+
* Always exits 0 — this is a nudge, not a gate.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { execSync } from "child_process";
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
const branch = execSync("git rev-parse --abbrev-ref HEAD", { encoding: "utf8" }).trim();
|
|
13
|
+
if (branch === "main") process.exit(0);
|
|
14
|
+
|
|
15
|
+
const newChangesets = execSync(
|
|
16
|
+
"git diff main --name-only --diff-filter=A -- .changeset/*.md",
|
|
17
|
+
{ encoding: "utf8" }
|
|
18
|
+
).trim();
|
|
19
|
+
|
|
20
|
+
if (!newChangesets) {
|
|
21
|
+
console.error(
|
|
22
|
+
"\x1b[33m[changeset] No new changeset file found on this branch. " +
|
|
23
|
+
"If this PR changes user-facing behavior, add one: npx changeset\x1b[0m"
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
} catch {
|
|
27
|
+
// Not a git repo, main doesn't exist, etc. — skip silently.
|
|
28
|
+
}
|