@0xprotovox/deficlaw 0.1.1 → 0.3.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 +115 -41
- package/dist/analysis/formatOutput.d.ts +113 -2
- package/dist/analysis/formatOutput.js +135 -100
- package/dist/analysis/formatOutput.js.map +1 -1
- package/dist/analysis/riskScorer.d.ts +24 -2
- package/dist/analysis/riskScorer.js +146 -48
- package/dist/analysis/riskScorer.js.map +1 -1
- package/dist/analysis/summaryGenerator.d.ts +3 -2
- package/dist/analysis/summaryGenerator.js +204 -42
- package/dist/analysis/summaryGenerator.js.map +1 -1
- package/dist/cache/memoryCache.d.ts +12 -3
- package/dist/cache/memoryCache.js +43 -2
- package/dist/cache/memoryCache.js.map +1 -1
- package/dist/server.d.ts +3 -2
- package/dist/server.js +66 -16
- package/dist/server.js.map +1 -1
- package/dist/sources/dexscreener.d.ts +8 -17
- package/dist/sources/dexscreener.js +123 -29
- package/dist/sources/dexscreener.js.map +1 -1
- package/dist/sources/gmgn.d.ts +11 -4
- package/dist/sources/gmgn.js +207 -115
- package/dist/sources/gmgn.js.map +1 -1
- package/dist/sources/solanaRpc.d.ts +4 -4
- package/dist/sources/solanaRpc.js +60 -29
- package/dist/sources/solanaRpc.js.map +1 -1
- package/dist/tools/analyzeToken.d.ts +1 -2
- package/dist/tools/analyzeToken.js +114 -100
- package/dist/tools/analyzeToken.js.map +1 -1
- package/dist/tools/getNewLaunches.d.ts +30 -0
- package/dist/tools/getNewLaunches.js +63 -0
- package/dist/tools/getNewLaunches.js.map +1 -0
- package/dist/tools/getPrice.d.ts +2 -12
- package/dist/tools/getPrice.js +23 -4
- package/dist/tools/getPrice.js.map +1 -1
- package/dist/tools/getTopTraders.d.ts +30 -24
- package/dist/tools/getTopTraders.js +36 -21
- package/dist/tools/getTopTraders.js.map +1 -1
- package/dist/tools/getTrending.d.ts +8 -1
- package/dist/tools/getTrending.js +12 -2
- package/dist/tools/getTrending.js.map +1 -1
- package/dist/tools/searchToken.d.ts +24 -0
- package/dist/tools/searchToken.js +43 -0
- package/dist/tools/searchToken.js.map +1 -0
- package/dist/types/index.d.ts +34 -0
- package/dist/utils/debug.d.ts +7 -0
- package/dist/utils/debug.js +27 -0
- package/dist/utils/debug.js.map +1 -0
- package/package.json +18 -2
package/dist/sources/gmgn.js
CHANGED
|
@@ -1,90 +1,146 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GMGN Data Source
|
|
3
|
-
* Strategy: try direct
|
|
4
|
-
* GMGN uses Cloudflare which blocks Node.js fetch but allows curl and
|
|
3
|
+
* Strategy: try direct API via curl first (fast), fall back to Playwright (slower but reliable).
|
|
4
|
+
* GMGN uses Cloudflare which blocks Node.js fetch but allows curl and real browsers.
|
|
5
5
|
*/
|
|
6
6
|
import { MemoryCache } from '../cache/memoryCache.js';
|
|
7
|
-
import {
|
|
8
|
-
|
|
7
|
+
import { exec } from 'child_process';
|
|
8
|
+
import { debug } from '../utils/debug.js';
|
|
9
|
+
const CACHE_TTL = parseInt(process.env.DEFICLAW_CACHE_TTL ?? '', 10) || 2 * 60 * 1000;
|
|
9
10
|
const BASE_URL = 'https://gmgn.ai/vas/api/v1';
|
|
10
11
|
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 =
|
|
12
|
+
const SCRAPE_TIMEOUT = 40_000;
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
14
|
let browser = null;
|
|
13
15
|
let initializing = false;
|
|
14
16
|
const holderCache = new MemoryCache(CACHE_TTL);
|
|
15
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Try fetching via curl (bypasses Node.js TLS fingerprint detection).
|
|
19
|
+
* Returns parsed data on success, null on any failure.
|
|
20
|
+
* Uses async exec to avoid blocking the event loop.
|
|
21
|
+
*/
|
|
16
22
|
function curlFetch(path) {
|
|
17
|
-
|
|
23
|
+
return new Promise((resolve) => {
|
|
18
24
|
const url = `${BASE_URL}${path}`;
|
|
19
25
|
const cmd = `curl -s --max-time 10 "${url}" -H "User-Agent: ${UA}"`;
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
const start = Date.now();
|
|
27
|
+
exec(cmd, { timeout: 12_000 }, (error, stdout) => {
|
|
28
|
+
if (error) {
|
|
29
|
+
debug(`curl failed for ${path}: ${error.message}`);
|
|
30
|
+
resolve(null);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const out = stdout.toString();
|
|
34
|
+
debug(`curl ${path} completed in ${Date.now() - start}ms (${out.length} bytes)`);
|
|
35
|
+
// Cloudflare sometimes returns HTML instead of JSON
|
|
36
|
+
if (!out || out.startsWith('<!') || out.startsWith('<html')) {
|
|
37
|
+
debug(`curl ${path} returned HTML (Cloudflare block)`);
|
|
38
|
+
resolve(null);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
let json;
|
|
42
|
+
try {
|
|
43
|
+
json = JSON.parse(out);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
debug(`curl ${path} returned malformed JSON`);
|
|
47
|
+
resolve(null);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (json.code !== 0 || !json.data) {
|
|
51
|
+
debug(`curl ${path} returned error code: ${json.code}`);
|
|
52
|
+
resolve(null);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
resolve(json.data);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/** Safely extract a string array of tags from raw GMGN holder data */
|
|
60
|
+
function extractTags(h) {
|
|
61
|
+
const raw = [];
|
|
62
|
+
if (Array.isArray(h.tags))
|
|
63
|
+
raw.push(...h.tags);
|
|
64
|
+
if (h.wallet_tag_v2) {
|
|
65
|
+
const wt = Array.isArray(h.wallet_tag_v2) ? h.wallet_tag_v2 : [h.wallet_tag_v2];
|
|
66
|
+
raw.push(...wt);
|
|
27
67
|
}
|
|
28
|
-
|
|
29
|
-
|
|
68
|
+
if (h.maker_token_tags) {
|
|
69
|
+
const mt = Array.isArray(h.maker_token_tags) ? h.maker_token_tags : [h.maker_token_tags];
|
|
70
|
+
raw.push(...mt);
|
|
30
71
|
}
|
|
72
|
+
const normalized = raw.map(t => {
|
|
73
|
+
if (typeof t === 'string')
|
|
74
|
+
return t.trim();
|
|
75
|
+
if (typeof t === 'object' && t !== null) {
|
|
76
|
+
const obj = t;
|
|
77
|
+
return String(obj.name ?? obj.label ?? '').trim();
|
|
78
|
+
}
|
|
79
|
+
return '';
|
|
80
|
+
}).filter(Boolean);
|
|
81
|
+
return [...new Set(normalized)];
|
|
31
82
|
}
|
|
32
|
-
/** Normalize GMGN holder
|
|
83
|
+
/** Normalize raw GMGN holder array into typed Holder objects */
|
|
33
84
|
function normalizeHolders(rawList) {
|
|
34
85
|
if (!Array.isArray(rawList))
|
|
35
86
|
return [];
|
|
36
|
-
return rawList
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return t.name || t.label || '';
|
|
51
|
-
return String(t).trim();
|
|
52
|
-
}).filter(Boolean))];
|
|
87
|
+
return rawList
|
|
88
|
+
.filter((item) => typeof item === 'object' && item !== null)
|
|
89
|
+
.map(h => {
|
|
90
|
+
const num = (key) => {
|
|
91
|
+
const v = h[key];
|
|
92
|
+
return typeof v === 'number' ? v : 0;
|
|
93
|
+
};
|
|
94
|
+
const str = (key) => {
|
|
95
|
+
const v = h[key];
|
|
96
|
+
return typeof v === 'string' && v.length > 0 ? v : null;
|
|
97
|
+
};
|
|
98
|
+
const unrealizedPnl = num('unrealized_profit') || num('unrealized_pnl');
|
|
99
|
+
const realizedPnl = num('realized_profit') || num('realized_pnl');
|
|
100
|
+
const lastTs = h.last_active_timestamp;
|
|
53
101
|
return {
|
|
54
|
-
address: h.address
|
|
55
|
-
tags,
|
|
56
|
-
twitterHandle:
|
|
57
|
-
twitterName:
|
|
58
|
-
name:
|
|
59
|
-
balance:
|
|
60
|
-
supplyPercent:
|
|
61
|
-
valueUsd:
|
|
62
|
-
avgBuyPrice:
|
|
63
|
-
cost:
|
|
64
|
-
unrealizedPnl
|
|
65
|
-
realizedPnl
|
|
66
|
-
totalPnl:
|
|
67
|
-
profitMultiple:
|
|
68
|
-
buyAmount:
|
|
69
|
-
sellAmount:
|
|
70
|
-
buyTxCount:
|
|
71
|
-
sellTxCount:
|
|
72
|
-
isDeployer: h.is_deployer
|
|
73
|
-
isFreshWallet: h.is_new || h.is_fresh_wallet
|
|
74
|
-
lastActiveAt:
|
|
102
|
+
address: String(h.address ?? ''),
|
|
103
|
+
tags: extractTags(h),
|
|
104
|
+
twitterHandle: str('twitter_username'),
|
|
105
|
+
twitterName: str('twitter_name'),
|
|
106
|
+
name: str('name'),
|
|
107
|
+
balance: num('balance') || num('amount_cur'),
|
|
108
|
+
supplyPercent: num('amount_percentage'),
|
|
109
|
+
valueUsd: num('usd_value'),
|
|
110
|
+
avgBuyPrice: num('avg_cost'),
|
|
111
|
+
cost: num('cost_cur') || num('cost') || num('total_cost'),
|
|
112
|
+
unrealizedPnl,
|
|
113
|
+
realizedPnl,
|
|
114
|
+
totalPnl: unrealizedPnl + realizedPnl,
|
|
115
|
+
profitMultiple: num('profit_change'),
|
|
116
|
+
buyAmount: num('buy_amount_cur') || num('accu_amount'),
|
|
117
|
+
sellAmount: num('sell_amount_cur') || num('current_sell_amount'),
|
|
118
|
+
buyTxCount: num('buy_tx_count_cur'),
|
|
119
|
+
sellTxCount: num('sell_tx_count_cur'),
|
|
120
|
+
isDeployer: h.is_deployer === true,
|
|
121
|
+
isFreshWallet: h.is_new === true || h.is_fresh_wallet === true,
|
|
122
|
+
lastActiveAt: typeof lastTs === 'number' && lastTs > 0
|
|
123
|
+
? new Date(lastTs * 1000).toISOString()
|
|
124
|
+
: null,
|
|
75
125
|
};
|
|
76
|
-
})
|
|
126
|
+
})
|
|
127
|
+
.filter(h => h.address.length > 10);
|
|
77
128
|
}
|
|
78
|
-
/**
|
|
129
|
+
/** Launch or reconnect the Playwright browser instance */
|
|
79
130
|
async function ensureBrowser() {
|
|
80
131
|
if (browser?.isConnected?.())
|
|
81
132
|
return;
|
|
82
133
|
browser = null;
|
|
83
134
|
if (initializing) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
135
|
+
// Wait for another caller to finish initializing
|
|
136
|
+
await new Promise(resolve => {
|
|
137
|
+
const iv = setInterval(() => {
|
|
138
|
+
if (!initializing) {
|
|
139
|
+
clearInterval(iv);
|
|
140
|
+
resolve();
|
|
141
|
+
}
|
|
142
|
+
}, 200);
|
|
143
|
+
});
|
|
88
144
|
return;
|
|
89
145
|
}
|
|
90
146
|
initializing = true;
|
|
@@ -95,74 +151,99 @@ async function ensureBrowser() {
|
|
|
95
151
|
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu'],
|
|
96
152
|
});
|
|
97
153
|
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
throw new Error(`Failed to launch Playwright browser: ${err instanceof Error ? err.message : String(err)}. ` +
|
|
156
|
+
'Install with: npm install playwright && npx playwright install chromium');
|
|
157
|
+
}
|
|
98
158
|
finally {
|
|
99
159
|
initializing = false;
|
|
100
160
|
}
|
|
101
161
|
}
|
|
162
|
+
/** Playwright fallback: navigate to GMGN token page and intercept holder API responses */
|
|
102
163
|
async function playwrightFetch(address) {
|
|
103
164
|
await ensureBrowser();
|
|
104
|
-
|
|
165
|
+
if (!browser)
|
|
166
|
+
throw new Error('Playwright browser not available');
|
|
167
|
+
const ctx = await browser.newContext({
|
|
168
|
+
userAgent: UA,
|
|
169
|
+
viewport: { width: 1280, height: 720 },
|
|
170
|
+
});
|
|
105
171
|
const page = await ctx.newPage();
|
|
106
172
|
try {
|
|
107
|
-
return await new Promise(
|
|
108
|
-
const timeout = setTimeout(() => reject(new Error('GMGN scrape timeout')), SCRAPE_TIMEOUT);
|
|
109
|
-
|
|
173
|
+
return await new Promise((resolve, reject) => {
|
|
174
|
+
const timeout = setTimeout(() => reject(new Error('GMGN scrape timeout (40s)')), SCRAPE_TIMEOUT);
|
|
175
|
+
const collected = [];
|
|
110
176
|
let resolved = false;
|
|
177
|
+
const finish = (items) => {
|
|
178
|
+
if (resolved)
|
|
179
|
+
return;
|
|
180
|
+
clearTimeout(timeout);
|
|
181
|
+
resolved = true;
|
|
182
|
+
resolve(items);
|
|
183
|
+
};
|
|
111
184
|
page.on('response', async (response) => {
|
|
112
185
|
if (resolved)
|
|
113
186
|
return;
|
|
114
187
|
const url = response.url();
|
|
115
|
-
if (url.includes('/token_holders/sol/')
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
188
|
+
if (!url.includes('/token_holders/sol/') && !url.includes('/top_holders/sol/'))
|
|
189
|
+
return;
|
|
190
|
+
try {
|
|
191
|
+
const json = await response.json();
|
|
192
|
+
const data = json.data;
|
|
193
|
+
const items = Array.isArray(data) ? data
|
|
194
|
+
: (data && typeof data === 'object'
|
|
195
|
+
? (Array.isArray(data.holders) ? data.holders
|
|
196
|
+
: Array.isArray(data.list) ? data.list
|
|
197
|
+
: [])
|
|
198
|
+
: []);
|
|
199
|
+
if (Array.isArray(items) && items.length > 0) {
|
|
200
|
+
collected.push(...items);
|
|
201
|
+
if (collected.length >= 10)
|
|
202
|
+
finish(collected.slice(0, 150));
|
|
127
203
|
}
|
|
128
|
-
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// Response wasn't valid JSON, skip
|
|
129
207
|
}
|
|
130
208
|
});
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
209
|
+
(async () => {
|
|
210
|
+
try {
|
|
211
|
+
await page.goto(`https://gmgn.ai/sol/token/${address}`, {
|
|
212
|
+
waitUntil: 'domcontentloaded',
|
|
213
|
+
timeout: 20_000,
|
|
214
|
+
});
|
|
215
|
+
await page.waitForTimeout(3000);
|
|
216
|
+
// Try clicking the Holders tab
|
|
217
|
+
for (const sel of ['button:has-text("Holder")', '[role="tab"]:has-text("Holder")', 'text=Holders']) {
|
|
218
|
+
try {
|
|
219
|
+
const tab = await page.$(sel);
|
|
220
|
+
if (tab) {
|
|
221
|
+
await tab.click();
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
continue;
|
|
140
227
|
}
|
|
141
228
|
}
|
|
142
|
-
|
|
143
|
-
|
|
229
|
+
await page.waitForTimeout(5000);
|
|
230
|
+
if (!resolved && collected.length > 0)
|
|
231
|
+
finish(collected.slice(0, 150));
|
|
232
|
+
if (!resolved) {
|
|
233
|
+
await page.waitForTimeout(5000);
|
|
234
|
+
if (collected.length > 0)
|
|
235
|
+
finish(collected.slice(0, 150));
|
|
144
236
|
}
|
|
237
|
+
if (!resolved)
|
|
238
|
+
reject(new Error('GMGN returned no holder data via Playwright'));
|
|
145
239
|
}
|
|
146
|
-
|
|
147
|
-
|
|
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) {
|
|
240
|
+
catch (e) {
|
|
241
|
+
if (!resolved) {
|
|
155
242
|
clearTimeout(timeout);
|
|
156
|
-
|
|
243
|
+
reject(e instanceof Error ? e : new Error(String(e)));
|
|
157
244
|
}
|
|
158
245
|
}
|
|
159
|
-
}
|
|
160
|
-
catch (e) {
|
|
161
|
-
if (!resolved) {
|
|
162
|
-
clearTimeout(timeout);
|
|
163
|
-
reject(e);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
246
|
+
})();
|
|
166
247
|
});
|
|
167
248
|
}
|
|
168
249
|
finally {
|
|
@@ -170,37 +251,48 @@ async function playwrightFetch(address) {
|
|
|
170
251
|
await ctx.close().catch(() => { });
|
|
171
252
|
}
|
|
172
253
|
}
|
|
254
|
+
/** Returns true — curl fallback is always available, Playwright is optional */
|
|
173
255
|
export async function isPlaywrightAvailable() {
|
|
174
|
-
return true;
|
|
256
|
+
return true;
|
|
175
257
|
}
|
|
176
|
-
/**
|
|
258
|
+
/**
|
|
259
|
+
* Get holders for a Solana token.
|
|
260
|
+
* Strategy: try curl first (fast, ~1s), fall back to Playwright (~11s).
|
|
261
|
+
*/
|
|
177
262
|
export async function getHolders(address) {
|
|
263
|
+
if (!address || address.trim().length === 0) {
|
|
264
|
+
throw new Error('Token address is required for holder analysis');
|
|
265
|
+
}
|
|
178
266
|
const cached = holderCache.get(address);
|
|
179
267
|
if (cached)
|
|
180
268
|
return cached;
|
|
181
|
-
// Strategy 1: curl (fast, ~1s)
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
269
|
+
// Strategy 1: curl (fast, ~1s, async to avoid blocking event loop)
|
|
270
|
+
debug(`Fetching holders for ${address} via curl`);
|
|
271
|
+
const curlData = await curlFetch(`/token_holders/sol/${address}?limit=100`);
|
|
272
|
+
if (curlData && Array.isArray(curlData.list) &&
|
|
273
|
+
curlData.list.length > 0) {
|
|
274
|
+
// Fetch KOL holders in parallel (now truly async)
|
|
275
|
+
const kolData = await curlFetch(`/token_holders/sol/${address}?tag=renowned&limit=50`);
|
|
185
276
|
const holders = normalizeHolders(curlData.list);
|
|
186
|
-
const kolHolders = normalizeHolders(kolData
|
|
277
|
+
const kolHolders = normalizeHolders(kolData ? kolData.list : []);
|
|
187
278
|
const result = { holders, kolHolders };
|
|
188
279
|
holderCache.set(address, result);
|
|
280
|
+
debug(`Holders for ${address}: ${holders.length} holders, ${kolHolders.length} KOLs (via curl)`);
|
|
189
281
|
return result;
|
|
190
282
|
}
|
|
191
283
|
// Strategy 2: Playwright (slower ~11s, but bypasses Cloudflare)
|
|
192
284
|
try {
|
|
193
285
|
const rawHolders = await playwrightFetch(address);
|
|
194
286
|
const holders = normalizeHolders(rawHolders);
|
|
195
|
-
// KOL fetch via page.evaluate inside Playwright context
|
|
196
287
|
const result = { holders, kolHolders: [] };
|
|
197
288
|
holderCache.set(address, result);
|
|
198
289
|
return result;
|
|
199
290
|
}
|
|
200
291
|
catch (err) {
|
|
201
|
-
throw new Error(`GMGN fetch failed: ${err.message}`);
|
|
292
|
+
throw new Error(`GMGN fetch failed for ${address}: ${err instanceof Error ? err.message : String(err)}`);
|
|
202
293
|
}
|
|
203
294
|
}
|
|
295
|
+
/** Gracefully shut down the Playwright browser */
|
|
204
296
|
export async function shutdown() {
|
|
205
297
|
if (browser) {
|
|
206
298
|
await browser.close().catch(() => { });
|
package/dist/sources/gmgn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gmgn.js","sourceRoot":"","sources":["../../src/sources/gmgn.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gmgn.js","sourceRoot":"","sources":["../../src/sources/gmgn.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Solana RPC — Token security checks (FREE, no auth)
|
|
3
|
-
* Checks mint authority, freeze authority, supply
|
|
2
|
+
* Solana RPC — Token security checks (FREE, no auth needed).
|
|
3
|
+
* Checks mint authority, freeze authority, supply via getAccountInfo.
|
|
4
4
|
*/
|
|
5
5
|
export interface TokenSecurity {
|
|
6
6
|
mintAuthority: 'revoked' | 'active';
|
|
@@ -8,7 +8,7 @@ export interface TokenSecurity {
|
|
|
8
8
|
supply: number;
|
|
9
9
|
decimals: number;
|
|
10
10
|
}
|
|
11
|
-
/** Check token mint/freeze authority */
|
|
11
|
+
/** Check token mint/freeze authority. Returns null if account not found or not a token mint. */
|
|
12
12
|
export declare function getTokenSecurity(mintAddress: string): Promise<TokenSecurity | null>;
|
|
13
|
-
/** Check if an address is likely an LP pool (
|
|
13
|
+
/** Check if an address is likely an LP pool (owned by a known AMM program) */
|
|
14
14
|
export declare function isLikelyLpPool(address: string): Promise<boolean>;
|
|
@@ -1,57 +1,88 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Solana RPC — Token security checks (FREE, no auth)
|
|
3
|
-
* Checks mint authority, freeze authority, supply
|
|
2
|
+
* Solana RPC — Token security checks (FREE, no auth needed).
|
|
3
|
+
* Checks mint authority, freeze authority, supply via getAccountInfo.
|
|
4
4
|
*/
|
|
5
5
|
const RPC_URL = process.env.SOLANA_RPC_URL || 'https://api.mainnet-beta.solana.com';
|
|
6
|
+
/** Make a JSON-RPC call to the Solana cluster with timeout */
|
|
6
7
|
async function rpcCall(method, params) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
let res;
|
|
9
|
+
try {
|
|
10
|
+
res = await fetch(RPC_URL, {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: { 'Content-Type': 'application/json' },
|
|
13
|
+
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
|
|
14
|
+
signal: AbortSignal.timeout(10_000),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
19
|
+
throw new Error(`Solana RPC request failed (${method}): ${msg}`);
|
|
20
|
+
}
|
|
21
|
+
if (!res.ok) {
|
|
22
|
+
throw new Error(`Solana RPC HTTP ${res.status}: ${res.statusText}`);
|
|
23
|
+
}
|
|
24
|
+
let json;
|
|
25
|
+
try {
|
|
26
|
+
json = await res.json();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw new Error(`Solana RPC returned invalid JSON for ${method}`);
|
|
30
|
+
}
|
|
31
|
+
if (json.error) {
|
|
32
|
+
throw new Error(`Solana RPC error (${json.error.code}): ${json.error.message}`);
|
|
33
|
+
}
|
|
34
|
+
return json.result ?? null;
|
|
17
35
|
}
|
|
18
|
-
/** Check token mint/freeze authority */
|
|
36
|
+
/** Check token mint/freeze authority. Returns null if account not found or not a token mint. */
|
|
19
37
|
export async function getTokenSecurity(mintAddress) {
|
|
38
|
+
if (!mintAddress || mintAddress.trim().length === 0)
|
|
39
|
+
return null;
|
|
20
40
|
try {
|
|
21
41
|
const result = await rpcCall('getAccountInfo', [
|
|
22
42
|
mintAddress,
|
|
23
43
|
{ encoding: 'jsonParsed' },
|
|
24
44
|
]);
|
|
25
|
-
|
|
45
|
+
// Navigate the nested structure safely
|
|
46
|
+
const value = result?.value;
|
|
47
|
+
const data = value?.data;
|
|
48
|
+
const parsed = data?.parsed;
|
|
49
|
+
const info = parsed?.info;
|
|
50
|
+
if (!info)
|
|
26
51
|
return null;
|
|
27
|
-
const
|
|
52
|
+
const decimals = typeof info.decimals === 'number' ? info.decimals : 0;
|
|
53
|
+
const supplyStr = typeof info.supply === 'string' ? info.supply : '0';
|
|
28
54
|
return {
|
|
29
55
|
mintAuthority: info.mintAuthority ? 'active' : 'revoked',
|
|
30
56
|
freezeAuthority: info.freezeAuthority ? 'active' : 'revoked',
|
|
31
|
-
supply: parseFloat(
|
|
32
|
-
decimals
|
|
57
|
+
supply: parseFloat(supplyStr) / Math.pow(10, decimals),
|
|
58
|
+
decimals,
|
|
33
59
|
};
|
|
34
60
|
}
|
|
35
61
|
catch {
|
|
62
|
+
// Security check is non-critical; return null on failure
|
|
36
63
|
return null;
|
|
37
64
|
}
|
|
38
65
|
}
|
|
39
|
-
/**
|
|
66
|
+
/** Known LP/AMM program IDs on Solana */
|
|
67
|
+
const LP_PROGRAMS = new Set([
|
|
68
|
+
'675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8', // Raydium AMM
|
|
69
|
+
'CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK', // Raydium CLMM
|
|
70
|
+
'whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc', // Orca Whirlpool
|
|
71
|
+
'LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo', // Meteora DLMM
|
|
72
|
+
'6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P', // PumpFun
|
|
73
|
+
'PSwapMdSai8tjrEXcxFeQth87xC4rRsa4VA5mhGhXkP', // PumpSwap
|
|
74
|
+
]);
|
|
75
|
+
/** Check if an address is likely an LP pool (owned by a known AMM program) */
|
|
40
76
|
export async function isLikelyLpPool(address) {
|
|
77
|
+
if (!address || address.trim().length === 0)
|
|
78
|
+
return false;
|
|
41
79
|
try {
|
|
42
80
|
const result = await rpcCall('getAccountInfo', [address, { encoding: 'base64' }]);
|
|
43
|
-
|
|
81
|
+
const value = result?.value;
|
|
82
|
+
if (!value)
|
|
44
83
|
return false;
|
|
45
|
-
const owner =
|
|
46
|
-
|
|
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);
|
|
84
|
+
const owner = value.owner;
|
|
85
|
+
return typeof owner === 'string' && LP_PROGRAMS.has(owner);
|
|
55
86
|
}
|
|
56
87
|
catch {
|
|
57
88
|
return false;
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"solanaRpc.js","sourceRoot":"","sources":["../../src/sources/solanaRpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type { TokenAnalysis } from '../types/index.js';
|
|
2
1
|
export declare function handleAnalyzeToken(args: {
|
|
3
2
|
address: string;
|
|
4
3
|
chain?: string;
|
|
5
4
|
include_holders?: boolean;
|
|
6
|
-
}): Promise<
|
|
5
|
+
}): Promise<Record<string, unknown> | {
|
|
7
6
|
error: string;
|
|
8
7
|
}>;
|