@sherwoodagent/cli 0.6.1 → 0.7.1
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/dist/{chat-2BKH5FCV.js → chat-E5AXULN3.js} +16 -6
- package/dist/chat-E5AXULN3.js.map +1 -0
- package/dist/chunk-DVWORPEY.js +75 -0
- package/dist/chunk-DVWORPEY.js.map +1 -0
- package/dist/{chunk-WAJ6T64Y.js → chunk-FGSXRXCZ.js} +11 -480
- package/dist/chunk-FGSXRXCZ.js.map +1 -0
- package/dist/chunk-JY24QVXN.js +277 -0
- package/dist/chunk-JY24QVXN.js.map +1 -0
- package/dist/chunk-P4OHGJ3Z.js +350 -0
- package/dist/chunk-P4OHGJ3Z.js.map +1 -0
- package/dist/chunk-QMWMT6EH.js +149 -0
- package/dist/chunk-QMWMT6EH.js.map +1 -0
- package/dist/chunk-VADRJDMW.js +401 -0
- package/dist/chunk-VADRJDMW.js.map +1 -0
- package/dist/eas-Y2XAG3C6.js +21 -0
- package/dist/eas-Y2XAG3C6.js.map +1 -0
- package/dist/index.js +42 -268
- package/dist/index.js.map +1 -1
- package/dist/ipfs-P3NVJQCF.js +11 -0
- package/dist/ipfs-P3NVJQCF.js.map +1 -0
- package/dist/research-GWNEE2OU.js +12 -0
- package/dist/research-GWNEE2OU.js.map +1 -0
- package/dist/research-HHMZ63WH.js +308 -0
- package/dist/research-HHMZ63WH.js.map +1 -0
- package/dist/{session-LATHJZ2S.js → session-BBNSJYAQ.js} +10 -6
- package/dist/{session-LATHJZ2S.js.map → session-BBNSJYAQ.js.map} +1 -1
- package/dist/{xmtp-IRIWABDL.js → xmtp-PQ4VJWTW.js} +6 -3
- package/dist/{xmtp-IRIWABDL.js.map → xmtp-PQ4VJWTW.js.map} +1 -1
- package/package.json +3 -1
- package/dist/chat-2BKH5FCV.js.map +0 -1
- package/dist/chunk-WAJ6T64Y.js.map +0 -1
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getAccount
|
|
3
|
+
} from "./chunk-QMWMT6EH.js";
|
|
4
|
+
|
|
5
|
+
// src/providers/research/messari.ts
|
|
6
|
+
import { base, baseSepolia } from "viem/chains";
|
|
7
|
+
|
|
8
|
+
// src/lib/x402.ts
|
|
9
|
+
var _x402Fetch = null;
|
|
10
|
+
async function getX402Fetch() {
|
|
11
|
+
if (_x402Fetch) return _x402Fetch;
|
|
12
|
+
const { x402Client, wrapFetchWithPayment } = await import("@x402/fetch");
|
|
13
|
+
const { registerExactEvmScheme } = await import("@x402/evm/exact/client");
|
|
14
|
+
const signer = getAccount();
|
|
15
|
+
const client = new x402Client();
|
|
16
|
+
registerExactEvmScheme(client, { signer });
|
|
17
|
+
_x402Fetch = wrapFetchWithPayment(fetch, client);
|
|
18
|
+
return _x402Fetch;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// src/providers/research/messari.ts
|
|
22
|
+
var BASE_URL = "https://api.messari.io";
|
|
23
|
+
var MESSARI_COST_ESTIMATE = {
|
|
24
|
+
token: "~$0.10",
|
|
25
|
+
market: "~$0.20"
|
|
26
|
+
};
|
|
27
|
+
var MessariProvider = class {
|
|
28
|
+
info() {
|
|
29
|
+
return {
|
|
30
|
+
name: "messari",
|
|
31
|
+
type: "research",
|
|
32
|
+
capabilities: [
|
|
33
|
+
"research.token",
|
|
34
|
+
"research.market"
|
|
35
|
+
],
|
|
36
|
+
supportedChains: [base, baseSepolia]
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async query(params) {
|
|
40
|
+
switch (params.type) {
|
|
41
|
+
case "token":
|
|
42
|
+
return this.tokenReport(params.target);
|
|
43
|
+
case "market":
|
|
44
|
+
return this.marketOverview(params.target);
|
|
45
|
+
case "smart-money":
|
|
46
|
+
throw new Error(
|
|
47
|
+
"Messari x402 API does not support on-chain analytics. Use --provider nansen for smart money data."
|
|
48
|
+
);
|
|
49
|
+
case "wallet":
|
|
50
|
+
throw new Error(
|
|
51
|
+
"Messari does not support wallet analytics. Use --provider nansen for wallet profiling."
|
|
52
|
+
);
|
|
53
|
+
default:
|
|
54
|
+
throw new Error(`Unsupported query type: ${params.type}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Resolve any user input (symbol, name, slug, address) to a Messari asset slug.
|
|
59
|
+
* Uses the free /metrics/v2/assets endpoint ($0.00) to search.
|
|
60
|
+
*/
|
|
61
|
+
async resolveSlug(target) {
|
|
62
|
+
const fetchWithPay = await getX402Fetch();
|
|
63
|
+
const params = new URLSearchParams({
|
|
64
|
+
search: target,
|
|
65
|
+
limit: "1"
|
|
66
|
+
});
|
|
67
|
+
const url = `${BASE_URL}/metrics/v2/assets?${params}`;
|
|
68
|
+
const res = await fetchWithPay(url, { method: "GET" });
|
|
69
|
+
if (!res.ok) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`Messari asset lookup failed: ${res.status} ${res.statusText}`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
const json = await res.json();
|
|
75
|
+
const slug = json.data?.[0]?.slug;
|
|
76
|
+
if (!slug) {
|
|
77
|
+
throw new Error(
|
|
78
|
+
`No Messari asset found for "${target}". Try a different name, symbol, or slug.`
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
return slug;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get asset details: description, category, sector, links, market snapshot.
|
|
85
|
+
* Endpoint: GET /metrics/v2/assets/details?assetIDs={slug} ($0.10)
|
|
86
|
+
*/
|
|
87
|
+
async tokenReport(target) {
|
|
88
|
+
const slug = await this.resolveSlug(target);
|
|
89
|
+
const fetchWithPay = await getX402Fetch();
|
|
90
|
+
const url = `${BASE_URL}/metrics/v2/assets/details?assetIDs=${encodeURIComponent(slug)}`;
|
|
91
|
+
const res = await fetchWithPay(url, { method: "GET" });
|
|
92
|
+
if (!res.ok) {
|
|
93
|
+
throw new Error(
|
|
94
|
+
`Messari token query failed: ${res.status} ${res.statusText}`
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
const json = await res.json();
|
|
98
|
+
const costUsdc = this.extractCost(res);
|
|
99
|
+
const asset = json.data?.[0] ?? {};
|
|
100
|
+
return {
|
|
101
|
+
provider: "messari",
|
|
102
|
+
queryType: "token",
|
|
103
|
+
target,
|
|
104
|
+
data: asset,
|
|
105
|
+
costUsdc,
|
|
106
|
+
timestamp: Math.floor(Date.now() / 1e3)
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get market metrics + ATH: price, volume, market cap, ROI, all-time high, cycle low.
|
|
111
|
+
* Makes two parallel calls:
|
|
112
|
+
* GET /metrics/v2/assets/details?assetIDs={slug} ($0.10)
|
|
113
|
+
* GET /metrics/v2/assets/ath?assetIDs={slug} ($0.10)
|
|
114
|
+
* Total: ~$0.20
|
|
115
|
+
*/
|
|
116
|
+
async marketOverview(target) {
|
|
117
|
+
const slug = await this.resolveSlug(target);
|
|
118
|
+
const fetchWithPay = await getX402Fetch();
|
|
119
|
+
const assetParam = encodeURIComponent(slug);
|
|
120
|
+
const [detailsRes, athRes] = await Promise.all([
|
|
121
|
+
fetchWithPay(`${BASE_URL}/metrics/v2/assets/details?assetIDs=${assetParam}`, { method: "GET" }),
|
|
122
|
+
fetchWithPay(`${BASE_URL}/metrics/v2/assets/ath?assetIDs=${assetParam}`, { method: "GET" })
|
|
123
|
+
]);
|
|
124
|
+
if (!detailsRes.ok) {
|
|
125
|
+
throw new Error(
|
|
126
|
+
`Messari market query failed: ${detailsRes.status} ${detailsRes.statusText}`
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
if (!athRes.ok) {
|
|
130
|
+
throw new Error(
|
|
131
|
+
`Messari ATH query failed: ${athRes.status} ${athRes.statusText}`
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
const detailsJson = await detailsRes.json();
|
|
135
|
+
const athJson = await athRes.json();
|
|
136
|
+
const cost1 = this.extractCostRaw(detailsRes);
|
|
137
|
+
const cost2 = this.extractCostRaw(athRes);
|
|
138
|
+
const totalCost = cost1 + cost2;
|
|
139
|
+
const costUsdc = totalCost > 0 ? totalCost.toFixed(4) : "unknown";
|
|
140
|
+
const details = detailsJson.data?.[0] ?? {};
|
|
141
|
+
const ath = athJson.data?.[0] ?? {};
|
|
142
|
+
return {
|
|
143
|
+
provider: "messari",
|
|
144
|
+
queryType: "market",
|
|
145
|
+
target,
|
|
146
|
+
data: {
|
|
147
|
+
...details,
|
|
148
|
+
allTimeHigh: ath.allTimeHigh ?? null
|
|
149
|
+
},
|
|
150
|
+
costUsdc,
|
|
151
|
+
timestamp: Math.floor(Date.now() / 1e3)
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Extract cost from x402 response headers as a number (USDC).
|
|
156
|
+
* Returns 0 if no payment info found.
|
|
157
|
+
*/
|
|
158
|
+
extractCostRaw(res) {
|
|
159
|
+
const paymentResponse = res.headers.get("payment-response");
|
|
160
|
+
if (paymentResponse) {
|
|
161
|
+
try {
|
|
162
|
+
const parsed = JSON.parse(paymentResponse);
|
|
163
|
+
if (parsed.amount) {
|
|
164
|
+
return Number(parsed.amount) / 1e6;
|
|
165
|
+
}
|
|
166
|
+
} catch {
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Extract cost from x402 response headers as a formatted string.
|
|
173
|
+
*/
|
|
174
|
+
extractCost(res) {
|
|
175
|
+
const cost = this.extractCostRaw(res);
|
|
176
|
+
return cost > 0 ? cost.toFixed(4) : "unknown";
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
// src/providers/research/nansen.ts
|
|
181
|
+
import { base as base2, baseSepolia as baseSepolia2 } from "viem/chains";
|
|
182
|
+
var BASE_URL2 = "https://api.nansen.ai";
|
|
183
|
+
var NANSEN_COST_ESTIMATE = {
|
|
184
|
+
token: "~$0.01",
|
|
185
|
+
market: "~$0.01",
|
|
186
|
+
"smart-money": "~$0.05",
|
|
187
|
+
wallet: "~$0.01"
|
|
188
|
+
};
|
|
189
|
+
var NansenProvider = class {
|
|
190
|
+
info() {
|
|
191
|
+
return {
|
|
192
|
+
name: "nansen",
|
|
193
|
+
type: "research",
|
|
194
|
+
capabilities: [
|
|
195
|
+
"research.token",
|
|
196
|
+
"research.market",
|
|
197
|
+
"research.smart-money",
|
|
198
|
+
"research.wallet"
|
|
199
|
+
],
|
|
200
|
+
supportedChains: [base2, baseSepolia2]
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
async query(params) {
|
|
204
|
+
switch (params.type) {
|
|
205
|
+
case "token":
|
|
206
|
+
return this.tokenScreener(params.target);
|
|
207
|
+
case "market":
|
|
208
|
+
return this.marketScreener(params.target);
|
|
209
|
+
case "smart-money":
|
|
210
|
+
return this.smartMoneyNetflow(params.options?.token ?? params.target);
|
|
211
|
+
case "wallet":
|
|
212
|
+
return this.walletProfile(params.target);
|
|
213
|
+
default:
|
|
214
|
+
throw new Error(`Unsupported query type: ${params.type}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Token Screener — comprehensive token discovery with on-chain metrics.
|
|
219
|
+
* Endpoint: POST /api/v1/token-screener
|
|
220
|
+
* Cost: ~$0.01 (basic tier)
|
|
221
|
+
*/
|
|
222
|
+
async tokenScreener(target) {
|
|
223
|
+
const fetchWithPay = await getX402Fetch();
|
|
224
|
+
const isAddr = target.startsWith("0x") && target.length === 42;
|
|
225
|
+
const filters = isAddr ? { token_address: [target] } : { token_symbol: [target.toUpperCase()] };
|
|
226
|
+
const body = {
|
|
227
|
+
chains: ["base"],
|
|
228
|
+
timeframe: "24h",
|
|
229
|
+
filters,
|
|
230
|
+
pagination: { page: 1, records_per_page: 10 }
|
|
231
|
+
};
|
|
232
|
+
const res = await fetchWithPay(`${BASE_URL2}/api/v1/token-screener`, {
|
|
233
|
+
method: "POST",
|
|
234
|
+
headers: { "Content-Type": "application/json" },
|
|
235
|
+
body: JSON.stringify(body)
|
|
236
|
+
});
|
|
237
|
+
if (!res.ok) {
|
|
238
|
+
throw new Error(
|
|
239
|
+
`Nansen token query failed: ${res.status} ${res.statusText}`
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
const json = await res.json();
|
|
243
|
+
const costUsdc = this.extractCost(res);
|
|
244
|
+
return {
|
|
245
|
+
provider: "nansen",
|
|
246
|
+
queryType: "token",
|
|
247
|
+
target,
|
|
248
|
+
data: { tokens: json.data ?? [], count: (json.data ?? []).length },
|
|
249
|
+
costUsdc,
|
|
250
|
+
timestamp: Math.floor(Date.now() / 1e3)
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Market Screener — token screener sorted by volume/market cap for market overview.
|
|
255
|
+
* Endpoint: POST /api/v1/token-screener
|
|
256
|
+
* Cost: ~$0.01 (basic tier)
|
|
257
|
+
*/
|
|
258
|
+
async marketScreener(asset) {
|
|
259
|
+
const fetchWithPay = await getX402Fetch();
|
|
260
|
+
const isAddr = asset.startsWith("0x") && asset.length === 42;
|
|
261
|
+
const filters = isAddr ? { token_address: [asset] } : { token_symbol: [asset.toUpperCase()] };
|
|
262
|
+
const body = {
|
|
263
|
+
chains: ["base"],
|
|
264
|
+
timeframe: "24h",
|
|
265
|
+
filters,
|
|
266
|
+
order_by: [{ field: "buy_volume", direction: "desc" }],
|
|
267
|
+
pagination: { page: 1, records_per_page: 10 }
|
|
268
|
+
};
|
|
269
|
+
const res = await fetchWithPay(`${BASE_URL2}/api/v1/token-screener`, {
|
|
270
|
+
method: "POST",
|
|
271
|
+
headers: { "Content-Type": "application/json" },
|
|
272
|
+
body: JSON.stringify(body)
|
|
273
|
+
});
|
|
274
|
+
if (!res.ok) {
|
|
275
|
+
throw new Error(
|
|
276
|
+
`Nansen market query failed: ${res.status} ${res.statusText}`
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
const json = await res.json();
|
|
280
|
+
const costUsdc = this.extractCost(res);
|
|
281
|
+
return {
|
|
282
|
+
provider: "nansen",
|
|
283
|
+
queryType: "market",
|
|
284
|
+
target: asset,
|
|
285
|
+
data: { tokens: json.data ?? [], count: (json.data ?? []).length },
|
|
286
|
+
costUsdc,
|
|
287
|
+
timestamp: Math.floor(Date.now() / 1e3)
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Smart Money Net Flow — capital flow analysis from labeled wallets.
|
|
292
|
+
* Endpoint: POST /api/v1/smart-money/netflow
|
|
293
|
+
* Cost: ~$0.05 (premium tier)
|
|
294
|
+
*/
|
|
295
|
+
async smartMoneyNetflow(tokenSymbol) {
|
|
296
|
+
const fetchWithPay = await getX402Fetch();
|
|
297
|
+
const body = {
|
|
298
|
+
chains: ["base"],
|
|
299
|
+
filters: {
|
|
300
|
+
token_symbol: [tokenSymbol.toUpperCase()]
|
|
301
|
+
},
|
|
302
|
+
pagination: { page: 1, records_per_page: 10 }
|
|
303
|
+
};
|
|
304
|
+
const res = await fetchWithPay(`${BASE_URL2}/api/v1/smart-money/netflow`, {
|
|
305
|
+
method: "POST",
|
|
306
|
+
headers: { "Content-Type": "application/json" },
|
|
307
|
+
body: JSON.stringify(body)
|
|
308
|
+
});
|
|
309
|
+
if (!res.ok) {
|
|
310
|
+
throw new Error(
|
|
311
|
+
`Nansen smart-money query failed: ${res.status} ${res.statusText}`
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
const json = await res.json();
|
|
315
|
+
const costUsdc = this.extractCost(res);
|
|
316
|
+
return {
|
|
317
|
+
provider: "nansen",
|
|
318
|
+
queryType: "smart-money",
|
|
319
|
+
target: tokenSymbol,
|
|
320
|
+
data: { flows: json.data ?? [], count: (json.data ?? []).length },
|
|
321
|
+
costUsdc,
|
|
322
|
+
timestamp: Math.floor(Date.now() / 1e3)
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Wallet Profile — PnL history, transaction patterns, counterparties.
|
|
327
|
+
* Endpoint: POST /api/v1/profiler/wallet-pnl
|
|
328
|
+
* Cost: ~$0.01 (basic tier)
|
|
329
|
+
*/
|
|
330
|
+
async walletProfile(address) {
|
|
331
|
+
const fetchWithPay = await getX402Fetch();
|
|
332
|
+
const body = {
|
|
333
|
+
chains: ["base"],
|
|
334
|
+
address
|
|
335
|
+
};
|
|
336
|
+
const res = await fetchWithPay(`${BASE_URL2}/api/v1/profiler/wallet-pnl`, {
|
|
337
|
+
method: "POST",
|
|
338
|
+
headers: { "Content-Type": "application/json" },
|
|
339
|
+
body: JSON.stringify(body)
|
|
340
|
+
});
|
|
341
|
+
if (!res.ok) {
|
|
342
|
+
throw new Error(
|
|
343
|
+
`Nansen wallet query failed: ${res.status} ${res.statusText}`
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
const json = await res.json();
|
|
347
|
+
const costUsdc = this.extractCost(res);
|
|
348
|
+
return {
|
|
349
|
+
provider: "nansen",
|
|
350
|
+
queryType: "wallet",
|
|
351
|
+
target: address,
|
|
352
|
+
data: json.data ?? json,
|
|
353
|
+
costUsdc,
|
|
354
|
+
timestamp: Math.floor(Date.now() / 1e3)
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Extract cost from x402 response headers.
|
|
359
|
+
*/
|
|
360
|
+
extractCost(res) {
|
|
361
|
+
const creditsUsed = res.headers.get("x-nansen-credits-used");
|
|
362
|
+
if (creditsUsed) {
|
|
363
|
+
return creditsUsed;
|
|
364
|
+
}
|
|
365
|
+
const paymentResponse = res.headers.get("payment-response");
|
|
366
|
+
if (paymentResponse) {
|
|
367
|
+
try {
|
|
368
|
+
const parsed = JSON.parse(paymentResponse);
|
|
369
|
+
if (parsed.amount) {
|
|
370
|
+
const cents = Number(parsed.amount) / 1e6;
|
|
371
|
+
return cents.toFixed(4);
|
|
372
|
+
}
|
|
373
|
+
} catch {
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return "unknown";
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
// src/providers/research/index.ts
|
|
381
|
+
function getResearchProvider(name) {
|
|
382
|
+
switch (name) {
|
|
383
|
+
case "messari":
|
|
384
|
+
return new MessariProvider();
|
|
385
|
+
case "nansen":
|
|
386
|
+
return new NansenProvider();
|
|
387
|
+
default:
|
|
388
|
+
throw new Error(
|
|
389
|
+
`Unknown research provider: ${name}. Valid providers: messari, nansen`
|
|
390
|
+
);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
export {
|
|
395
|
+
MESSARI_COST_ESTIMATE,
|
|
396
|
+
MessariProvider,
|
|
397
|
+
NANSEN_COST_ESTIMATE,
|
|
398
|
+
NansenProvider,
|
|
399
|
+
getResearchProvider
|
|
400
|
+
};
|
|
401
|
+
//# sourceMappingURL=chunk-VADRJDMW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/research/messari.ts","../src/lib/x402.ts","../src/providers/research/nansen.ts","../src/providers/research/index.ts"],"sourcesContent":["/**\n * Messari research provider — x402 micropayments for crypto market data.\n *\n * Docs: https://docs.messari.io\n * Payment: x402 (USDC on Base) — no API key required\n * Data: 34,000+ assets, market metrics, asset profiles\n * Pricing: $0.10/call for asset details, ROI, ATH. $0.15–$0.35 for timeseries.\n * $0.55 for news/signals. Full pricing: https://docs.messari.io/api-reference/x402-payments\n *\n * Supports:\n * token → asset details (description, category, sector, links, market snapshot)\n * market → market metrics + ATH (price, volume, market cap, ROI, ATH, cycle low)\n *\n * Not supported (use --provider nansen instead):\n * smart-money → on-chain analytics not available in Messari x402 API\n * wallet → wallet profiling not available in Messari x402 API\n */\n\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { ProviderInfo } from \"../../types.js\";\nimport type { ResearchProvider, ResearchQuery, ResearchResult } from \"./index.js\";\nimport { getX402Fetch } from \"../../lib/x402.js\";\n\nconst BASE_URL = \"https://api.messari.io\";\n\n/** Known x402 cost per Messari query (approximate). */\nexport const MESSARI_COST_ESTIMATE: Record<string, string> = {\n token: \"~$0.10\",\n market: \"~$0.20\",\n};\n\nexport class MessariProvider implements ResearchProvider {\n info(): ProviderInfo {\n return {\n name: \"messari\",\n type: \"research\",\n capabilities: [\n \"research.token\",\n \"research.market\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async query(params: ResearchQuery): Promise<ResearchResult> {\n switch (params.type) {\n case \"token\":\n return this.tokenReport(params.target);\n case \"market\":\n return this.marketOverview(params.target);\n case \"smart-money\":\n throw new Error(\n \"Messari x402 API does not support on-chain analytics. Use --provider nansen for smart money data.\",\n );\n case \"wallet\":\n throw new Error(\n \"Messari does not support wallet analytics. Use --provider nansen for wallet profiling.\",\n );\n default:\n throw new Error(`Unsupported query type: ${params.type}`);\n }\n }\n\n /**\n * Resolve any user input (symbol, name, slug, address) to a Messari asset slug.\n * Uses the free /metrics/v2/assets endpoint ($0.00) to search.\n */\n private async resolveSlug(target: string): Promise<string> {\n const fetchWithPay = await getX402Fetch();\n const params = new URLSearchParams({\n search: target,\n limit: \"1\",\n });\n const url = `${BASE_URL}/metrics/v2/assets?${params}`;\n\n const res = await fetchWithPay(url, { method: \"GET\" });\n if (!res.ok) {\n throw new Error(\n `Messari asset lookup failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as {\n data?: Array<{ slug?: string }>;\n };\n\n const slug = json.data?.[0]?.slug;\n if (!slug) {\n throw new Error(\n `No Messari asset found for \"${target}\". Try a different name, symbol, or slug.`,\n );\n }\n return slug;\n }\n\n /**\n * Get asset details: description, category, sector, links, market snapshot.\n * Endpoint: GET /metrics/v2/assets/details?assetIDs={slug} ($0.10)\n */\n private async tokenReport(target: string): Promise<ResearchResult> {\n const slug = await this.resolveSlug(target);\n const fetchWithPay = await getX402Fetch();\n const url = `${BASE_URL}/metrics/v2/assets/details?assetIDs=${encodeURIComponent(slug)}`;\n\n const res = await fetchWithPay(url, { method: \"GET\" });\n if (!res.ok) {\n throw new Error(\n `Messari token query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as {\n data?: Array<Record<string, unknown>>;\n };\n const costUsdc = this.extractCost(res);\n const asset = json.data?.[0] ?? {};\n\n return {\n provider: \"messari\",\n queryType: \"token\",\n target,\n data: asset,\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Get market metrics + ATH: price, volume, market cap, ROI, all-time high, cycle low.\n * Makes two parallel calls:\n * GET /metrics/v2/assets/details?assetIDs={slug} ($0.10)\n * GET /metrics/v2/assets/ath?assetIDs={slug} ($0.10)\n * Total: ~$0.20\n */\n private async marketOverview(target: string): Promise<ResearchResult> {\n const slug = await this.resolveSlug(target);\n const fetchWithPay = await getX402Fetch();\n const assetParam = encodeURIComponent(slug);\n\n const [detailsRes, athRes] = await Promise.all([\n fetchWithPay(`${BASE_URL}/metrics/v2/assets/details?assetIDs=${assetParam}`, { method: \"GET\" }),\n fetchWithPay(`${BASE_URL}/metrics/v2/assets/ath?assetIDs=${assetParam}`, { method: \"GET\" }),\n ]);\n\n if (!detailsRes.ok) {\n throw new Error(\n `Messari market query failed: ${detailsRes.status} ${detailsRes.statusText}`,\n );\n }\n if (!athRes.ok) {\n throw new Error(\n `Messari ATH query failed: ${athRes.status} ${athRes.statusText}`,\n );\n }\n\n const detailsJson = (await detailsRes.json()) as {\n data?: Array<Record<string, unknown>>;\n };\n const athJson = (await athRes.json()) as {\n data?: Array<Record<string, unknown>>;\n };\n\n // Sum costs from both responses\n const cost1 = this.extractCostRaw(detailsRes);\n const cost2 = this.extractCostRaw(athRes);\n const totalCost = cost1 + cost2;\n const costUsdc = totalCost > 0 ? totalCost.toFixed(4) : \"unknown\";\n\n const details = detailsJson.data?.[0] ?? {};\n const ath = athJson.data?.[0] ?? {};\n\n return {\n provider: \"messari\",\n queryType: \"market\",\n target,\n data: {\n ...details,\n allTimeHigh: ath.allTimeHigh ?? null,\n },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Extract cost from x402 response headers as a number (USDC).\n * Returns 0 if no payment info found.\n */\n private extractCostRaw(res: Response): number {\n const paymentResponse = res.headers.get(\"payment-response\");\n if (paymentResponse) {\n try {\n const parsed = JSON.parse(paymentResponse) as { amount?: string };\n if (parsed.amount) {\n return Number(parsed.amount) / 1e6;\n }\n } catch {\n // Fall through\n }\n }\n return 0;\n }\n\n /**\n * Extract cost from x402 response headers as a formatted string.\n */\n private extractCost(res: Response): string {\n const cost = this.extractCostRaw(res);\n return cost > 0 ? cost.toFixed(4) : \"unknown\";\n }\n}\n","/**\n * x402 fetch wrapper — wraps native fetch with automatic USDC micropayments.\n *\n * Uses the Coinbase x402 protocol: when a server responds 402 Payment Required,\n * the wrapper automatically signs a USDC payment on Base and retries the request.\n * The agent pays from its own wallet — no vault interaction needed.\n *\n * Singleton pattern matching client.ts — cached after first creation.\n */\n\nimport { getAccount } from \"./client.js\";\n\nlet _x402Fetch: typeof fetch | null = null;\n\n/**\n * Returns a fetch function that automatically handles x402 (402 Payment Required)\n * responses by signing USDC micropayments on Base.\n *\n * Lazily initializes the x402 client on first call and caches it.\n * Uses dynamic imports so @x402 packages are only loaded when research commands run.\n */\nexport async function getX402Fetch(): Promise<typeof fetch> {\n if (_x402Fetch) return _x402Fetch;\n\n const { x402Client, wrapFetchWithPayment } = await import(\"@x402/fetch\");\n const { registerExactEvmScheme } = await import(\"@x402/evm/exact/client\");\n\n const signer = getAccount();\n const client = new x402Client();\n registerExactEvmScheme(client, { signer });\n\n _x402Fetch = wrapFetchWithPayment(fetch, client) as typeof fetch;\n return _x402Fetch;\n}\n\n/**\n * Reset cached x402 fetch. Required for tests that change accounts.\n */\nexport function resetX402Fetch(): void {\n _x402Fetch = null;\n}\n","/**\n * Nansen research provider — x402 micropayments for on-chain analytics.\n *\n * Docs: https://docs.nansen.ai\n * Payment: x402 (USDC on Base) — no API key required\n * Pricing: Basic $0.01/call (Token Screener, Wallet Balances, PnL, DEX Trades)\n * Premium $0.05/call (Smart Money Net Flow, Holdings, PnL Leaderboard)\n *\n * Supports all query types:\n * token → token screener (on-chain metrics, holder quality)\n * market → token screener sorted by market cap / volume\n * smart-money → smart money net flow from labeled wallets\n * wallet → wallet profiler (PnL, tx patterns, counterparties)\n */\n\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { ProviderInfo } from \"../../types.js\";\nimport type { ResearchProvider, ResearchQuery, ResearchResult } from \"./index.js\";\nimport { getX402Fetch } from \"../../lib/x402.js\";\n\nconst BASE_URL = \"https://api.nansen.ai\";\n\n/** Known x402 cost per Nansen query type. */\nexport const NANSEN_COST_ESTIMATE: Record<string, string> = {\n token: \"~$0.01\",\n market: \"~$0.01\",\n \"smart-money\": \"~$0.05\",\n wallet: \"~$0.01\",\n};\n\nexport class NansenProvider implements ResearchProvider {\n info(): ProviderInfo {\n return {\n name: \"nansen\",\n type: \"research\",\n capabilities: [\n \"research.token\",\n \"research.market\",\n \"research.smart-money\",\n \"research.wallet\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async query(params: ResearchQuery): Promise<ResearchResult> {\n switch (params.type) {\n case \"token\":\n return this.tokenScreener(params.target);\n case \"market\":\n return this.marketScreener(params.target);\n case \"smart-money\":\n return this.smartMoneyNetflow(params.options?.token ?? params.target);\n case \"wallet\":\n return this.walletProfile(params.target);\n default:\n throw new Error(`Unsupported query type: ${params.type}`);\n }\n }\n\n /**\n * Token Screener — comprehensive token discovery with on-chain metrics.\n * Endpoint: POST /api/v1/token-screener\n * Cost: ~$0.01 (basic tier)\n */\n private async tokenScreener(target: string): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n // Determine if target is an address or symbol\n const isAddr = target.startsWith(\"0x\") && target.length === 42;\n const filters: Record<string, unknown> = isAddr\n ? { token_address: [target] }\n : { token_symbol: [target.toUpperCase()] };\n\n const body = {\n chains: [\"base\"],\n timeframe: \"24h\",\n filters,\n pagination: { page: 1, records_per_page: 10 },\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/token-screener`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen token query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: unknown[] };\n const costUsdc = this.extractCost(res);\n\n return {\n provider: \"nansen\",\n queryType: \"token\",\n target,\n data: { tokens: json.data ?? [], count: (json.data ?? []).length },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Market Screener — token screener sorted by volume/market cap for market overview.\n * Endpoint: POST /api/v1/token-screener\n * Cost: ~$0.01 (basic tier)\n */\n private async marketScreener(asset: string): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n const isAddr = asset.startsWith(\"0x\") && asset.length === 42;\n const filters: Record<string, unknown> = isAddr\n ? { token_address: [asset] }\n : { token_symbol: [asset.toUpperCase()] };\n\n const body = {\n chains: [\"base\"],\n timeframe: \"24h\",\n filters,\n order_by: [{ field: \"buy_volume\", direction: \"desc\" }],\n pagination: { page: 1, records_per_page: 10 },\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/token-screener`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen market query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: unknown[] };\n const costUsdc = this.extractCost(res);\n\n return {\n provider: \"nansen\",\n queryType: \"market\",\n target: asset,\n data: { tokens: json.data ?? [], count: (json.data ?? []).length },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Smart Money Net Flow — capital flow analysis from labeled wallets.\n * Endpoint: POST /api/v1/smart-money/netflow\n * Cost: ~$0.05 (premium tier)\n */\n private async smartMoneyNetflow(\n tokenSymbol: string,\n ): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n const body = {\n chains: [\"base\"],\n filters: {\n token_symbol: [tokenSymbol.toUpperCase()],\n },\n pagination: { page: 1, records_per_page: 10 },\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/smart-money/netflow`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen smart-money query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: unknown[] };\n const costUsdc = this.extractCost(res);\n\n return {\n provider: \"nansen\",\n queryType: \"smart-money\",\n target: tokenSymbol,\n data: { flows: json.data ?? [], count: (json.data ?? []).length },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Wallet Profile — PnL history, transaction patterns, counterparties.\n * Endpoint: POST /api/v1/profiler/wallet-pnl\n * Cost: ~$0.01 (basic tier)\n */\n private async walletProfile(address: string): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n const body = {\n chains: [\"base\"],\n address,\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/profiler/wallet-pnl`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen wallet query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: Record<string, unknown> };\n const costUsdc = this.extractCost(res);\n\n return {\n provider: \"nansen\",\n queryType: \"wallet\",\n target: address,\n data: json.data ?? (json as Record<string, unknown>),\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Extract cost from x402 response headers.\n */\n private extractCost(res: Response): string {\n // Check Nansen-specific credit header\n const creditsUsed = res.headers.get(\"x-nansen-credits-used\");\n if (creditsUsed) {\n return creditsUsed;\n }\n\n // Fall back to x402 payment-response header\n const paymentResponse = res.headers.get(\"payment-response\");\n if (paymentResponse) {\n try {\n const parsed = JSON.parse(paymentResponse) as { amount?: string };\n if (parsed.amount) {\n const cents = Number(parsed.amount) / 1e6;\n return cents.toFixed(4);\n }\n } catch {\n // Fall through\n }\n }\n\n return \"unknown\";\n }\n}\n","/**\n * Research providers — pluggable interface for DeFi research data via x402 micropayments.\n *\n * Same pattern as DeFi providers (Moonwell, Uniswap). Each research provider\n * implements ResearchProvider and uses x402-wrapped fetch for automatic USDC payments.\n */\n\nimport type { Provider } from \"../../types.js\";\nimport { MessariProvider } from \"./messari.js\";\nimport { NansenProvider } from \"./nansen.js\";\n\n// ── Types ──\n\nexport interface ResearchQuery {\n /** Query type determines which API endpoint is called */\n type: \"token\" | \"smart-money\" | \"market\" | \"wallet\";\n /** Token address, asset symbol, or wallet address depending on type */\n target: string;\n /** Additional query params (e.g. token symbol for smart-money queries) */\n options?: Record<string, string>;\n}\n\nexport interface ResearchResult {\n provider: string;\n queryType: string;\n target: string;\n /** Structured response data from the provider */\n data: Record<string, unknown>;\n /** Cost paid in USDC (human-readable, e.g. \"0.05\") */\n costUsdc: string;\n timestamp: number;\n}\n\nexport interface ResearchProvider extends Provider {\n /** Query the research provider. Payment is handled automatically via x402. */\n query(params: ResearchQuery): Promise<ResearchResult>;\n}\n\n// ── Factory ──\n\nexport function getResearchProvider(name: string): ResearchProvider {\n switch (name) {\n case \"messari\":\n return new MessariProvider();\n case \"nansen\":\n return new NansenProvider();\n default:\n throw new Error(\n `Unknown research provider: ${name}. Valid providers: messari, nansen`,\n );\n }\n}\n\n// ── Re-exports ──\n\nexport { MessariProvider, NansenProvider };\n"],"mappings":"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","names":["base","baseSepolia","BASE_URL","base","baseSepolia"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createApproval,
|
|
3
|
+
createJoinRequest,
|
|
4
|
+
createResearchAttestation,
|
|
5
|
+
getEasScanUrl,
|
|
6
|
+
queryApprovals,
|
|
7
|
+
queryJoinRequests,
|
|
8
|
+
revokeAttestation
|
|
9
|
+
} from "./chunk-JY24QVXN.js";
|
|
10
|
+
import "./chunk-FGSXRXCZ.js";
|
|
11
|
+
import "./chunk-QMWMT6EH.js";
|
|
12
|
+
export {
|
|
13
|
+
createApproval,
|
|
14
|
+
createJoinRequest,
|
|
15
|
+
createResearchAttestation,
|
|
16
|
+
getEasScanUrl,
|
|
17
|
+
queryApprovals,
|
|
18
|
+
queryJoinRequests,
|
|
19
|
+
revokeAttestation
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=eas-Y2XAG3C6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|