@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
|
@@ -1,21 +1,51 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Score risk from 0 (safe) to 100 (extremely risky).
|
|
3
|
+
*
|
|
4
|
+
* Dimensions and max weights:
|
|
5
|
+
* 1. Liquidity — 22 pts
|
|
6
|
+
* 2. Token age — 10 pts
|
|
7
|
+
* 3. Volume anomalies — 8 pts
|
|
8
|
+
* 4. Holder concentration — 18 pts
|
|
9
|
+
* 5. Dev wallet — 15 pts
|
|
10
|
+
* 6. Fresh wallets — 12 pts
|
|
11
|
+
* 7. Sniper activity — 10 pts
|
|
12
|
+
* 8. Contract security — 5 pts
|
|
13
|
+
* --------
|
|
14
|
+
* Max: 100 pts
|
|
15
|
+
*/
|
|
16
|
+
export function scoreRisk(pairOrOptions, holders) {
|
|
17
|
+
// Support both old signature (pair, holders) and new options object
|
|
18
|
+
let pair;
|
|
19
|
+
let security;
|
|
20
|
+
if (pairOrOptions && typeof pairOrOptions === 'object' && 'pair' in pairOrOptions) {
|
|
21
|
+
pair = pairOrOptions.pair;
|
|
22
|
+
holders = pairOrOptions.holders;
|
|
23
|
+
security = pairOrOptions.security;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
pair = pairOrOptions;
|
|
27
|
+
}
|
|
2
28
|
const flags = [];
|
|
3
29
|
let totalScore = 0;
|
|
4
|
-
// 1. Liquidity risk (
|
|
5
|
-
const liquidity = pair?.liquidity?.usd
|
|
6
|
-
if (liquidity <
|
|
30
|
+
// ── 1. Liquidity risk (max 22 pts) ──
|
|
31
|
+
const liquidity = pair?.liquidity?.usd ?? 0;
|
|
32
|
+
if (liquidity < 1_000) {
|
|
33
|
+
flags.push({ type: 'liquidity', severity: 'critical', message: `Dangerously low liquidity: $${liquidity.toFixed(0)} (high slippage, possible rug)` });
|
|
34
|
+
totalScore += 22;
|
|
35
|
+
}
|
|
36
|
+
else if (liquidity < 5_000) {
|
|
7
37
|
flags.push({ type: 'liquidity', severity: 'critical', message: `Extremely low liquidity: $${liquidity.toFixed(0)}` });
|
|
8
|
-
totalScore +=
|
|
38
|
+
totalScore += 18;
|
|
9
39
|
}
|
|
10
|
-
else if (liquidity <
|
|
40
|
+
else if (liquidity < 25_000) {
|
|
11
41
|
flags.push({ type: 'liquidity', severity: 'high', message: `Low liquidity: $${liquidity.toFixed(0)}` });
|
|
12
|
-
totalScore +=
|
|
42
|
+
totalScore += 12;
|
|
13
43
|
}
|
|
14
|
-
else if (liquidity <
|
|
44
|
+
else if (liquidity < 100_000) {
|
|
15
45
|
flags.push({ type: 'liquidity', severity: 'medium', message: `Moderate liquidity: $${liquidity.toFixed(0)}` });
|
|
16
|
-
totalScore +=
|
|
46
|
+
totalScore += 5;
|
|
17
47
|
}
|
|
18
|
-
// 2. Token age (10
|
|
48
|
+
// ── 2. Token age (max 10 pts) ──
|
|
19
49
|
if (pair?.pairCreatedAt) {
|
|
20
50
|
const ageMs = Date.now() - pair.pairCreatedAt;
|
|
21
51
|
const ageHours = ageMs / (1000 * 60 * 60);
|
|
@@ -23,53 +53,88 @@ export function scoreRisk(pair, holders) {
|
|
|
23
53
|
flags.push({ type: 'age', severity: 'critical', message: `Token launched ${Math.round(ageHours * 60)}m ago` });
|
|
24
54
|
totalScore += 10;
|
|
25
55
|
}
|
|
26
|
-
else if (ageHours <
|
|
56
|
+
else if (ageHours < 6) {
|
|
27
57
|
flags.push({ type: 'age', severity: 'high', message: `Token is ${Math.round(ageHours)}h old` });
|
|
28
|
-
totalScore +=
|
|
58
|
+
totalScore += 7;
|
|
59
|
+
}
|
|
60
|
+
else if (ageHours < 24) {
|
|
61
|
+
flags.push({ type: 'age', severity: 'medium', message: `Token is ${Math.round(ageHours)}h old` });
|
|
62
|
+
totalScore += 4;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ── 3. Volume anomalies (max 8 pts) ──
|
|
66
|
+
const volume24h = pair?.volume?.h24 ?? 0;
|
|
67
|
+
const volume1h = pair?.volume?.h1 ?? 0;
|
|
68
|
+
const mcap = pair?.marketCap ?? 0;
|
|
69
|
+
if (volume24h > 0 && mcap > 0) {
|
|
70
|
+
const volMcapRatio = volume24h / mcap;
|
|
71
|
+
if (volMcapRatio > 5) {
|
|
72
|
+
flags.push({ type: 'volume_anomaly', severity: 'high', message: `Suspicious volume: ${volMcapRatio.toFixed(1)}x market cap (possible wash trading)` });
|
|
73
|
+
totalScore += 8;
|
|
74
|
+
}
|
|
75
|
+
else if (volMcapRatio > 2) {
|
|
76
|
+
flags.push({ type: 'volume_anomaly', severity: 'medium', message: `High volume relative to mcap: ${volMcapRatio.toFixed(1)}x` });
|
|
77
|
+
totalScore += 3;
|
|
29
78
|
}
|
|
30
79
|
}
|
|
31
|
-
|
|
80
|
+
if (volume24h === 0 && volume1h === 0) {
|
|
81
|
+
flags.push({ type: 'no_volume', severity: 'medium', message: 'Zero trading volume, token may be dead' });
|
|
82
|
+
totalScore += 5;
|
|
83
|
+
}
|
|
84
|
+
// ── Holder-based risks (only if we have GMGN data) ──
|
|
32
85
|
if (holders && holders.length > 0) {
|
|
33
|
-
//
|
|
86
|
+
// ── 4. Top holder concentration (max 18 pts) ──
|
|
34
87
|
const sorted = [...holders].sort((a, b) => b.supplyPercent - a.supplyPercent);
|
|
35
88
|
const top10Pct = sorted.slice(0, 10).reduce((s, h) => s + h.supplyPercent, 0);
|
|
36
|
-
if (top10Pct > 60) {
|
|
89
|
+
if (top10Pct > 0.60) {
|
|
37
90
|
flags.push({ type: 'concentration', severity: 'critical', message: `Top 10 holders own ${(top10Pct * 100).toFixed(1)}%` });
|
|
38
|
-
totalScore +=
|
|
91
|
+
totalScore += 18;
|
|
39
92
|
}
|
|
40
|
-
else if (top10Pct > 40) {
|
|
93
|
+
else if (top10Pct > 0.40) {
|
|
41
94
|
flags.push({ type: 'concentration', severity: 'high', message: `Top 10 holders own ${(top10Pct * 100).toFixed(1)}%` });
|
|
42
|
-
totalScore +=
|
|
95
|
+
totalScore += 10;
|
|
43
96
|
}
|
|
44
|
-
else if (top10Pct > 25) {
|
|
97
|
+
else if (top10Pct > 0.25) {
|
|
45
98
|
flags.push({ type: 'concentration', severity: 'medium', message: `Top 10 holders own ${(top10Pct * 100).toFixed(1)}%` });
|
|
46
|
-
totalScore +=
|
|
99
|
+
totalScore += 4;
|
|
47
100
|
}
|
|
48
|
-
//
|
|
101
|
+
// ── 5. Dev wallet (max 15 pts) ──
|
|
49
102
|
const dev = holders.find(h => h.isDeployer);
|
|
50
103
|
if (dev) {
|
|
51
|
-
if (dev.supplyPercent > 0.
|
|
52
|
-
flags.push({ type: 'dev_wallet', severity: '
|
|
104
|
+
if (dev.supplyPercent > 0.20) {
|
|
105
|
+
flags.push({ type: 'dev_wallet', severity: 'critical', message: `Dev holds ${(dev.supplyPercent * 100).toFixed(1)}% (rug risk)` });
|
|
53
106
|
totalScore += 15;
|
|
54
107
|
}
|
|
55
|
-
else if (dev.
|
|
56
|
-
flags.push({ type: '
|
|
57
|
-
totalScore +=
|
|
108
|
+
else if (dev.supplyPercent > 0.10) {
|
|
109
|
+
flags.push({ type: 'dev_wallet', severity: 'high', message: `Dev holds ${(dev.supplyPercent * 100).toFixed(1)}%` });
|
|
110
|
+
totalScore += 10;
|
|
111
|
+
}
|
|
112
|
+
else if (dev.supplyPercent > 0.05) {
|
|
113
|
+
flags.push({ type: 'dev_wallet', severity: 'medium', message: `Dev holds ${(dev.supplyPercent * 100).toFixed(1)}%` });
|
|
114
|
+
totalScore += 5;
|
|
115
|
+
}
|
|
116
|
+
if (dev.sellAmount > dev.buyAmount * 0.5 && dev.sellAmount > 0) {
|
|
117
|
+
flags.push({ type: 'dev_selling', severity: 'high', message: 'Dev has been selling significantly' });
|
|
118
|
+
totalScore += 5;
|
|
58
119
|
}
|
|
59
120
|
}
|
|
60
|
-
//
|
|
121
|
+
// ── 6. Fresh wallets (max 12 pts) ──
|
|
61
122
|
const freshCount = holders.filter(h => h.isFreshWallet).length;
|
|
62
123
|
const freshPct = freshCount / holders.length;
|
|
63
|
-
if (freshPct > 0.
|
|
124
|
+
if (freshPct > 0.40) {
|
|
125
|
+
flags.push({ type: 'fresh_wallets', severity: 'critical', message: `${(freshPct * 100).toFixed(0)}% fresh wallets (likely bundled/wash)` });
|
|
126
|
+
totalScore += 12;
|
|
127
|
+
}
|
|
128
|
+
else if (freshPct > 0.25) {
|
|
64
129
|
flags.push({ type: 'fresh_wallets', severity: 'high', message: `${(freshPct * 100).toFixed(0)}% fresh wallets (possible bundle/wash)` });
|
|
65
|
-
totalScore +=
|
|
130
|
+
totalScore += 8;
|
|
66
131
|
}
|
|
67
132
|
else if (freshPct > 0.15) {
|
|
68
133
|
flags.push({ type: 'fresh_wallets', severity: 'medium', message: `${(freshPct * 100).toFixed(0)}% fresh wallets` });
|
|
69
|
-
totalScore +=
|
|
134
|
+
totalScore += 4;
|
|
70
135
|
}
|
|
71
|
-
//
|
|
72
|
-
const sniperCount = holders.filter(h => h.tags.some(t =>
|
|
136
|
+
// ── 7. Sniper activity (max 10 pts) ──
|
|
137
|
+
const sniperCount = holders.filter(h => h.tags.some(t => /sniper|bot|sandwich/i.test(t))).length;
|
|
73
138
|
if (sniperCount > 5) {
|
|
74
139
|
flags.push({ type: 'snipers', severity: 'high', message: `${sniperCount} sniper/bot wallets detected` });
|
|
75
140
|
totalScore += 10;
|
|
@@ -80,25 +145,58 @@ export function scoreRisk(pair, holders) {
|
|
|
80
145
|
}
|
|
81
146
|
}
|
|
82
147
|
else {
|
|
83
|
-
// No holder data — add uncertainty
|
|
84
|
-
totalScore +=
|
|
85
|
-
flags.push({ type: 'no_holder_data', severity: 'medium', message: 'Holder analysis unavailable (
|
|
148
|
+
// No holder data — add uncertainty penalty
|
|
149
|
+
totalScore += 12;
|
|
150
|
+
flags.push({ type: 'no_holder_data', severity: 'medium', message: 'Holder analysis unavailable (limited risk assessment)' });
|
|
151
|
+
}
|
|
152
|
+
// ── 8. Contract security (max 5 pts) ──
|
|
153
|
+
if (security) {
|
|
154
|
+
if (security.mintAuthority === 'active') {
|
|
155
|
+
flags.push({ type: 'mint_authority', severity: 'high', message: 'Mint authority active (dev can print tokens)' });
|
|
156
|
+
totalScore += 3;
|
|
157
|
+
}
|
|
158
|
+
if (security.freezeAuthority === 'active') {
|
|
159
|
+
flags.push({ type: 'freeze_authority', severity: 'high', message: 'Freeze authority active (dev can freeze wallets)' });
|
|
160
|
+
totalScore += 2;
|
|
161
|
+
}
|
|
86
162
|
}
|
|
87
163
|
// Clamp to 0-100
|
|
88
164
|
totalScore = Math.min(100, Math.max(0, totalScore));
|
|
89
|
-
const level = totalScore >= 70 ? 'CRITICAL' :
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
165
|
+
const level = totalScore >= 70 ? 'CRITICAL' :
|
|
166
|
+
totalScore >= 45 ? 'HIGH' :
|
|
167
|
+
totalScore >= 20 ? 'MEDIUM' : 'LOW';
|
|
168
|
+
// Build smart summary
|
|
169
|
+
const summary = buildRiskSummary(level, flags, totalScore);
|
|
170
|
+
return { score: totalScore, level, flags, summary };
|
|
171
|
+
}
|
|
172
|
+
/** Build a concise, actionable risk summary from flags */
|
|
173
|
+
function buildRiskSummary(level, flags, score) {
|
|
174
|
+
const parts = [];
|
|
175
|
+
// Headline
|
|
176
|
+
switch (level) {
|
|
177
|
+
case 'CRITICAL':
|
|
178
|
+
parts.push(`Extreme risk (${score}/100)`);
|
|
179
|
+
break;
|
|
180
|
+
case 'HIGH':
|
|
181
|
+
parts.push(`High risk (${score}/100)`);
|
|
182
|
+
break;
|
|
183
|
+
case 'MEDIUM':
|
|
184
|
+
parts.push(`Moderate risk (${score}/100)`);
|
|
185
|
+
break;
|
|
186
|
+
case 'LOW':
|
|
187
|
+
parts.push(`Lower risk (${score}/100)`);
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
// Top 3 most severe flags as supporting details
|
|
191
|
+
const criticalFlags = flags.filter(f => f.severity === 'critical');
|
|
192
|
+
const highFlags = flags.filter(f => f.severity === 'high');
|
|
193
|
+
const topFlags = [...criticalFlags, ...highFlags].slice(0, 3);
|
|
194
|
+
if (topFlags.length > 0) {
|
|
195
|
+
parts.push(topFlags.map(f => f.message).join('; '));
|
|
196
|
+
}
|
|
197
|
+
else if (flags.length > 0) {
|
|
198
|
+
parts.push(flags.slice(0, 2).map(f => f.message).join('; '));
|
|
101
199
|
}
|
|
102
|
-
return
|
|
200
|
+
return parts.join('. ') + '.';
|
|
103
201
|
}
|
|
104
202
|
//# sourceMappingURL=riskScorer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"riskScorer.js","sourceRoot":"","sources":["../../src/analysis/riskScorer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"riskScorer.js","sourceRoot":"","sources":["../../src/analysis/riskScorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Summary Generator — produces human-readable token analysis from raw data.
|
|
3
|
+
* No API calls needed; all logic is rule-based.
|
|
4
4
|
*/
|
|
5
5
|
interface SummaryInput {
|
|
6
6
|
token: {
|
|
@@ -19,6 +19,7 @@ interface SummaryInput {
|
|
|
19
19
|
marketCap: number;
|
|
20
20
|
volume24h: number;
|
|
21
21
|
volume1h: number;
|
|
22
|
+
volume5m?: number;
|
|
22
23
|
liquidity: number;
|
|
23
24
|
volumeLiquidityRatio: number;
|
|
24
25
|
dex: string;
|