@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 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
- Then just ask Claude naturally:
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
- > "analyze this token: 3oQw...pump"
58
- > "what's the price of BONK?"
59
- > "search for BONK token"
60
- > "show me new launches on solana in the last 30 minutes"
61
- > "show me trending tokens on solana"
62
- > "who made money on JUP token?"
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
@@ -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":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,uEAAuE;AACvE,SAAS,kBAAkB,CAAC,MAA+B;IACzD,MAAM,OAAO,GAA4B,EAAE,CAAC;IAE5C,eAAe;IACf,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAErD,gCAAgC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,KAA4C,CAAC;IAClE,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,GAAG;YACd,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC;IACJ,CAAC;IAED,eAAe;IACf,MAAM,KAAK,GAAG,MAAM,CAAC,KAA4C,CAAC;IAClE,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,GAAG;YACd,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAA2C,CAAC;IAChE,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,IAAI,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAA8C,CAAC;IACtE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,OAAO,CAAC,UAAmC,CAAC;QAC/D,OAAO,CAAC,OAAO,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAG,OAAO,CAAC,aAAyC,EAAE,OAAO;YACpE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;SACrD,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,MAAM,MAAM,GAAG,MAAM,CAAC,MAA6C,CAAC;IACpE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,GAAG;YACf,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;IACJ,CAAC;IAED,OAAO;IACP,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAE3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,4PAA4P,EAC5P;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QACjG,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,iEAAiE,CAAC;QACtH,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,+DAA+D,CAAC;QAC3G,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,oGAAoG,CAAC;KACnJ,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,uCAAuC;YACvC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK;gBAC9B,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE;gBACrC,CAAC,CAAC,IAAI,CAAC;YACT,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,aAAa,CAAC,CAAC;YACvD,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC1D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC/F,CAAC;YAED,6CAA6C;YAC7C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAC3C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1F,CAAC;YAED,MAAM,SAAS,GAAG,cAAc,CAAC,MAAyD,CAAC,CAAC;YAC5F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACnE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,oBAAoB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjI,CAAC;IACH,CAAC,CACF,CAAC;IAEF,kBAAkB;IAClB,MAAM,CAAC,IAAI,CACT,WAAW,EACX,8EAA8E,EAC9E;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAChF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KAClG,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC3E,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,wBAAwB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACrI,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,IAAI,CACT,cAAc,EACd,+FAA+F,EAC/F;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QACjG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KAC3F,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACzF,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,0BAA0B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACvI,CAAC;IACH,CAAC,CACF,CAAC;IAEF,wBAAwB;IACxB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,4GAA4G,EAC5G;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC7D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KACrG,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC3E,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,6BAA6B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1I,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,IAAI,CACT,cAAc,EACd,6GAA6G,EAC7G;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QAChG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mFAAmF,CAAC;QAC1H,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KAC5F,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC3E,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,wBAAwB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACrI,CAAC;IACH,CAAC,CACF,CAAC;IAEF,yBAAyB;IACzB,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,mHAAmH,EACnH;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QACjG,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC1G,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KAC3F,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC3E,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,8BAA8B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3I,CAAC;IACH,CAAC,CACF,CAAC;IAEF,0BAA0B;IAC1B,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,0FAA0F,EAC1F;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACjE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,OAAO,IAAI,MAAM;gBAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACpH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACxE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,+BAA+B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5I,CAAC;IACH,CAAC,CACF,CAAC;IAEF,uBAAuB;IACvB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,gFAAgF,EAChF;QACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC5D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC7D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;KAC3D,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,OAAO,IAAI,MAAM;gBAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACpH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACxE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,sBAAsB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACnI,CAAC;IACH,CAAC,CACF,CAAC;IAEF,2BAA2B;IAC3B,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,oGAAoG,EACpG;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACjE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,OAAO,IAAI,MAAM;gBAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACpH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACxE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,0BAA0B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACvI,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -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":"AAAA;;;;GAIG;AACH,OAAO,EAAE,gBAAgB,EAAsB,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAiB1C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAE5C;IACC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,KAAK,EAAE,iEAAiE,EAAE,CAAC;IACtF,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACpC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;IAEvC,4CAA4C;IAC5C,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,gBAAgB,CAAC,OAAO,CAAC;QACzB,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;KAClD,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,KAAK,EAAE,qCAAqC,OAAO,gGAAgG;SACpJ,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,SAAS,CAAC;IAEhD,+BAA+B;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,QAAQ,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,OAAkC,CAAC;IACvC,IAAI,QAAQ,CAAC,aAAa,KAAK,QAAQ,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;QACjF,OAAO,GAAG,WAAW,CAAC;IACxB,CAAC;SAAM,IAAI,QAAQ,CAAC,aAAa,KAAK,QAAQ,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;QACxF,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IAED,gBAAgB;IAChB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,uBAAuB,QAAQ,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,4BAA4B,EAAE,CAAC,CAAC;IAC5H,KAAK,CAAC,IAAI,CAAC,uBAAuB,QAAQ,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,8BAA8B,EAAE,CAAC,CAAC;IAChI,KAAK,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAClF,KAAK,CAAC,IAAI,CAAC,uBAAuB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,kHAAkH,CAAC,CAAC;IACjI,CAAC;SAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IACnG,CAAC;IAED,OAAO;QACL,KAAK,EAAE,OAAO;QACd,MAAM;QACN,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,MAAM;QACN,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;KAC1B,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xprotovox/deficlaw",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "DeFi MCP Server for Claude Code — token analysis, prices, trending, holder intelligence",
5
5
  "author": "0xprotovox",
6
6
  "license": "MIT",