@0xprotovox/deficlaw 0.4.0 → 0.5.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 +62 -7
- package/dist/server.js +50 -0
- package/dist/server.js.map +1 -1
- package/dist/sources/jupiter.d.ts +37 -0
- package/dist/sources/jupiter.js +82 -0
- package/dist/sources/jupiter.js.map +1 -0
- package/dist/tools/compareTokens.d.ts +49 -0
- package/dist/tools/compareTokens.js +160 -0
- package/dist/tools/compareTokens.js.map +1 -0
- package/dist/tools/estimateSlippage.d.ts +22 -0
- package/dist/tools/estimateSlippage.js +69 -0
- package/dist/tools/estimateSlippage.js.map +1 -0
- package/dist/tools/getTokenSecurity.d.ts +20 -0
- package/dist/tools/getTokenSecurity.js +73 -0
- package/dist/tools/getTokenSecurity.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -51,17 +51,72 @@ npm install && npm run build
|
|
|
51
51
|
claude mcp add defi -- node /path/to/deficlaw/dist/index.js
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
That's it. No API keys, no config files, no accounts needed.
|
|
55
55
|
|
|
56
|
+
## Quick Start Guide
|
|
57
|
+
|
|
58
|
+
Once installed, open Claude Code and try these commands. Just type naturally:
|
|
59
|
+
|
|
60
|
+
### Check a token price (fastest, ~300ms)
|
|
61
|
+
```
|
|
62
|
+
> what's the price of BONK?
|
|
63
|
+
> price of JUP
|
|
64
|
+
> how much is SOL right now?
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Quick token scan (~350ms, no holder data)
|
|
68
|
+
```
|
|
69
|
+
> quick analyze So11111...
|
|
70
|
+
> give me a quick look at this token: 3oQw...pump
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Full deep analysis (~1.5s, with holders + risk + verdict)
|
|
74
|
+
```
|
|
75
|
+
> analyze token 3oQwNvAfZMuPWjVPC12ukY7RPA9JiGwLod6Pr4Lkpump
|
|
76
|
+
> deep analyze JUP token
|
|
77
|
+
> is this token safe? EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Compact analysis (small response, top 5 holders only)
|
|
81
|
+
```
|
|
82
|
+
> compact analyze 3oQw...pump
|
|
83
|
+
> give me a brief analysis of BONK
|
|
56
84
|
```
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
>
|
|
61
|
-
>
|
|
62
|
-
>
|
|
85
|
+
|
|
86
|
+
### Search tokens by name
|
|
87
|
+
```
|
|
88
|
+
> search for BONK
|
|
89
|
+
> find tokens named "dog"
|
|
90
|
+
> search Jupiter token
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Trending tokens
|
|
94
|
+
```
|
|
95
|
+
> what's trending on solana?
|
|
96
|
+
> show me trending tokens on ethereum
|
|
97
|
+
> top tokens on base right now
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### New launches
|
|
101
|
+
```
|
|
102
|
+
> show new launches on solana in the last 30 minutes
|
|
103
|
+
> any new tokens launched in the last hour?
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Who made money?
|
|
107
|
+
```
|
|
108
|
+
> who profited on this token: 3oQw...pump?
|
|
109
|
+
> show me top traders on JUP
|
|
110
|
+
> who lost money on BONK?
|
|
63
111
|
```
|
|
64
112
|
|
|
113
|
+
### Pro tips
|
|
114
|
+
- Use **quick mode** for fast scans when you just need price + risk
|
|
115
|
+
- Use **compact mode** when you want holder data but don't need the full 20-holder table
|
|
116
|
+
- **Paste any Solana token address** and ask "is this safe?" for instant security + risk check
|
|
117
|
+
- Chain commands: "analyze this token and tell me if I should buy it"
|
|
118
|
+
- Works with **any chain** for prices: solana, ethereum, base, bsc, arbitrum
|
|
119
|
+
|
|
65
120
|
## Tools
|
|
66
121
|
|
|
67
122
|
### `analyze_token`
|
package/dist/server.js
CHANGED
|
@@ -12,6 +12,9 @@ import { handleGetTrending } from './tools/getTrending.js';
|
|
|
12
12
|
import { handleGetTopTraders } from './tools/getTopTraders.js';
|
|
13
13
|
import { handleSearchToken } from './tools/searchToken.js';
|
|
14
14
|
import { handleGetNewLaunches } from './tools/getNewLaunches.js';
|
|
15
|
+
import { handleEstimateSlippage } from './tools/estimateSlippage.js';
|
|
16
|
+
import { handleCompareTokens } from './tools/compareTokens.js';
|
|
17
|
+
import { handleGetTokenSecurity } from './tools/getTokenSecurity.js';
|
|
15
18
|
import { formatAnalysis } from './analysis/formatOutput.js';
|
|
16
19
|
/** Build a compact response with only essential fields (3x smaller) */
|
|
17
20
|
function buildCompactResult(result) {
|
|
@@ -189,6 +192,53 @@ export function createServer() {
|
|
|
189
192
|
return { content: [{ type: 'text', text: JSON.stringify({ error: `New launches fetch failed: ${message}` }) }], isError: true };
|
|
190
193
|
}
|
|
191
194
|
});
|
|
195
|
+
// ── estimate_slippage ──
|
|
196
|
+
server.tool('estimate_slippage', 'Estimate buy slippage for a Solana token at $50, $100, $500, $1000. Uses Jupiter quotes.', {
|
|
197
|
+
address: z.string().min(1).describe('Solana token mint address'),
|
|
198
|
+
}, async (args) => {
|
|
199
|
+
try {
|
|
200
|
+
const result = await handleEstimateSlippage(args);
|
|
201
|
+
if ('error' in result)
|
|
202
|
+
return { content: [{ type: 'text', text: JSON.stringify(result) }], isError: true };
|
|
203
|
+
return { content: [{ type: 'text', text: result.summary }] };
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
207
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: `Slippage estimation failed: ${message}` }) }], isError: true };
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// ── compare_tokens ──
|
|
211
|
+
server.tool('compare_tokens', 'Compare two tokens side by side: price, mcap, volume, liquidity, age, holders.', {
|
|
212
|
+
address_a: z.string().min(1).describe('First token address'),
|
|
213
|
+
address_b: z.string().min(1).describe('Second token address'),
|
|
214
|
+
chain: z.string().default('solana').describe('Blockchain'),
|
|
215
|
+
}, async (args) => {
|
|
216
|
+
try {
|
|
217
|
+
const result = await handleCompareTokens(args);
|
|
218
|
+
if ('error' in result)
|
|
219
|
+
return { content: [{ type: 'text', text: JSON.stringify(result) }], isError: true };
|
|
220
|
+
return { content: [{ type: 'text', text: result.summary }] };
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
224
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: `Comparison failed: ${message}` }) }], isError: true };
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
// ── get_token_security ──
|
|
228
|
+
server.tool('get_token_security', 'Quick security check: mint authority, freeze authority, supply. Solana only. "Is this token safe?"', {
|
|
229
|
+
address: z.string().min(1).describe('Solana token mint address'),
|
|
230
|
+
}, async (args) => {
|
|
231
|
+
try {
|
|
232
|
+
const result = await handleGetTokenSecurity(args);
|
|
233
|
+
if ('error' in result)
|
|
234
|
+
return { content: [{ type: 'text', text: JSON.stringify(result) }], isError: true };
|
|
235
|
+
return { content: [{ type: 'text', text: result.summary }] };
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
239
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: `Security check failed: ${message}` }) }], isError: true };
|
|
240
|
+
}
|
|
241
|
+
});
|
|
192
242
|
return server;
|
|
193
243
|
}
|
|
194
244
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
declare const SOL_MINT = "So11111111111111111111111111111111111112";
|
|
2
|
+
declare const SOL_DECIMALS = 9;
|
|
3
|
+
export interface JupiterQuote {
|
|
4
|
+
inputMint: string;
|
|
5
|
+
outputMint: string;
|
|
6
|
+
inAmount: string;
|
|
7
|
+
outAmount: string;
|
|
8
|
+
otherAmountThreshold: string;
|
|
9
|
+
priceImpactPct: string;
|
|
10
|
+
slippageBps: number;
|
|
11
|
+
routePlan: {
|
|
12
|
+
swapInfo: {
|
|
13
|
+
ammKey: string;
|
|
14
|
+
label: string;
|
|
15
|
+
};
|
|
16
|
+
}[];
|
|
17
|
+
}
|
|
18
|
+
export interface SlippageEstimate {
|
|
19
|
+
buyAmountUsd: number;
|
|
20
|
+
inputLamports: string;
|
|
21
|
+
estimatedOutput: number;
|
|
22
|
+
priceImpactPct: number;
|
|
23
|
+
effectivePrice: number;
|
|
24
|
+
slippageBps: number;
|
|
25
|
+
route: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get a Jupiter quote for buying a token with SOL.
|
|
29
|
+
* amount is in lamports (1 SOL = 1e9 lamports).
|
|
30
|
+
*/
|
|
31
|
+
export declare function getQuote(outputMint: string, amountLamports: string, slippageBps?: number): Promise<JupiterQuote | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Estimate slippage for multiple buy sizes.
|
|
34
|
+
* Returns quotes for $50, $100, $500, $1000 buys.
|
|
35
|
+
*/
|
|
36
|
+
export declare function estimateSlippage(tokenMint: string, solPriceUsd: number, tokenDecimals: number): Promise<SlippageEstimate[]>;
|
|
37
|
+
export { SOL_MINT, SOL_DECIMALS };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jupiter Quote API Client
|
|
3
|
+
* Free API, no auth needed. Used for slippage estimation on Solana.
|
|
4
|
+
* https://station.jup.ag/docs/apis/swap-api
|
|
5
|
+
*/
|
|
6
|
+
import { MemoryCache } from '../cache/memoryCache.js';
|
|
7
|
+
import { debug } from '../utils/debug.js';
|
|
8
|
+
const BASE_URL = 'https://api.jup.ag/quote/v1';
|
|
9
|
+
const CACHE_TTL = 30_000; // 30s cache for quotes
|
|
10
|
+
const SOL_MINT = 'So11111111111111111111111111111111111112';
|
|
11
|
+
const SOL_DECIMALS = 9;
|
|
12
|
+
const quoteCache = new MemoryCache(CACHE_TTL);
|
|
13
|
+
/**
|
|
14
|
+
* Get a Jupiter quote for buying a token with SOL.
|
|
15
|
+
* amount is in lamports (1 SOL = 1e9 lamports).
|
|
16
|
+
*/
|
|
17
|
+
export async function getQuote(outputMint, amountLamports, slippageBps = 50) {
|
|
18
|
+
const cacheKey = `jup:${outputMint}:${amountLamports}:${slippageBps}`;
|
|
19
|
+
const cached = quoteCache.get(cacheKey);
|
|
20
|
+
if (cached) {
|
|
21
|
+
debug(`jupiter quote cache HIT: ${cacheKey}`);
|
|
22
|
+
return cached;
|
|
23
|
+
}
|
|
24
|
+
const url = `${BASE_URL}?inputMint=${SOL_MINT}&outputMint=${outputMint}&amount=${amountLamports}&slippageBps=${slippageBps}`;
|
|
25
|
+
debug(`Fetching Jupiter quote: ${url}`);
|
|
26
|
+
try {
|
|
27
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(8000) });
|
|
28
|
+
if (!res.ok) {
|
|
29
|
+
debug(`Jupiter HTTP ${res.status}: ${res.statusText}`);
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const data = await res.json();
|
|
33
|
+
if (!data.outAmount)
|
|
34
|
+
return null;
|
|
35
|
+
quoteCache.set(cacheKey, data);
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
debug(`Jupiter quote failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Estimate slippage for multiple buy sizes.
|
|
45
|
+
* Returns quotes for $50, $100, $500, $1000 buys.
|
|
46
|
+
*/
|
|
47
|
+
export async function estimateSlippage(tokenMint, solPriceUsd, tokenDecimals) {
|
|
48
|
+
const buyAmounts = [50, 100, 500, 1000]; // USD amounts
|
|
49
|
+
const results = [];
|
|
50
|
+
// Convert USD amounts to SOL lamports
|
|
51
|
+
const quotes = await Promise.all(buyAmounts.map(async (usdAmount) => {
|
|
52
|
+
const solAmount = usdAmount / solPriceUsd;
|
|
53
|
+
const lamports = Math.round(solAmount * 1e9).toString();
|
|
54
|
+
const quote = await getQuote(tokenMint, lamports);
|
|
55
|
+
if (!quote)
|
|
56
|
+
return null;
|
|
57
|
+
const outAmount = parseFloat(quote.outAmount) / Math.pow(10, tokenDecimals);
|
|
58
|
+
const priceImpact = parseFloat(quote.priceImpactPct) || 0;
|
|
59
|
+
const effectivePrice = outAmount > 0 ? usdAmount / outAmount : 0;
|
|
60
|
+
// Determine route label
|
|
61
|
+
const routeLabels = quote.routePlan
|
|
62
|
+
?.map(r => r.swapInfo?.label)
|
|
63
|
+
.filter(Boolean) ?? [];
|
|
64
|
+
const route = routeLabels.length > 0 ? routeLabels.join(' -> ') : 'unknown';
|
|
65
|
+
return {
|
|
66
|
+
buyAmountUsd: usdAmount,
|
|
67
|
+
inputLamports: lamports,
|
|
68
|
+
estimatedOutput: outAmount,
|
|
69
|
+
priceImpactPct: Math.round(priceImpact * 10000) / 10000,
|
|
70
|
+
effectivePrice,
|
|
71
|
+
slippageBps: quote.slippageBps,
|
|
72
|
+
route,
|
|
73
|
+
};
|
|
74
|
+
}));
|
|
75
|
+
for (const q of quotes) {
|
|
76
|
+
if (q)
|
|
77
|
+
results.push(q);
|
|
78
|
+
}
|
|
79
|
+
return results;
|
|
80
|
+
}
|
|
81
|
+
export { SOL_MINT, SOL_DECIMALS };
|
|
82
|
+
//# sourceMappingURL=jupiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jupiter.js","sourceRoot":"","sources":["../../src/sources/jupiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
interface TokenSnapshot {
|
|
2
|
+
address: string;
|
|
3
|
+
name: string;
|
|
4
|
+
symbol: string;
|
|
5
|
+
chain: string;
|
|
6
|
+
priceUsd: number;
|
|
7
|
+
marketCap: number;
|
|
8
|
+
volume24h: number;
|
|
9
|
+
volume1h: number;
|
|
10
|
+
liquidity: number;
|
|
11
|
+
priceChange1h: number;
|
|
12
|
+
priceChange24h: number;
|
|
13
|
+
age: string;
|
|
14
|
+
ageMs: number;
|
|
15
|
+
dex: string;
|
|
16
|
+
holderCount?: number;
|
|
17
|
+
top10Concentration?: number;
|
|
18
|
+
}
|
|
19
|
+
interface ComparisonResult {
|
|
20
|
+
tokenA: TokenSnapshot;
|
|
21
|
+
tokenB: TokenSnapshot;
|
|
22
|
+
comparison: {
|
|
23
|
+
higherMcap: string;
|
|
24
|
+
higherVolume: string;
|
|
25
|
+
higherLiquidity: string;
|
|
26
|
+
betterPrice24h: string;
|
|
27
|
+
older: string;
|
|
28
|
+
mcapRatio: string;
|
|
29
|
+
volumeRatio: string;
|
|
30
|
+
liquidityRatio: string;
|
|
31
|
+
};
|
|
32
|
+
holderComparison?: {
|
|
33
|
+
tokenAHolders: number;
|
|
34
|
+
tokenBHolders: number;
|
|
35
|
+
tokenATop10Pct: number;
|
|
36
|
+
tokenBTop10Pct: number;
|
|
37
|
+
moreDistributed: string;
|
|
38
|
+
};
|
|
39
|
+
summary: string;
|
|
40
|
+
fetchedAt: string;
|
|
41
|
+
}
|
|
42
|
+
export declare function handleCompareTokens(args: {
|
|
43
|
+
address_a: string;
|
|
44
|
+
address_b: string;
|
|
45
|
+
chain: string;
|
|
46
|
+
}): Promise<ComparisonResult | {
|
|
47
|
+
error: string;
|
|
48
|
+
}>;
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* compare_tokens tool — Side-by-side token comparison.
|
|
3
|
+
* Fetches both tokens from DexScreener, compares price, mcap, volume, liquidity, age.
|
|
4
|
+
* If both are Solana, includes holder comparison from GMGN.
|
|
5
|
+
*/
|
|
6
|
+
import { getTokenPair } from '../sources/dexscreener.js';
|
|
7
|
+
import * as gmgn from '../sources/gmgn.js';
|
|
8
|
+
import { debug } from '../utils/debug.js';
|
|
9
|
+
function computeAge(pairCreatedAt) {
|
|
10
|
+
if (!pairCreatedAt)
|
|
11
|
+
return { ageStr: 'unknown', ageMs: 0 };
|
|
12
|
+
const ageMs = Date.now() - pairCreatedAt;
|
|
13
|
+
const ageDays = ageMs / (1000 * 60 * 60 * 24);
|
|
14
|
+
const ageStr = ageDays < 1 / 24 ? `${Math.round(ageDays * 24 * 60)}m`
|
|
15
|
+
: ageDays < 1 ? `${Math.round(ageDays * 24)}h`
|
|
16
|
+
: ageDays < 30 ? `${Math.round(ageDays)}d`
|
|
17
|
+
: ageDays < 365 ? `${Math.round(ageDays / 30)}mo`
|
|
18
|
+
: `${(ageDays / 365).toFixed(1)}y`;
|
|
19
|
+
return { ageStr, ageMs };
|
|
20
|
+
}
|
|
21
|
+
function fmt(n) {
|
|
22
|
+
if (n === 0)
|
|
23
|
+
return '$0';
|
|
24
|
+
if (Math.abs(n) >= 1_000_000)
|
|
25
|
+
return `$${(n / 1_000_000).toFixed(2)}M`;
|
|
26
|
+
if (Math.abs(n) >= 1_000)
|
|
27
|
+
return `$${(n / 1_000).toFixed(1)}K`;
|
|
28
|
+
return `$${n.toFixed(2)}`;
|
|
29
|
+
}
|
|
30
|
+
function ratio(a, b) {
|
|
31
|
+
if (b === 0)
|
|
32
|
+
return a > 0 ? 'inf' : '0';
|
|
33
|
+
return `${(a / b).toFixed(1)}x`;
|
|
34
|
+
}
|
|
35
|
+
export async function handleCompareTokens(args) {
|
|
36
|
+
const chain = args.chain || 'solana';
|
|
37
|
+
if (!args.address_a || !args.address_b) {
|
|
38
|
+
return { error: 'Both token addresses are required for comparison.' };
|
|
39
|
+
}
|
|
40
|
+
debug(`Comparing tokens: ${args.address_a} vs ${args.address_b} on ${chain}`);
|
|
41
|
+
// Fetch both pairs in parallel
|
|
42
|
+
const [pairA, pairB] = await Promise.all([
|
|
43
|
+
getTokenPair(args.address_a, chain),
|
|
44
|
+
getTokenPair(args.address_b, chain),
|
|
45
|
+
]);
|
|
46
|
+
if (!pairA) {
|
|
47
|
+
return { error: `Token A not found on DexScreener: ${args.address_a}. Check the address or try searching by name with search_token.` };
|
|
48
|
+
}
|
|
49
|
+
if (!pairB) {
|
|
50
|
+
return { error: `Token B not found on DexScreener: ${args.address_b}. Check the address or try searching by name with search_token.` };
|
|
51
|
+
}
|
|
52
|
+
const ageA = computeAge(pairA.pairCreatedAt);
|
|
53
|
+
const ageB = computeAge(pairB.pairCreatedAt);
|
|
54
|
+
const tokenA = {
|
|
55
|
+
address: pairA.baseToken.address,
|
|
56
|
+
name: pairA.baseToken.name,
|
|
57
|
+
symbol: pairA.baseToken.symbol,
|
|
58
|
+
chain: pairA.chainId,
|
|
59
|
+
priceUsd: parseFloat(pairA.priceUsd) || 0,
|
|
60
|
+
marketCap: pairA.marketCap ?? 0,
|
|
61
|
+
volume24h: pairA.volume?.h24 ?? 0,
|
|
62
|
+
volume1h: pairA.volume?.h1 ?? 0,
|
|
63
|
+
liquidity: pairA.liquidity?.usd ?? 0,
|
|
64
|
+
priceChange1h: pairA.priceChange?.h1 ?? 0,
|
|
65
|
+
priceChange24h: pairA.priceChange?.h24 ?? 0,
|
|
66
|
+
age: ageA.ageStr,
|
|
67
|
+
ageMs: ageA.ageMs,
|
|
68
|
+
dex: pairA.dexId,
|
|
69
|
+
};
|
|
70
|
+
const tokenB = {
|
|
71
|
+
address: pairB.baseToken.address,
|
|
72
|
+
name: pairB.baseToken.name,
|
|
73
|
+
symbol: pairB.baseToken.symbol,
|
|
74
|
+
chain: pairB.chainId,
|
|
75
|
+
priceUsd: parseFloat(pairB.priceUsd) || 0,
|
|
76
|
+
marketCap: pairB.marketCap ?? 0,
|
|
77
|
+
volume24h: pairB.volume?.h24 ?? 0,
|
|
78
|
+
volume1h: pairB.volume?.h1 ?? 0,
|
|
79
|
+
liquidity: pairB.liquidity?.usd ?? 0,
|
|
80
|
+
priceChange1h: pairB.priceChange?.h1 ?? 0,
|
|
81
|
+
priceChange24h: pairB.priceChange?.h24 ?? 0,
|
|
82
|
+
age: ageB.ageStr,
|
|
83
|
+
ageMs: ageB.ageMs,
|
|
84
|
+
dex: pairB.dexId,
|
|
85
|
+
};
|
|
86
|
+
const comparison = {
|
|
87
|
+
higherMcap: tokenA.marketCap >= tokenB.marketCap ? tokenA.symbol : tokenB.symbol,
|
|
88
|
+
higherVolume: tokenA.volume24h >= tokenB.volume24h ? tokenA.symbol : tokenB.symbol,
|
|
89
|
+
higherLiquidity: tokenA.liquidity >= tokenB.liquidity ? tokenA.symbol : tokenB.symbol,
|
|
90
|
+
betterPrice24h: tokenA.priceChange24h >= tokenB.priceChange24h ? tokenA.symbol : tokenB.symbol,
|
|
91
|
+
older: tokenA.ageMs >= tokenB.ageMs ? tokenA.symbol : tokenB.symbol,
|
|
92
|
+
mcapRatio: ratio(Math.max(tokenA.marketCap, tokenB.marketCap), Math.min(tokenA.marketCap, tokenB.marketCap)),
|
|
93
|
+
volumeRatio: ratio(Math.max(tokenA.volume24h, tokenB.volume24h), Math.min(tokenA.volume24h, tokenB.volume24h)),
|
|
94
|
+
liquidityRatio: ratio(Math.max(tokenA.liquidity, tokenB.liquidity), Math.min(tokenA.liquidity, tokenB.liquidity)),
|
|
95
|
+
};
|
|
96
|
+
// Holder comparison for Solana tokens
|
|
97
|
+
let holderComparison;
|
|
98
|
+
if (chain === 'solana') {
|
|
99
|
+
try {
|
|
100
|
+
const [holdersA, holdersB] = await Promise.all([
|
|
101
|
+
gmgn.getHolders(args.address_a).catch(() => null),
|
|
102
|
+
gmgn.getHolders(args.address_b).catch(() => null),
|
|
103
|
+
]);
|
|
104
|
+
if (holdersA && holdersB) {
|
|
105
|
+
const sortedA = [...holdersA.holders].sort((a, b) => b.supplyPercent - a.supplyPercent);
|
|
106
|
+
const sortedB = [...holdersB.holders].sort((a, b) => b.supplyPercent - a.supplyPercent);
|
|
107
|
+
const top10A = sortedA.slice(0, 10).reduce((s, h) => s + h.supplyPercent, 0);
|
|
108
|
+
const top10B = sortedB.slice(0, 10).reduce((s, h) => s + h.supplyPercent, 0);
|
|
109
|
+
tokenA.holderCount = holdersA.holders.length;
|
|
110
|
+
tokenA.top10Concentration = top10A;
|
|
111
|
+
tokenB.holderCount = holdersB.holders.length;
|
|
112
|
+
tokenB.top10Concentration = top10B;
|
|
113
|
+
holderComparison = {
|
|
114
|
+
tokenAHolders: holdersA.holders.length,
|
|
115
|
+
tokenBHolders: holdersB.holders.length,
|
|
116
|
+
tokenATop10Pct: Math.round(top10A * 10000) / 100,
|
|
117
|
+
tokenBTop10Pct: Math.round(top10B * 10000) / 100,
|
|
118
|
+
moreDistributed: top10A <= top10B ? tokenA.symbol : tokenB.symbol,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Holder comparison is non-critical
|
|
124
|
+
debug('Holder comparison failed, skipping');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Build summary
|
|
128
|
+
const lines = [];
|
|
129
|
+
lines.push(`${tokenA.symbol} vs ${tokenB.symbol}:`);
|
|
130
|
+
lines.push('');
|
|
131
|
+
lines.push(` ${''.padEnd(16)} ${tokenA.symbol.padEnd(18)} ${tokenB.symbol.padEnd(18)}`);
|
|
132
|
+
lines.push(` ${'Price'.padEnd(16)} ${fmt(tokenA.priceUsd).padEnd(18)} ${fmt(tokenB.priceUsd).padEnd(18)}`);
|
|
133
|
+
lines.push(` ${'Market Cap'.padEnd(16)} ${fmt(tokenA.marketCap).padEnd(18)} ${fmt(tokenB.marketCap).padEnd(18)}`);
|
|
134
|
+
lines.push(` ${'Volume 24h'.padEnd(16)} ${fmt(tokenA.volume24h).padEnd(18)} ${fmt(tokenB.volume24h).padEnd(18)}`);
|
|
135
|
+
lines.push(` ${'Liquidity'.padEnd(16)} ${fmt(tokenA.liquidity).padEnd(18)} ${fmt(tokenB.liquidity).padEnd(18)}`);
|
|
136
|
+
lines.push(` ${'Change 24h'.padEnd(16)} ${(tokenA.priceChange24h.toFixed(1) + '%').padEnd(18)} ${(tokenB.priceChange24h.toFixed(1) + '%').padEnd(18)}`);
|
|
137
|
+
lines.push(` ${'Age'.padEnd(16)} ${tokenA.age.padEnd(18)} ${tokenB.age.padEnd(18)}`);
|
|
138
|
+
lines.push(` ${'DEX'.padEnd(16)} ${tokenA.dex.padEnd(18)} ${tokenB.dex.padEnd(18)}`);
|
|
139
|
+
if (holderComparison) {
|
|
140
|
+
lines.push(` ${'Holders'.padEnd(16)} ${String(holderComparison.tokenAHolders).padEnd(18)} ${String(holderComparison.tokenBHolders).padEnd(18)}`);
|
|
141
|
+
lines.push(` ${'Top10 Conc.'.padEnd(16)} ${(holderComparison.tokenATop10Pct + '%').padEnd(18)} ${(holderComparison.tokenBTop10Pct + '%').padEnd(18)}`);
|
|
142
|
+
}
|
|
143
|
+
lines.push('');
|
|
144
|
+
lines.push(`Market cap ratio: ${comparison.mcapRatio} (${comparison.higherMcap} is larger).`);
|
|
145
|
+
lines.push(`${comparison.higherVolume} has more volume, ${comparison.higherLiquidity} has deeper liquidity.`);
|
|
146
|
+
lines.push(`${comparison.betterPrice24h} performed better in the last 24h.`);
|
|
147
|
+
lines.push(`${comparison.older} is the older token.`);
|
|
148
|
+
if (holderComparison) {
|
|
149
|
+
lines.push(`${holderComparison.moreDistributed} has more distributed ownership.`);
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
tokenA,
|
|
153
|
+
tokenB,
|
|
154
|
+
comparison,
|
|
155
|
+
holderComparison,
|
|
156
|
+
summary: lines.join('\n'),
|
|
157
|
+
fetchedAt: new Date().toISOString(),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=compareTokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compareTokens.js","sourceRoot":"","sources":["../../src/tools/compareTokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* estimate_slippage tool — Jupiter-based slippage estimation for Solana tokens.
|
|
3
|
+
* Shows price impact for $50, $100, $500, $1000 buys.
|
|
4
|
+
* Uses Jupiter Quote API (free, no auth).
|
|
5
|
+
*/
|
|
6
|
+
import { type SlippageEstimate } from '../sources/jupiter.js';
|
|
7
|
+
interface SlippageResult {
|
|
8
|
+
token: string;
|
|
9
|
+
symbol: string;
|
|
10
|
+
name: string;
|
|
11
|
+
currentPriceUsd: number;
|
|
12
|
+
solPriceUsd: number;
|
|
13
|
+
estimates: SlippageEstimate[];
|
|
14
|
+
summary: string;
|
|
15
|
+
fetchedAt: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function handleEstimateSlippage(args: {
|
|
18
|
+
address: string;
|
|
19
|
+
}): Promise<SlippageResult | {
|
|
20
|
+
error: string;
|
|
21
|
+
}>;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* estimate_slippage tool — Jupiter-based slippage estimation for Solana tokens.
|
|
3
|
+
* Shows price impact for $50, $100, $500, $1000 buys.
|
|
4
|
+
* Uses Jupiter Quote API (free, no auth).
|
|
5
|
+
*/
|
|
6
|
+
import { estimateSlippage } from '../sources/jupiter.js';
|
|
7
|
+
import { getPrice } from '../sources/dexscreener.js';
|
|
8
|
+
import { debug } from '../utils/debug.js';
|
|
9
|
+
const SOL_MINT = 'So11111111111111111111111111111111111112';
|
|
10
|
+
export async function handleEstimateSlippage(args) {
|
|
11
|
+
if (!args.address || args.address.trim().length === 0) {
|
|
12
|
+
return { error: 'Token address is required. Provide a Solana token mint address.' };
|
|
13
|
+
}
|
|
14
|
+
const address = args.address.trim();
|
|
15
|
+
debug(`Estimating slippage for ${address}`);
|
|
16
|
+
// Get SOL price first
|
|
17
|
+
const solPrice = await getPrice(SOL_MINT, 'solana');
|
|
18
|
+
if (!solPrice) {
|
|
19
|
+
return { error: 'Could not fetch SOL price. DexScreener may be temporarily unavailable.' };
|
|
20
|
+
}
|
|
21
|
+
// Get token info
|
|
22
|
+
const tokenPrice = await getPrice(address, 'solana');
|
|
23
|
+
if (!tokenPrice) {
|
|
24
|
+
return { error: `Token not found on DexScreener: ${address}. Check the address or try searching by name with search_token.` };
|
|
25
|
+
}
|
|
26
|
+
// Estimate decimals from price (rough heuristic, Jupiter will handle actual decimals)
|
|
27
|
+
// We'll use 6 as default for most SPL tokens, 9 for SOL-like
|
|
28
|
+
const tokenDecimals = 6; // Most SPL tokens use 6 decimals
|
|
29
|
+
const estimates = await estimateSlippage(address, solPrice.priceUsd, tokenDecimals);
|
|
30
|
+
if (estimates.length === 0) {
|
|
31
|
+
return { error: `No Jupiter routes found for ${tokenPrice.symbol}. The token may not have enough liquidity on Jupiter-supported DEXes.` };
|
|
32
|
+
}
|
|
33
|
+
// Build summary
|
|
34
|
+
const summaryParts = [];
|
|
35
|
+
summaryParts.push(`Slippage estimates for ${tokenPrice.symbol} (${tokenPrice.name}):`);
|
|
36
|
+
for (const est of estimates) {
|
|
37
|
+
const impactStr = est.priceImpactPct > 1
|
|
38
|
+
? `${est.priceImpactPct.toFixed(2)}% (HIGH)`
|
|
39
|
+
: est.priceImpactPct > 0.3
|
|
40
|
+
? `${est.priceImpactPct.toFixed(2)}% (moderate)`
|
|
41
|
+
: `${est.priceImpactPct.toFixed(4)}% (low)`;
|
|
42
|
+
summaryParts.push(` $${est.buyAmountUsd}: ${est.estimatedOutput.toFixed(2)} ${tokenPrice.symbol}, price impact ${impactStr}, via ${est.route}`);
|
|
43
|
+
}
|
|
44
|
+
// Overall assessment
|
|
45
|
+
const maxImpact = Math.max(...estimates.map(e => e.priceImpactPct));
|
|
46
|
+
if (maxImpact > 5) {
|
|
47
|
+
summaryParts.push(`\nWARNING: Very high price impact even at small sizes. Extremely illiquid token.`);
|
|
48
|
+
}
|
|
49
|
+
else if (maxImpact > 2) {
|
|
50
|
+
summaryParts.push(`\nCaution: Significant price impact at larger sizes. Trade in smaller amounts.`);
|
|
51
|
+
}
|
|
52
|
+
else if (maxImpact > 0.5) {
|
|
53
|
+
summaryParts.push(`\nModerate liquidity. $100-500 buys are reasonable, larger sizes will move the price.`);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
summaryParts.push(`\nGood liquidity. All tested buy sizes have low price impact.`);
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
token: address,
|
|
60
|
+
symbol: tokenPrice.symbol,
|
|
61
|
+
name: tokenPrice.name,
|
|
62
|
+
currentPriceUsd: tokenPrice.priceUsd,
|
|
63
|
+
solPriceUsd: solPrice.priceUsd,
|
|
64
|
+
estimates,
|
|
65
|
+
summary: summaryParts.join('\n'),
|
|
66
|
+
fetchedAt: new Date().toISOString(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=estimateSlippage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimateSlippage.js","sourceRoot":"","sources":["../../src/tools/estimateSlippage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface SecurityResult {
|
|
2
|
+
token: string;
|
|
3
|
+
symbol: string;
|
|
4
|
+
name: string;
|
|
5
|
+
security: {
|
|
6
|
+
mintAuthority: 'revoked' | 'active';
|
|
7
|
+
freezeAuthority: 'revoked' | 'active';
|
|
8
|
+
supply: number;
|
|
9
|
+
decimals: number;
|
|
10
|
+
};
|
|
11
|
+
verdict: 'SAFE' | 'CAUTION' | 'DANGEROUS';
|
|
12
|
+
issues: string[];
|
|
13
|
+
summary: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function handleGetTokenSecurity(args: {
|
|
16
|
+
address: string;
|
|
17
|
+
}): Promise<SecurityResult | {
|
|
18
|
+
error: string;
|
|
19
|
+
}>;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_token_security tool — Quick standalone security check.
|
|
3
|
+
* Checks mint authority, freeze authority, supply, and gives a quick verdict.
|
|
4
|
+
* Solana only. Uses free Solana RPC, no auth needed.
|
|
5
|
+
*/
|
|
6
|
+
import { getTokenSecurity } from '../sources/solanaRpc.js';
|
|
7
|
+
import { getTokenPair } from '../sources/dexscreener.js';
|
|
8
|
+
import { debug } from '../utils/debug.js';
|
|
9
|
+
export async function handleGetTokenSecurity(args) {
|
|
10
|
+
if (!args.address || args.address.trim().length === 0) {
|
|
11
|
+
return { error: 'Token address is required. Provide a Solana token mint address.' };
|
|
12
|
+
}
|
|
13
|
+
const address = args.address.trim();
|
|
14
|
+
debug(`Security check for ${address}`);
|
|
15
|
+
// Fetch security and token info in parallel
|
|
16
|
+
const [security, pair] = await Promise.all([
|
|
17
|
+
getTokenSecurity(address),
|
|
18
|
+
getTokenPair(address, 'solana').catch(() => null),
|
|
19
|
+
]);
|
|
20
|
+
if (!security) {
|
|
21
|
+
return {
|
|
22
|
+
error: `Could not fetch security data for ${address}. The address may not be a valid Solana token mint, or the RPC may be temporarily unavailable.`,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const symbol = pair?.baseToken?.symbol ?? address.slice(0, 6);
|
|
26
|
+
const name = pair?.baseToken?.name ?? 'Unknown';
|
|
27
|
+
// Determine issues and verdict
|
|
28
|
+
const issues = [];
|
|
29
|
+
if (security.mintAuthority === 'active') {
|
|
30
|
+
issues.push('Mint authority is ACTIVE. The deployer can print unlimited tokens, diluting holders.');
|
|
31
|
+
}
|
|
32
|
+
if (security.freezeAuthority === 'active') {
|
|
33
|
+
issues.push('Freeze authority is ACTIVE. The deployer can freeze any wallet, preventing sells.');
|
|
34
|
+
}
|
|
35
|
+
let verdict;
|
|
36
|
+
if (security.mintAuthority === 'active' && security.freezeAuthority === 'active') {
|
|
37
|
+
verdict = 'DANGEROUS';
|
|
38
|
+
}
|
|
39
|
+
else if (security.mintAuthority === 'active' || security.freezeAuthority === 'active') {
|
|
40
|
+
verdict = 'CAUTION';
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
verdict = 'SAFE';
|
|
44
|
+
}
|
|
45
|
+
// Build summary
|
|
46
|
+
const lines = [];
|
|
47
|
+
lines.push(`Security check for ${symbol} (${name}):`);
|
|
48
|
+
lines.push('');
|
|
49
|
+
lines.push(` Mint Authority: ${security.mintAuthority === 'revoked' ? 'Revoked (safe)' : 'ACTIVE (can print tokens!)'}`);
|
|
50
|
+
lines.push(` Freeze Authority: ${security.freezeAuthority === 'revoked' ? 'Revoked (safe)' : 'ACTIVE (can freeze wallets!)'}`);
|
|
51
|
+
lines.push(` Total Supply: ${Math.round(security.supply).toLocaleString()}`);
|
|
52
|
+
lines.push(` Decimals: ${security.decimals}`);
|
|
53
|
+
lines.push('');
|
|
54
|
+
if (verdict === 'SAFE') {
|
|
55
|
+
lines.push('VERDICT: SAFE. Both mint and freeze authorities are revoked. The deployer cannot print tokens or freeze wallets.');
|
|
56
|
+
}
|
|
57
|
+
else if (verdict === 'CAUTION') {
|
|
58
|
+
lines.push(`VERDICT: CAUTION. ${issues.join(' ')}`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
lines.push(`VERDICT: DANGEROUS. ${issues.join(' ')} This token has full rug-pull capabilities.`);
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
token: address,
|
|
65
|
+
symbol,
|
|
66
|
+
name,
|
|
67
|
+
security,
|
|
68
|
+
verdict,
|
|
69
|
+
issues,
|
|
70
|
+
summary: lines.join('\n'),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=getTokenSecurity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTokenSecurity.js","sourceRoot":"","sources":["../../src/tools/getTokenSecurity.ts"],"names":[],"mappings":"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"}
|