@0xprotovox/deficlaw 0.1.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.
Files changed (44) hide show
  1. package/README.md +230 -0
  2. package/dist/analysis/formatOutput.d.ts +4 -0
  3. package/dist/analysis/formatOutput.js +209 -0
  4. package/dist/analysis/formatOutput.js.map +1 -0
  5. package/dist/analysis/riskScorer.d.ts +6 -0
  6. package/dist/analysis/riskScorer.js +104 -0
  7. package/dist/analysis/riskScorer.js.map +1 -0
  8. package/dist/analysis/summaryGenerator.d.ts +68 -0
  9. package/dist/analysis/summaryGenerator.js +171 -0
  10. package/dist/analysis/summaryGenerator.js.map +1 -0
  11. package/dist/cache/memoryCache.d.ts +13 -0
  12. package/dist/cache/memoryCache.js +31 -0
  13. package/dist/cache/memoryCache.js.map +1 -0
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.js +12 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/server.d.ts +7 -0
  18. package/dist/server.js +76 -0
  19. package/dist/server.js.map +1 -0
  20. package/dist/sources/dexscreener.d.ts +20 -0
  21. package/dist/sources/dexscreener.js +117 -0
  22. package/dist/sources/dexscreener.js.map +1 -0
  23. package/dist/sources/gmgn.d.ts +8 -0
  24. package/dist/sources/gmgn.js +210 -0
  25. package/dist/sources/gmgn.js.map +1 -0
  26. package/dist/sources/solanaRpc.d.ts +14 -0
  27. package/dist/sources/solanaRpc.js +60 -0
  28. package/dist/sources/solanaRpc.js.map +1 -0
  29. package/dist/tools/analyzeToken.d.ts +8 -0
  30. package/dist/tools/analyzeToken.js +253 -0
  31. package/dist/tools/analyzeToken.js.map +1 -0
  32. package/dist/tools/getPrice.d.ts +17 -0
  33. package/dist/tools/getPrice.js +13 -0
  34. package/dist/tools/getPrice.js.map +1 -0
  35. package/dist/tools/getTopTraders.d.ts +45 -0
  36. package/dist/tools/getTopTraders.js +44 -0
  37. package/dist/tools/getTopTraders.js.map +1 -0
  38. package/dist/tools/getTrending.d.ts +9 -0
  39. package/dist/tools/getTrending.js +16 -0
  40. package/dist/tools/getTrending.js.map +1 -0
  41. package/dist/types/index.d.ts +127 -0
  42. package/dist/types/index.js +2 -0
  43. package/dist/types/index.js.map +1 -0
  44. package/package.json +46 -0
@@ -0,0 +1,210 @@
1
+ /**
2
+ * GMGN Data Source
3
+ * Strategy: try direct VAS API first (fast), fall back to Playwright (slower but reliable)
4
+ * GMGN uses Cloudflare which blocks Node.js fetch but allows curl and Playwright
5
+ */
6
+ import { MemoryCache } from '../cache/memoryCache.js';
7
+ import { execSync } from 'child_process';
8
+ const CACHE_TTL = 2 * 60 * 1000;
9
+ const BASE_URL = 'https://gmgn.ai/vas/api/v1';
10
+ const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
11
+ const SCRAPE_TIMEOUT = 40000;
12
+ let browser = null;
13
+ let initializing = false;
14
+ const holderCache = new MemoryCache(CACHE_TTL);
15
+ /** Try fetching via curl (bypasses Node.js TLS fingerprint detection) */
16
+ function curlFetch(path) {
17
+ try {
18
+ const url = `${BASE_URL}${path}`;
19
+ const cmd = `curl -s --max-time 10 "${url}" -H "User-Agent: ${UA}"`;
20
+ const out = execSync(cmd, { timeout: 12000 }).toString();
21
+ if (out.startsWith('<!'))
22
+ return null; // Cloudflare HTML
23
+ const json = JSON.parse(out);
24
+ if (json.code !== 0)
25
+ return null;
26
+ return json.data;
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ /** Normalize GMGN holder data */
33
+ function normalizeHolders(rawList) {
34
+ if (!Array.isArray(rawList))
35
+ return [];
36
+ return rawList.map(h => {
37
+ let tags = [];
38
+ if (Array.isArray(h.tags))
39
+ tags.push(...h.tags);
40
+ if (h.wallet_tag_v2) {
41
+ const wt = Array.isArray(h.wallet_tag_v2) ? h.wallet_tag_v2 : [h.wallet_tag_v2];
42
+ tags.push(...wt);
43
+ }
44
+ if (h.maker_token_tags) {
45
+ const mt = Array.isArray(h.maker_token_tags) ? h.maker_token_tags : [h.maker_token_tags];
46
+ tags.push(...mt);
47
+ }
48
+ tags = [...new Set(tags.map(t => {
49
+ if (typeof t === 'object' && t !== null)
50
+ return t.name || t.label || '';
51
+ return String(t).trim();
52
+ }).filter(Boolean))];
53
+ return {
54
+ address: h.address || '',
55
+ tags,
56
+ twitterHandle: h.twitter_username || null,
57
+ twitterName: h.twitter_name || null,
58
+ name: h.name || null,
59
+ balance: h.balance || h.amount_cur || 0,
60
+ supplyPercent: h.amount_percentage || 0,
61
+ valueUsd: h.usd_value || 0,
62
+ avgBuyPrice: h.avg_cost || 0,
63
+ cost: h.cost_cur || h.cost || h.total_cost || 0,
64
+ unrealizedPnl: h.unrealized_profit || h.unrealized_pnl || 0,
65
+ realizedPnl: h.realized_profit || h.realized_pnl || 0,
66
+ totalPnl: (h.unrealized_profit || 0) + (h.realized_profit || 0),
67
+ profitMultiple: h.profit_change || 0,
68
+ buyAmount: h.buy_amount_cur || h.accu_amount || 0,
69
+ sellAmount: h.sell_amount_cur || h.current_sell_amount || 0,
70
+ buyTxCount: h.buy_tx_count_cur || 0,
71
+ sellTxCount: h.sell_tx_count_cur || 0,
72
+ isDeployer: h.is_deployer || false,
73
+ isFreshWallet: h.is_new || h.is_fresh_wallet || false,
74
+ lastActiveAt: h.last_active_timestamp ? new Date(h.last_active_timestamp * 1000).toISOString() : null,
75
+ };
76
+ }).filter(h => h.address && h.address.length > 10);
77
+ }
78
+ /** Playwright fallback — intercept GMGN API via browser */
79
+ async function ensureBrowser() {
80
+ if (browser?.isConnected?.())
81
+ return;
82
+ browser = null;
83
+ if (initializing) {
84
+ await new Promise(r => { const iv = setInterval(() => { if (!initializing) {
85
+ clearInterval(iv);
86
+ r();
87
+ } }, 200); });
88
+ return;
89
+ }
90
+ initializing = true;
91
+ try {
92
+ const pw = await import('playwright');
93
+ browser = await pw.chromium.launch({
94
+ headless: true,
95
+ args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu'],
96
+ });
97
+ }
98
+ finally {
99
+ initializing = false;
100
+ }
101
+ }
102
+ async function playwrightFetch(address) {
103
+ await ensureBrowser();
104
+ const ctx = await browser.newContext({ userAgent: UA, viewport: { width: 1280, height: 720 } });
105
+ const page = await ctx.newPage();
106
+ try {
107
+ return await new Promise(async (resolve, reject) => {
108
+ const timeout = setTimeout(() => reject(new Error('GMGN scrape timeout')), SCRAPE_TIMEOUT);
109
+ let collected = [];
110
+ let resolved = false;
111
+ page.on('response', async (response) => {
112
+ if (resolved)
113
+ return;
114
+ const url = response.url();
115
+ if (url.includes('/token_holders/sol/') || url.includes('/top_holders/sol/')) {
116
+ try {
117
+ const json = await response.json();
118
+ const items = Array.isArray(json.data) ? json.data : (json.data?.holders || json.data?.list || []);
119
+ if (items.length > 0) {
120
+ collected.push(...items);
121
+ if (collected.length >= 10) {
122
+ clearTimeout(timeout);
123
+ resolved = true;
124
+ resolve(collected.slice(0, 150));
125
+ }
126
+ }
127
+ }
128
+ catch { }
129
+ }
130
+ });
131
+ try {
132
+ await page.goto(`https://gmgn.ai/sol/token/${address}`, { waitUntil: 'domcontentloaded', timeout: 20000 });
133
+ await page.waitForTimeout(3000);
134
+ for (const sel of ['button:has-text("Holder")', '[role="tab"]:has-text("Holder")', 'text=Holders']) {
135
+ try {
136
+ const t = await page.$(sel);
137
+ if (t) {
138
+ await t.click();
139
+ break;
140
+ }
141
+ }
142
+ catch {
143
+ continue;
144
+ }
145
+ }
146
+ await page.waitForTimeout(5000);
147
+ if (!resolved && collected.length > 0) {
148
+ clearTimeout(timeout);
149
+ resolved = true;
150
+ resolve(collected.slice(0, 150));
151
+ }
152
+ if (!resolved) {
153
+ await page.waitForTimeout(5000);
154
+ if (collected.length > 0) {
155
+ clearTimeout(timeout);
156
+ resolve(collected.slice(0, 150));
157
+ }
158
+ }
159
+ }
160
+ catch (e) {
161
+ if (!resolved) {
162
+ clearTimeout(timeout);
163
+ reject(e);
164
+ }
165
+ }
166
+ });
167
+ }
168
+ finally {
169
+ await page.close().catch(() => { });
170
+ await ctx.close().catch(() => { });
171
+ }
172
+ }
173
+ export async function isPlaywrightAvailable() {
174
+ return true; // curl fallback always available, Playwright optional
175
+ }
176
+ /** Get holders — try curl first, then Playwright */
177
+ export async function getHolders(address) {
178
+ const cached = holderCache.get(address);
179
+ if (cached)
180
+ return cached;
181
+ // Strategy 1: curl (fast, ~1s)
182
+ const curlData = curlFetch(`/token_holders/sol/${address}?limit=100`);
183
+ if (curlData?.list?.length > 0) {
184
+ const kolData = curlFetch(`/token_holders/sol/${address}?tag=renowned&limit=50`);
185
+ const holders = normalizeHolders(curlData.list);
186
+ const kolHolders = normalizeHolders(kolData?.list || []);
187
+ const result = { holders, kolHolders };
188
+ holderCache.set(address, result);
189
+ return result;
190
+ }
191
+ // Strategy 2: Playwright (slower ~11s, but bypasses Cloudflare)
192
+ try {
193
+ const rawHolders = await playwrightFetch(address);
194
+ const holders = normalizeHolders(rawHolders);
195
+ // KOL fetch via page.evaluate inside Playwright context
196
+ const result = { holders, kolHolders: [] };
197
+ holderCache.set(address, result);
198
+ return result;
199
+ }
200
+ catch (err) {
201
+ throw new Error(`GMGN fetch failed: ${err.message}`);
202
+ }
203
+ }
204
+ export async function shutdown() {
205
+ if (browser) {
206
+ await browser.close().catch(() => { });
207
+ browser = null;
208
+ }
209
+ }
210
+ //# sourceMappingURL=gmgn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmgn.js","sourceRoot":"","sources":["../../src/sources/gmgn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Solana RPC — Token security checks (FREE, no auth)
3
+ * Checks mint authority, freeze authority, supply
4
+ */
5
+ export interface TokenSecurity {
6
+ mintAuthority: 'revoked' | 'active';
7
+ freezeAuthority: 'revoked' | 'active';
8
+ supply: number;
9
+ decimals: number;
10
+ }
11
+ /** Check token mint/freeze authority */
12
+ export declare function getTokenSecurity(mintAddress: string): Promise<TokenSecurity | null>;
13
+ /** Check if an address is likely an LP pool (has program owner like Raydium/Orca) */
14
+ export declare function isLikelyLpPool(address: string): Promise<boolean>;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Solana RPC — Token security checks (FREE, no auth)
3
+ * Checks mint authority, freeze authority, supply
4
+ */
5
+ const RPC_URL = process.env.SOLANA_RPC_URL || 'https://api.mainnet-beta.solana.com';
6
+ async function rpcCall(method, params) {
7
+ const res = await fetch(RPC_URL, {
8
+ method: 'POST',
9
+ headers: { 'Content-Type': 'application/json' },
10
+ body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
11
+ signal: AbortSignal.timeout(10000),
12
+ });
13
+ const json = await res.json();
14
+ if (json.error)
15
+ throw new Error(json.error.message);
16
+ return json.result;
17
+ }
18
+ /** Check token mint/freeze authority */
19
+ export async function getTokenSecurity(mintAddress) {
20
+ try {
21
+ const result = await rpcCall('getAccountInfo', [
22
+ mintAddress,
23
+ { encoding: 'jsonParsed' },
24
+ ]);
25
+ if (!result?.value?.data?.parsed?.info)
26
+ return null;
27
+ const info = result.value.data.parsed.info;
28
+ return {
29
+ mintAuthority: info.mintAuthority ? 'active' : 'revoked',
30
+ freezeAuthority: info.freezeAuthority ? 'active' : 'revoked',
31
+ supply: parseFloat(info.supply) / Math.pow(10, info.decimals),
32
+ decimals: info.decimals,
33
+ };
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ /** Check if an address is likely an LP pool (has program owner like Raydium/Orca) */
40
+ export async function isLikelyLpPool(address) {
41
+ try {
42
+ const result = await rpcCall('getAccountInfo', [address, { encoding: 'base64' }]);
43
+ if (!result?.value)
44
+ return false;
45
+ const owner = result.value.owner;
46
+ const LP_PROGRAMS = [
47
+ '675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8', // Raydium AMM
48
+ 'CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK', // Raydium CLMM
49
+ 'whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc', // Orca Whirlpool
50
+ 'LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo', // Meteora DLMM
51
+ '6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P', // PumpFun
52
+ 'PSwapMdSai8tjrEXcxFeQth87xC4rRsa4VA5mhGhXkP', // PumpSwap
53
+ ];
54
+ return LP_PROGRAMS.includes(owner);
55
+ }
56
+ catch {
57
+ return false;
58
+ }
59
+ }
60
+ //# sourceMappingURL=solanaRpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solanaRpc.js","sourceRoot":"","sources":["../../src/sources/solanaRpc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,qCAAqC,CAAC;AAEpF,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,MAAa;IAClD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;QAC/B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC/D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AASD,wCAAwC;AACxC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE;YAC7C,WAAW;YACX,EAAE,QAAQ,EAAE,YAAY,EAAE;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI;YAAE,OAAO,IAAI,CAAC;QAEpD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAC3C,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACxD,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YAC5D,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;YAC7D,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,MAAM,EAAE,KAAK;YAAE,OAAO,KAAK,CAAC;QAEjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QACjC,MAAM,WAAW,GAAG;YAClB,8CAA8C,EAAE,cAAc;YAC9D,8CAA8C,EAAE,eAAe;YAC/D,6CAA6C,EAAG,iBAAiB;YACjE,6CAA6C,EAAG,eAAe;YAC/D,6CAA6C,EAAG,UAAU;YAC1D,6CAA6C,EAAG,WAAW;SAC5D,CAAC;QACF,OAAO,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { TokenAnalysis } from '../types/index.js';
2
+ export declare function handleAnalyzeToken(args: {
3
+ address: string;
4
+ chain?: string;
5
+ include_holders?: boolean;
6
+ }): Promise<TokenAnalysis | {
7
+ error: string;
8
+ }>;
@@ -0,0 +1,253 @@
1
+ /**
2
+ * analyze_token tool — Deep token analysis
3
+ * DexScreener (price/volume/liquidity) + GMGN (holders/insiders/risk)
4
+ * All FREE, no paid APIs
5
+ */
6
+ import { getTokenPair } from '../sources/dexscreener.js';
7
+ import * as gmgn from '../sources/gmgn.js';
8
+ import { getTokenSecurity, isLikelyLpPool } from '../sources/solanaRpc.js';
9
+ import { scoreRisk } from '../analysis/riskScorer.js';
10
+ import { generateSummary } from '../analysis/summaryGenerator.js';
11
+ function classifyHolders(holders) {
12
+ const sorted = [...holders].sort((a, b) => b.supplyPercent - a.supplyPercent);
13
+ const devWallets = holders.filter(h => h.isDeployer);
14
+ const freshWallets = holders.filter(h => h.isFreshWallet);
15
+ const snipers = holders.filter(h => h.tags.some(t => /sniper|bot|sandwich/i.test(t)));
16
+ const kols = holders.filter(h => h.tags.some(t => /kol|renowned|influencer/i.test(t)));
17
+ const smartMoney = holders.filter(h => h.tags.some(t => /smart|fund|whale/i.test(t)));
18
+ const diamondHands = holders.filter(h => h.tags.some(t => /diamond/i.test(t)));
19
+ const insiders = holders.filter(h => h.tags.some(t => /insider|team|early/i.test(t)));
20
+ const photonUsers = holders.filter(h => h.tags.some(t => /photon/i.test(t)));
21
+ const gmgnUsers = holders.filter(h => h.tags.some(t => /gmgn/i.test(t)));
22
+ const transferIn = holders.filter(h => h.tags.some(t => /transfer_in/i.test(t)));
23
+ // Profitable vs losing holders
24
+ const profitable = holders.filter(h => h.totalPnl > 0);
25
+ const losing = holders.filter(h => h.totalPnl < 0);
26
+ const totalPnl = holders.reduce((s, h) => s + h.totalPnl, 0);
27
+ const totalCost = holders.reduce((s, h) => s + h.cost, 0);
28
+ // Buy vs Sell pressure
29
+ const totalBuyVolume = holders.reduce((s, h) => s + (h.buyAmount || 0), 0);
30
+ const totalSellVolume = holders.reduce((s, h) => s + (h.sellAmount || 0), 0);
31
+ const totalBuyTx = holders.reduce((s, h) => s + h.buyTxCount, 0);
32
+ const totalSellTx = holders.reduce((s, h) => s + h.sellTxCount, 0);
33
+ // Concentration
34
+ const top5Pct = sorted.slice(0, 5).reduce((s, h) => s + h.supplyPercent, 0);
35
+ const top10Pct = sorted.slice(0, 10).reduce((s, h) => s + h.supplyPercent, 0);
36
+ const top20Pct = sorted.slice(0, 20).reduce((s, h) => s + h.supplyPercent, 0);
37
+ // Average hold time (from lastActiveAt)
38
+ const activeDates = holders
39
+ .filter(h => h.lastActiveAt)
40
+ .map(h => new Date(h.lastActiveAt).getTime());
41
+ const avgLastActive = activeDates.length > 0
42
+ ? new Date(activeDates.reduce((s, d) => s + d, 0) / activeDates.length).toISOString()
43
+ : null;
44
+ return {
45
+ total: holders.length,
46
+ concentration: { top5Pct, top10Pct, top20Pct },
47
+ categories: {
48
+ devWallets: devWallets.length,
49
+ freshWallets: freshWallets.length,
50
+ snipers: snipers.length,
51
+ kols: kols.length,
52
+ smartMoney: smartMoney.length,
53
+ diamondHands: diamondHands.length,
54
+ insiders: insiders.length,
55
+ photonUsers: photonUsers.length,
56
+ gmgnUsers: gmgnUsers.length,
57
+ transferIn: transferIn.length,
58
+ },
59
+ sentiment: {
60
+ profitableHolders: profitable.length,
61
+ losingHolders: losing.length,
62
+ profitRatio: holders.length > 0 ? profitable.length / holders.length : 0,
63
+ totalPnlUsd: totalPnl,
64
+ totalCostUsd: totalCost,
65
+ avgPnlPerHolder: holders.length > 0 ? totalPnl / holders.length : 0,
66
+ },
67
+ pressure: {
68
+ totalBuyVolume,
69
+ totalSellVolume,
70
+ buySellRatio: totalSellVolume > 0 ? totalBuyVolume / totalSellVolume : totalBuyVolume > 0 ? Infinity : 0,
71
+ totalBuyTx,
72
+ totalSellTx,
73
+ },
74
+ avgLastActive,
75
+ devWallet: devWallets[0] ? {
76
+ address: devWallets[0].address,
77
+ holdingPercent: devWallets[0].supplyPercent,
78
+ pnl: devWallets[0].totalPnl,
79
+ sellAmount: devWallets[0].sellAmount,
80
+ buyAmount: devWallets[0].buyAmount,
81
+ status: devWallets[0].sellAmount > devWallets[0].buyAmount * 0.8 ? 'sold_most'
82
+ : devWallets[0].sellAmount > 0 ? 'selling' : 'holding',
83
+ } : null,
84
+ topHolders: sorted.slice(0, 20).map(h => ({
85
+ address: h.address,
86
+ tags: h.tags,
87
+ supplyPercent: h.supplyPercent,
88
+ valueUsd: h.valueUsd,
89
+ pnl: h.totalPnl,
90
+ profitMultiple: h.profitMultiple,
91
+ buyTx: h.buyTxCount,
92
+ sellTx: h.sellTxCount,
93
+ isDeployer: h.isDeployer,
94
+ isFreshWallet: h.isFreshWallet,
95
+ twitterHandle: h.twitterHandle,
96
+ })),
97
+ };
98
+ }
99
+ export async function handleAnalyzeToken(args) {
100
+ const chain = args.chain || 'solana';
101
+ const includeHolders = args.include_holders !== false;
102
+ const startMs = Date.now();
103
+ const sources = [];
104
+ // 1. DexScreener
105
+ const pair = await getTokenPair(args.address, chain);
106
+ if (!pair) {
107
+ return { error: `Token not found on DexScreener: ${args.address} (${chain})` };
108
+ }
109
+ sources.push('dexscreener');
110
+ // Token age
111
+ const ageMs = pair.pairCreatedAt ? Date.now() - pair.pairCreatedAt : 0;
112
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
113
+ const ageStr = ageDays < 1 ? `${Math.round(ageDays * 24)}h`
114
+ : ageDays < 30 ? `${Math.round(ageDays)}d`
115
+ : `${Math.round(ageDays / 30)}mo`;
116
+ // Volume/liquidity ratio (higher = more active trading)
117
+ const volumeLiquidityRatio = (pair.liquidity?.usd || 0) > 0
118
+ ? (pair.volume?.h24 || 0) / pair.liquidity.usd
119
+ : 0;
120
+ // 2. GMGN holders
121
+ let holderAnalysis;
122
+ let kolHolders = [];
123
+ let holderError = null;
124
+ let allHolders = [];
125
+ if (includeHolders && chain === 'solana') {
126
+ if (!(await gmgn.isPlaywrightAvailable())) {
127
+ holderError = 'Playwright not installed. Run: npm install playwright && npx playwright install chromium';
128
+ }
129
+ else {
130
+ try {
131
+ const data = await gmgn.getHolders(args.address);
132
+ allHolders = data.holders;
133
+ kolHolders = data.kolHolders;
134
+ holderAnalysis = classifyHolders(allHolders);
135
+ sources.push('gmgn');
136
+ }
137
+ catch (err) {
138
+ holderError = `GMGN scrape failed: ${err.message}`;
139
+ }
140
+ }
141
+ }
142
+ // 3. Risk scoring
143
+ const risk = scoreRisk(pair, allHolders.length > 0 ? allHolders : undefined);
144
+ // 4. Build result
145
+ const result = {
146
+ token: {
147
+ address: pair.baseToken.address,
148
+ name: pair.baseToken.name,
149
+ symbol: pair.baseToken.symbol,
150
+ chain,
151
+ imageUrl: pair.info?.imageUrl,
152
+ age: ageStr,
153
+ createdAt: pair.pairCreatedAt ? new Date(pair.pairCreatedAt).toISOString() : null,
154
+ },
155
+ price: {
156
+ usd: parseFloat(pair.priceUsd) || 0,
157
+ nativePrice: pair.priceNative,
158
+ change5m: pair.priceChange?.m5 || 0,
159
+ change1h: pair.priceChange?.h1 || 0,
160
+ change6h: pair.priceChange?.h6 || 0,
161
+ change24h: pair.priceChange?.h24 || 0,
162
+ },
163
+ market: {
164
+ marketCap: pair.marketCap || 0,
165
+ fdv: pair.fdv || 0,
166
+ volume24h: pair.volume?.h24 || 0,
167
+ volume6h: pair.volume?.h6 || 0,
168
+ volume1h: pair.volume?.h1 || 0,
169
+ volume5m: pair.volume?.m5 || 0,
170
+ liquidity: pair.liquidity?.usd || 0,
171
+ volumeLiquidityRatio: Math.round(volumeLiquidityRatio * 100) / 100,
172
+ dex: pair.dexId,
173
+ pairAddress: pair.pairAddress,
174
+ },
175
+ risk,
176
+ };
177
+ if (holderAnalysis) {
178
+ result.holders = holderAnalysis;
179
+ if (kolHolders.length > 0) {
180
+ result.kols = kolHolders.slice(0, 10).map(k => ({
181
+ address: k.address,
182
+ tags: k.tags,
183
+ twitterHandle: k.twitterHandle,
184
+ twitterName: k.twitterName,
185
+ supplyPercent: k.supplyPercent,
186
+ pnl: k.totalPnl,
187
+ status: k.sellAmount > k.buyAmount * 0.5 ? 'selling' : 'holding',
188
+ }));
189
+ }
190
+ }
191
+ if (holderError)
192
+ result.holderNote = holderError;
193
+ // 5. Token security (Solana RPC — free)
194
+ if (chain === 'solana') {
195
+ try {
196
+ const [security, topIsLp] = await Promise.all([
197
+ getTokenSecurity(args.address),
198
+ holderAnalysis?.topHolders[0]
199
+ ? isLikelyLpPool(holderAnalysis.topHolders[0].address)
200
+ : Promise.resolve(false),
201
+ ]);
202
+ if (security) {
203
+ result.security = {
204
+ mintAuthority: security.mintAuthority,
205
+ freezeAuthority: security.freezeAuthority,
206
+ supply: security.supply,
207
+ decimals: security.decimals,
208
+ };
209
+ sources.push('solana-rpc');
210
+ }
211
+ if (topIsLp && holderAnalysis) {
212
+ result.lpDetection = {
213
+ topHolderIsLp: true,
214
+ lpAddress: holderAnalysis.topHolders[0].address,
215
+ lpPercent: holderAnalysis.topHolders[0].supplyPercent,
216
+ realTopHolder: holderAnalysis.topHolders[1]
217
+ ? { address: holderAnalysis.topHolders[1].address, percent: holderAnalysis.topHolders[1].supplyPercent }
218
+ : null,
219
+ };
220
+ }
221
+ }
222
+ catch { /* security check failed, non-critical */ }
223
+ }
224
+ // Socials from DexScreener
225
+ if (pair.info?.websites || pair.info?.socials) {
226
+ result.socials = {
227
+ websites: pair.info.websites?.map(w => w.url) || [],
228
+ twitter: pair.info.socials?.find(s => s.type === 'twitter')?.url || null,
229
+ telegram: pair.info.socials?.find(s => s.type === 'telegram')?.url || null,
230
+ };
231
+ }
232
+ // 6. Generate human-readable summary
233
+ result.summary = generateSummary({
234
+ token: result.token,
235
+ price: result.price,
236
+ market: result.market,
237
+ risk: result.risk,
238
+ holders: holderAnalysis,
239
+ kols: result.kols,
240
+ security: result.security ? {
241
+ mintAuthority: result.security.mintAuthority,
242
+ freezeAuthority: result.security.freezeAuthority,
243
+ isLpTopHolder: result.lpDetection?.topHolderIsLp || false,
244
+ realTopHolderPct: result.lpDetection?.realTopHolder?.percent || 0,
245
+ } : undefined,
246
+ });
247
+ result.meta = {
248
+ sources,
249
+ fetchTimeMs: Date.now() - startMs,
250
+ };
251
+ return result;
252
+ }
253
+ //# sourceMappingURL=analyzeToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeToken.js","sourceRoot":"","sources":["../../src/tools/analyzeToken.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare function handleGetPrice(args: {
2
+ token: string;
3
+ chain?: string;
4
+ }): Promise<{
5
+ address: string;
6
+ symbol: string;
7
+ name: string;
8
+ priceUsd: number;
9
+ priceChange1h: number;
10
+ priceChange24h: number;
11
+ volume24h: number;
12
+ liquidity: number;
13
+ marketCap: number;
14
+ dex: string;
15
+ } | {
16
+ error: string;
17
+ }>;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * get_price tool — Quick price lookup
3
+ */
4
+ import { getPrice } from '../sources/dexscreener.js';
5
+ export async function handleGetPrice(args) {
6
+ const chain = args.chain || 'solana';
7
+ const result = await getPrice(args.token, chain);
8
+ if (!result) {
9
+ return { error: `Token not found: ${args.token} on ${chain}` };
10
+ }
11
+ return result;
12
+ }
13
+ //# sourceMappingURL=getPrice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPrice.js","sourceRoot":"","sources":["../../src/tools/getPrice.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAuC;IAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,oBAAoB,IAAI,CAAC,KAAK,OAAO,KAAK,EAAE,EAAE,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}