madeonsol 1.8.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/README.md +306 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,16 +7,18 @@
|
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
|
|
9
9
|
Official TypeScript/JavaScript SDK for the **[MadeOnSol](https://madeonsol.com) Solana API** — zero dependencies, fully typed, works in Node.js ≥ 18 and edge runtimes.
|
|
10
|
-
|
|
10
|
+
> Real-time Solana trading intelligence: track 1,000+ KOL wallets with <3s latency, score 6,700+ Pump.fun deployers by reputation, detect multi-KOL coordination signals, and stream every DEX trade across 9+ programs. Free tier: 200 requests/day at [madeonsol.com/developer](https://madeonsol.com/developer) — no credit card required.
|
|
11
11
|
|
|
12
12
|
> **Build Solana trading bots, analytics dashboards, KOL copy-trading tools, deployer sniper bots, and ecosystem browsers.**
|
|
13
13
|
|
|
14
14
|
| Feature | Description |
|
|
15
15
|
|---|---|
|
|
16
|
-
| **KOL Tracker** | Real-time trade feed, PnL leaderboard with five time windows (today, 7d, 30d, 90d, 180d), coordination detection,
|
|
16
|
+
| **KOL Tracker** | Real-time trade feed, PnL leaderboard with five time windows (today, 7d, 30d, 90d, 180d), coordination detection, per-wallet profiles, and deep PnL analytics for 1,000+ tracked KOL wallets. **180 days of trade history** retained. |
|
|
17
|
+
| **Alpha Wallet Intel** | Leaderboard of 47,000+ scored early-buyer wallets, full wallet profiles, linked-wallet clustering, token cap-table enrichment, and 0–100 buyer quality scores. |
|
|
18
|
+
| **Wallet Tracker** | Monitor any Solana wallet for swaps and transfers. Track up to 10/50/100 wallets (BASIC/PRO/ULTRA). 120-day event retention. WS events on ULTRA. |
|
|
17
19
|
| **Deployer Hunter** | Pump.fun deployer scoring, tier leaderboard, deploy alerts, and bonding intelligence |
|
|
18
20
|
| **DEX Trade Stream** | Real-time WebSocket stream of ALL Solana DEX trades — filter by token, wallet, program, or trade size (Ultra) |
|
|
19
|
-
| **Webhooks** | Push notifications for KOL trades, coordination signals,
|
|
21
|
+
| **Webhooks** | Push notifications for KOL trades, coordination signals, deployer alerts, and wallet tracker events (Pro/Ultra) |
|
|
20
22
|
| **Tool Directory** | Search 950+ Solana tools and dApps indexed on MadeOnSol |
|
|
21
23
|
|
|
22
24
|
**Links:** [Full docs](https://madeonsol.com/solana-api) · [Website](https://madeonsol.com) · [API docs](https://madeonsol.com/api-docs)
|
|
@@ -154,6 +156,186 @@ Returns: `KolTokenActivity`
|
|
|
154
156
|
|
|
155
157
|
---
|
|
156
158
|
|
|
159
|
+
#### `client.kol.pnl(wallet, params?)`
|
|
160
|
+
|
|
161
|
+
Deep per-wallet PnL breakdown with equity curve, risk metrics, and position history.
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
const pnl = await client.kol.pnl("7xKX...", {
|
|
165
|
+
period: "30d", // "7d" | "30d" | "90d" | "180d", default "30d"
|
|
166
|
+
});
|
|
167
|
+
// BASIC: summary stats only
|
|
168
|
+
// PRO: + equity curve + closed positions
|
|
169
|
+
// ULTRA: + open positions
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Returns: `KolPnlResponse`
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
#### `client.kol.trendingTokens(params?)`
|
|
177
|
+
|
|
178
|
+
Tokens ranked by KOL buy volume across multiple time windows.
|
|
179
|
+
|
|
180
|
+
```ts
|
|
181
|
+
const { tokens } = await client.kol.trendingTokens({
|
|
182
|
+
period: "1h", // "5m" | "15m" | "30m" | "1h" | "4h" | "8h" | "12h", default "1h"
|
|
183
|
+
min_kols: 2, // minimum distinct KOL buyers
|
|
184
|
+
limit: 20, // 1–50, default 20
|
|
185
|
+
});
|
|
186
|
+
// Sub-hour periods (5m, 15m, 30m) require PRO or ULTRA
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Returns: `KolTrendingTokensResponse`
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
### Alpha Wallet Intelligence — `client.alpha`
|
|
194
|
+
|
|
195
|
+
#### `client.alpha.leaderboard(params?)`
|
|
196
|
+
|
|
197
|
+
Leaderboard of 47,000+ scored early-buyer wallets ranked by win rate, PnL, or ROI.
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
const { wallets } = await client.alpha.leaderboard({
|
|
201
|
+
period: "30d", // "7d" | "30d" | "90d", default "30d"
|
|
202
|
+
sort: "win_rate", // "win_rate" | "pnl" | "roi"
|
|
203
|
+
min_tokens: 5,
|
|
204
|
+
exclude_bots: true,
|
|
205
|
+
});
|
|
206
|
+
// BASIC: 25 results, PRO: 100, ULTRA: 500
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Returns: `AlphaLeaderboardResponse`
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
#### `client.alpha.wallet(wallet)`
|
|
214
|
+
|
|
215
|
+
Full profile for an alpha wallet including per-token history and bot signals. ULTRA only.
|
|
216
|
+
|
|
217
|
+
```ts
|
|
218
|
+
const profile = await client.alpha.wallet("7xKX...");
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Returns: `AlphaWalletResponse`
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
#### `client.alpha.linked(wallet)`
|
|
226
|
+
|
|
227
|
+
Linked-wallet clustering — wallets that co-bought with this address within 2 seconds. ULTRA only.
|
|
228
|
+
|
|
229
|
+
```ts
|
|
230
|
+
const { linked } = await client.alpha.linked("7xKX...");
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Returns: `AlphaLinkedResponse`
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
#### `client.alpha.capTable(mint)`
|
|
238
|
+
|
|
239
|
+
First buyers for a token enriched with historical win rates, PnL, and KOL identity. PRO/ULTRA.
|
|
240
|
+
|
|
241
|
+
```ts
|
|
242
|
+
const { buyers } = await client.alpha.capTable("EPjFW...");
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Returns: `AlphaCapTableResponse`
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
#### `client.alpha.buyerQuality(mint)`
|
|
250
|
+
|
|
251
|
+
0–100 cohort quality score based on the profile of a token's first buyers. All tiers. 5-minute cache.
|
|
252
|
+
|
|
253
|
+
```ts
|
|
254
|
+
const { score } = await client.alpha.buyerQuality("EPjFW...");
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Returns: `AlphaBuyerQualityResponse`
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
### Wallet Tracker — `client.walletTracker`
|
|
262
|
+
|
|
263
|
+
#### `client.walletTracker.watchlist()`
|
|
264
|
+
|
|
265
|
+
List your tracked wallets and remaining capacity.
|
|
266
|
+
|
|
267
|
+
```ts
|
|
268
|
+
const { wallets, capacity } = await client.walletTracker.watchlist();
|
|
269
|
+
// capacity: { used, limit } — BASIC: 10, PRO: 50, ULTRA: 100
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Returns: `WatchlistResponse`
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
#### `client.walletTracker.addToWatchlist(wallet, params?)`
|
|
277
|
+
|
|
278
|
+
Add a wallet to your watchlist. Tracking begins immediately.
|
|
279
|
+
|
|
280
|
+
```ts
|
|
281
|
+
await client.walletTracker.addToWatchlist("7xKX...", { label: "whale" });
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
#### `client.walletTracker.removeFromWatchlist(wallet)`
|
|
287
|
+
|
|
288
|
+
Remove a wallet from your watchlist.
|
|
289
|
+
|
|
290
|
+
```ts
|
|
291
|
+
await client.walletTracker.removeFromWatchlist("7xKX...");
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
#### `client.walletTracker.updateLabel(wallet, label)`
|
|
297
|
+
|
|
298
|
+
Update the label for a tracked wallet.
|
|
299
|
+
|
|
300
|
+
```ts
|
|
301
|
+
await client.walletTracker.updateLabel("7xKX...", "smart money");
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
#### `client.walletTracker.trades(params?)`
|
|
307
|
+
|
|
308
|
+
Historical swap and transfer events for your watched wallets. 120-day retention.
|
|
309
|
+
|
|
310
|
+
```ts
|
|
311
|
+
const { events } = await client.walletTracker.trades({
|
|
312
|
+
wallet: "7xKX...", // filter by specific wallet
|
|
313
|
+
action: "buy", // "buy" | "sell"
|
|
314
|
+
event_type: "swap", // "swap" | "transfer"
|
|
315
|
+
limit: 50,
|
|
316
|
+
before: "2026-04-01T00:00:00Z", // ISO 8601 cursor
|
|
317
|
+
});
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
Returns: `WalletTrackerTradesResponse`
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
#### `client.walletTracker.summary(params?)`
|
|
325
|
+
|
|
326
|
+
Per-wallet stats across your watchlist: swap counts, SOL bought/sold, last event time.
|
|
327
|
+
|
|
328
|
+
```ts
|
|
329
|
+
const { wallets } = await client.walletTracker.summary({
|
|
330
|
+
period: "7d", // "24h" | "7d" | "30d", default "7d"
|
|
331
|
+
wallet: "7xKX...", // optional: single wallet
|
|
332
|
+
});
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
Returns: `WalletTrackerSummaryResponse`
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
157
339
|
### Deployer Hunter — `client.deployer`
|
|
158
340
|
|
|
159
341
|
#### `client.deployer.stats()`
|
|
@@ -303,16 +485,102 @@ console.log(token.dex_ws_url); // wss://madeonsol.com/ws/v1/dex-stream (Ultra o
|
|
|
303
485
|
|
|
304
486
|
Returns: `StreamToken` — `{ token, expires_at, ws_url, dex_ws_url?, usage }`
|
|
305
487
|
|
|
306
|
-
|
|
488
|
+
---
|
|
489
|
+
|
|
490
|
+
### DEX Firehose (Ultra) — `wss://madeonsol.com/ws/v1/dex-stream`
|
|
491
|
+
|
|
492
|
+
Real-time trades across **9+ Solana DEX programs** (Pump.fun, PumpAMM, PumpSwap, Raydium AMM/CPMM/CAMM, Jupiter v6, Orca Whirlpool, Meteora DBC/DAMM, LaunchLab/bonk.fun) on a single normalized WebSocket. Server-side filters drop everything you don't care about before it hits your socket.
|
|
493
|
+
|
|
494
|
+
**Limits:** ULTRA = 2 connections, **10 named subscriptions per connection**, up to **500 trades replay** from in-memory ring buffer. Inbound rate limit: 5 messages/sec (excess emits one error per second).
|
|
495
|
+
|
|
496
|
+
#### Quick start
|
|
497
|
+
|
|
498
|
+
```ts
|
|
499
|
+
import { WebSocket } from "ws"; // or native WebSocket in browsers/Bun
|
|
500
|
+
|
|
501
|
+
const { dex_ws_url } = await client.stream.getToken();
|
|
502
|
+
const ws = new WebSocket(dex_ws_url!);
|
|
503
|
+
|
|
504
|
+
ws.on("open", () => {
|
|
505
|
+
// Multi-subscription: each sub has its own sub_id and filters
|
|
506
|
+
ws.send(JSON.stringify({
|
|
507
|
+
type: "subscribe",
|
|
508
|
+
sub_id: "fresh-pumpfun",
|
|
509
|
+
replay: 50, // backfill up to 500 from ring buffer
|
|
510
|
+
filters: {
|
|
511
|
+
dex: "pumpfun",
|
|
512
|
+
token_age_max_seconds: 300, // first seen in last 5 min
|
|
513
|
+
min_sol: 0.5,
|
|
514
|
+
action: "buy",
|
|
515
|
+
},
|
|
516
|
+
}));
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
ws.on("message", (raw) => {
|
|
520
|
+
const msg = JSON.parse(raw.toString());
|
|
521
|
+
if (msg.channel === "dex:trades") {
|
|
522
|
+
// { sub_id, data: { wallet, mint, action, sol_amount, token_amount, dex, ... }, replay, ts }
|
|
523
|
+
console.log(msg.sub_id, msg.data.dex, msg.data.action, msg.data.sol_amount);
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
#### Protocol — client → server
|
|
529
|
+
|
|
530
|
+
| `type` | Required fields | Notes |
|
|
531
|
+
|---|---|---|
|
|
532
|
+
| `subscribe` | `sub_id`, `filters` | Optional `replay: 1–500` |
|
|
533
|
+
| `update` | `sub_id`, `filters` | Replaces filters in place — no disconnect needed |
|
|
534
|
+
| `unsubscribe` | `sub_id` | Or omit `sub_id` to clear all subs |
|
|
535
|
+
| `list` | — | Server replies with `{ type: "list", subs: [...] }` |
|
|
536
|
+
| `ping` | — | Heartbeat — server replies `{ type: "pong" }` |
|
|
537
|
+
|
|
538
|
+
#### Server → client message shapes
|
|
307
539
|
|
|
308
540
|
```ts
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
}
|
|
313
|
-
|
|
541
|
+
{ type: "capabilities", limits: { max_subs: 10, max_replay: 500, ... } } // on connect
|
|
542
|
+
{ type: "subscribed", sub_id: "fresh-pumpfun" }
|
|
543
|
+
{ type: "replay_done", sub_id: "fresh-pumpfun", count: 50 } // after backfill
|
|
544
|
+
{ type: "updated", sub_id: "fresh-pumpfun" }
|
|
545
|
+
{ type: "unsubscribed", sub_id: "fresh-pumpfun" }
|
|
546
|
+
{ type: "error", message: "..." }
|
|
547
|
+
{ channel: "dex:trades", sub_id, data: { ... }, replay: false, ts: 1712160000000 }
|
|
314
548
|
```
|
|
315
549
|
|
|
550
|
+
#### Filter dimensions
|
|
551
|
+
|
|
552
|
+
At least **one targeting filter** is required (otherwise the firehose would dump every trade). Filters compose with AND semantics.
|
|
553
|
+
|
|
554
|
+
| Filter | Type | Notes |
|
|
555
|
+
|---|---|---|
|
|
556
|
+
| `token_mint` / `token_mints` | string / string[] (≤50) | Targeting |
|
|
557
|
+
| `wallet` / `wallets` | string / string[] (≤50) | Targeting |
|
|
558
|
+
| `dex` | string \| string[] | `pumpfun`, `pumpamm`, `pumpswap`, `raydium`, `jupiter`, `orca`, `meteora`, `launchlab` |
|
|
559
|
+
| `program` | string | Raw program ID |
|
|
560
|
+
| `deployer_tier` | string \| string[] | `elite`, `good`, `moderate`, `rising`, `cold`, `unranked` (uses Deployer Hunter scoring) |
|
|
561
|
+
| `token_age_max_seconds` | number | Only trades on mints first seen within window (uses persisted first-seen table) |
|
|
562
|
+
| `market_cap_min_sol` / `market_cap_max_sol` | number | Bounded by current market cap (last trade price × cached supply, 1h TTL) |
|
|
563
|
+
| `min_sol` / `max_sol` | number | Trade size bounds |
|
|
564
|
+
| `action` | `"buy"` \| `"sell"` | Direction |
|
|
565
|
+
|
|
566
|
+
**Async filters** (`token_age`, `deployer_tier`, `market_cap`) evaluate against live state and are **skipped on replay**. The first trade for an unseen mint may be skipped while the supply fetch is in flight.
|
|
567
|
+
|
|
568
|
+
#### Multi-sub example
|
|
569
|
+
|
|
570
|
+
```ts
|
|
571
|
+
ws.send(JSON.stringify({ type: "subscribe", sub_id: "snipers", filters: { token_age_max_seconds: 60 } }));
|
|
572
|
+
ws.send(JSON.stringify({ type: "subscribe", sub_id: "whales", filters: { min_sol: 50 } }));
|
|
573
|
+
ws.send(JSON.stringify({ type: "subscribe", sub_id: "kol-mints", filters: { token_mints: ["EPjF...", "So11..."] } }));
|
|
574
|
+
|
|
575
|
+
// Tighten the snipers filter without disconnecting
|
|
576
|
+
ws.send(JSON.stringify({ type: "update", sub_id: "snipers", filters: { token_age_max_seconds: 30, min_sol: 0.3 } }));
|
|
577
|
+
|
|
578
|
+
// Drop whales when you're done
|
|
579
|
+
ws.send(JSON.stringify({ type: "unsubscribe", sub_id: "whales" }));
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
Each `dex:trades` message echoes the `sub_id` that matched, so you can route them locally without reapplying filter logic client-side.
|
|
583
|
+
|
|
316
584
|
---
|
|
317
585
|
|
|
318
586
|
### Webhooks — `client.webhooks`
|
|
@@ -406,6 +674,26 @@ import type {
|
|
|
406
674
|
ToolsSearchResponse,
|
|
407
675
|
Tool,
|
|
408
676
|
|
|
677
|
+
// KOL PnL & Trending
|
|
678
|
+
KolPnlResponse,
|
|
679
|
+
KolTrendingTokensResponse,
|
|
680
|
+
TrendingToken,
|
|
681
|
+
|
|
682
|
+
// Alpha Wallet Intelligence
|
|
683
|
+
AlphaWalletEntry,
|
|
684
|
+
AlphaLeaderboardResponse,
|
|
685
|
+
AlphaWalletResponse,
|
|
686
|
+
AlphaLinkedResponse,
|
|
687
|
+
AlphaCapTableResponse,
|
|
688
|
+
AlphaBuyerQualityResponse,
|
|
689
|
+
|
|
690
|
+
// Wallet Tracker
|
|
691
|
+
WalletEntry,
|
|
692
|
+
WatchlistResponse,
|
|
693
|
+
WalletTrackerEvent,
|
|
694
|
+
WalletTrackerTradesResponse,
|
|
695
|
+
WalletTrackerSummaryResponse,
|
|
696
|
+
|
|
409
697
|
// Streaming
|
|
410
698
|
StreamToken,
|
|
411
699
|
|
|
@@ -434,6 +722,15 @@ import type {
|
|
|
434
722
|
- [API documentation](https://madeonsol.com/solana-api) — Interactive endpoint reference
|
|
435
723
|
- [MadeOnSol on GitHub](https://github.com/LamboPoewert/madeonsol) — Main project repository
|
|
436
724
|
|
|
725
|
+
## Also Available
|
|
726
|
+
|
|
727
|
+
| Platform | Package |
|
|
728
|
+
|---|---|
|
|
729
|
+
| Python (LangChain, CrewAI) | [`madeonsol-x402`](https://pypi.org/project/madeonsol-x402/) on PyPI |
|
|
730
|
+
| MCP Server (Claude, Cursor) | [`mcp-server-madeonsol`](https://www.npmjs.com/package/mcp-server-madeonsol) |
|
|
731
|
+
| ElizaOS | [`@madeonsol/plugin-madeonsol`](https://www.npmjs.com/package/@madeonsol/plugin-madeonsol) |
|
|
732
|
+
| Solana Agent Kit | [`solana-agent-kit-plugin-madeonsol`](https://www.npmjs.com/package/solana-agent-kit-plugin-madeonsol) |
|
|
733
|
+
|
|
437
734
|
---
|
|
438
735
|
|
|
439
736
|
## License
|
package/package.json
CHANGED