solvoid 1.1.3 → 1.2.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/LICENSE +21 -0
- package/README.md +289 -36
- package/SECURITY.md +39 -0
- package/bin/solvoid-scan +2 -0
- package/dist/cli/commands/ghost.d.ts +11 -0
- package/dist/cli/commands/ghost.d.ts.map +1 -0
- package/dist/cli/commands/ghost.js +185 -0
- package/dist/cli/commands/ghost.js.map +1 -0
- package/dist/cli/commands/rescue.d.ts +3 -0
- package/dist/cli/commands/rescue.d.ts.map +1 -0
- package/dist/cli/commands/rescue.js +300 -0
- package/dist/cli/commands/rescue.js.map +1 -0
- package/dist/cli/comprehensive-rpc-list.d.ts +31 -0
- package/dist/cli/comprehensive-rpc-list.d.ts.map +1 -0
- package/dist/cli/comprehensive-rpc-list.js +341 -0
- package/dist/cli/comprehensive-rpc-list.js.map +1 -0
- package/dist/cli/demo-scan.d.ts +6 -0
- package/dist/cli/demo-scan.d.ts.map +1 -0
- package/dist/cli/demo-scan.js +260 -0
- package/dist/cli/demo-scan.js.map +1 -0
- package/dist/cli/enhanced-privacy-scan.d.ts +46 -0
- package/dist/cli/enhanced-privacy-scan.d.ts.map +1 -0
- package/dist/cli/enhanced-privacy-scan.js +422 -0
- package/dist/cli/enhanced-privacy-scan.js.map +1 -0
- package/dist/cli/ghost-test.d.ts +7 -0
- package/dist/cli/ghost-test.d.ts.map +1 -0
- package/dist/cli/ghost-test.js +192 -0
- package/dist/cli/ghost-test.js.map +1 -0
- package/dist/cli/simple-scan.d.ts +6 -0
- package/dist/cli/simple-scan.d.ts.map +1 -0
- package/dist/cli/simple-scan.js +250 -0
- package/dist/cli/simple-scan.js.map +1 -0
- package/dist/cli/solvoid-scan.d.ts +6 -0
- package/dist/cli/solvoid-scan.d.ts.map +1 -0
- package/dist/cli/solvoid-scan.js +254 -0
- package/dist/cli/solvoid-scan.js.map +1 -0
- package/dist/cli/ultimate-privacy-scan.d.ts +54 -0
- package/dist/cli/ultimate-privacy-scan.d.ts.map +1 -0
- package/dist/cli/ultimate-privacy-scan.js +543 -0
- package/dist/cli/ultimate-privacy-scan.js.map +1 -0
- package/dist/cli/utils/asset-scanner.d.ts +76 -0
- package/dist/cli/utils/asset-scanner.d.ts.map +1 -0
- package/dist/cli/utils/asset-scanner.js +222 -0
- package/dist/cli/utils/asset-scanner.js.map +1 -0
- package/dist/cli/utils/badge-generator.d.ts +33 -0
- package/dist/cli/utils/badge-generator.d.ts.map +1 -0
- package/dist/cli/utils/badge-generator.js +261 -0
- package/dist/cli/utils/badge-generator.js.map +1 -0
- package/dist/cli/utils/env-validator.d.ts +17 -0
- package/dist/cli/utils/env-validator.d.ts.map +1 -0
- package/dist/cli/utils/env-validator.js +254 -0
- package/dist/cli/utils/env-validator.js.map +1 -0
- package/dist/cli/utils/ghost-art.d.ts +14 -0
- package/dist/cli/utils/ghost-art.d.ts.map +1 -0
- package/dist/cli/utils/ghost-art.js +285 -0
- package/dist/cli/utils/ghost-art.js.map +1 -0
- package/dist/cli/utils/ghost-calculator.d.ts +52 -0
- package/dist/cli/utils/ghost-calculator.d.ts.map +1 -0
- package/dist/cli/utils/ghost-calculator.js +207 -0
- package/dist/cli/utils/ghost-calculator.js.map +1 -0
- package/dist/cli/utils/rescue-engine.d.ts +61 -0
- package/dist/cli/utils/rescue-engine.d.ts.map +1 -0
- package/dist/cli/utils/rescue-engine.js +210 -0
- package/dist/cli/utils/rescue-engine.js.map +1 -0
- package/dist/cli/utils/threat-detector.d.ts +48 -0
- package/dist/cli/utils/threat-detector.d.ts.map +1 -0
- package/dist/cli/utils/threat-detector.js +304 -0
- package/dist/cli/utils/threat-detector.js.map +1 -0
- package/dist/{client.d.ts → sdk/client.d.ts} +8 -0
- package/dist/sdk/client.d.ts.map +1 -0
- package/dist/{client.js → sdk/client.js} +104 -0
- package/dist/sdk/client.js.map +1 -0
- package/dist/sdk/crypto/poseidon.d.ts.map +1 -0
- package/dist/sdk/crypto/poseidon.js.map +1 -0
- package/dist/sdk/events/bus.d.ts.map +1 -0
- package/dist/sdk/events/bus.js.map +1 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/integrity.d.ts.map +1 -0
- package/dist/sdk/integrity.js.map +1 -0
- package/dist/sdk/network/shadow-rpc.d.ts.map +1 -0
- package/dist/sdk/network/shadow-rpc.js.map +1 -0
- package/dist/sdk/passport/manager.d.ts.map +1 -0
- package/dist/sdk/passport/manager.js.map +1 -0
- package/dist/sdk/pipeline.d.ts.map +1 -0
- package/dist/sdk/pipeline.js.map +1 -0
- package/dist/sdk/privacy/relayer.d.ts.map +1 -0
- package/dist/sdk/privacy/relayer.js.map +1 -0
- package/dist/{privacy → sdk/privacy}/shield.d.ts +4 -1
- package/dist/sdk/privacy/shield.d.ts.map +1 -0
- package/dist/{privacy → sdk/privacy}/shield.js +44 -7
- package/dist/sdk/privacy/shield.js.map +1 -0
- package/dist/sdk/privacy-engine.d.ts.map +1 -0
- package/dist/sdk/privacy-engine.js.map +1 -0
- package/dist/sdk/registry/idl-fetcher.d.ts.map +1 -0
- package/dist/sdk/registry/idl-fetcher.js.map +1 -0
- package/dist/sdk/registry/programs.d.ts.map +1 -0
- package/dist/sdk/registry/programs.js.map +1 -0
- package/dist/sdk/rescue/analyzer.d.ts.map +1 -0
- package/dist/sdk/rescue/analyzer.js.map +1 -0
- package/dist/sdk/rescue/builder.d.ts.map +1 -0
- package/dist/sdk/rescue/builder.js.map +1 -0
- package/dist/sdk/security/key-rotation.d.ts.map +1 -0
- package/dist/sdk/security/key-rotation.js.map +1 -0
- package/dist/{semantics → sdk/semantics}/analyzer.d.ts.map +1 -1
- package/dist/{semantics → sdk/semantics}/analyzer.js.map +1 -1
- package/dist/sdk/semantics/decoder.d.ts.map +1 -0
- package/dist/sdk/semantics/decoder.js.map +1 -0
- package/dist/{semantics → sdk/semantics}/graph.d.ts.map +1 -1
- package/dist/{semantics → sdk/semantics}/graph.js.map +1 -1
- package/dist/sdk/semantics/idl-registry.d.ts.map +1 -0
- package/dist/sdk/semantics/idl-registry.js.map +1 -0
- package/dist/sdk/semantics/types.d.ts.map +1 -0
- package/dist/sdk/semantics/types.js.map +1 -0
- package/dist/sdk/types.d.ts.map +1 -0
- package/dist/{semantics → sdk}/types.js.map +1 -1
- package/dist/sdk/utils/address.d.ts.map +1 -0
- package/dist/sdk/utils/address.js.map +1 -0
- package/dist/sdk/utils/config.d.ts.map +1 -0
- package/dist/sdk/utils/config.js.map +1 -0
- package/dist/sdk/utils/logger.d.ts.map +1 -0
- package/dist/sdk/utils/logger.js.map +1 -0
- package/dist/simple-scan.js +249 -0
- package/package.json +103 -36
- package/CHANGELOG.md +0 -26
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/crypto/poseidon.d.ts.map +0 -1
- package/dist/crypto/poseidon.js.map +0 -1
- package/dist/events/bus.d.ts.map +0 -1
- package/dist/events/bus.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/integrity.d.ts.map +0 -1
- package/dist/integrity.js.map +0 -1
- package/dist/network/shadow-rpc.d.ts.map +0 -1
- package/dist/network/shadow-rpc.js.map +0 -1
- package/dist/passport/manager.d.ts.map +0 -1
- package/dist/passport/manager.js.map +0 -1
- package/dist/pipeline.d.ts.map +0 -1
- package/dist/pipeline.js.map +0 -1
- package/dist/privacy/relayer.d.ts.map +0 -1
- package/dist/privacy/relayer.js.map +0 -1
- package/dist/privacy/shield.d.ts.map +0 -1
- package/dist/privacy/shield.js.map +0 -1
- package/dist/privacy-engine.d.ts.map +0 -1
- package/dist/privacy-engine.js.map +0 -1
- package/dist/registry/idl-fetcher.d.ts.map +0 -1
- package/dist/registry/idl-fetcher.js.map +0 -1
- package/dist/registry/programs.d.ts.map +0 -1
- package/dist/registry/programs.js.map +0 -1
- package/dist/rescue/analyzer.d.ts.map +0 -1
- package/dist/rescue/analyzer.js.map +0 -1
- package/dist/rescue/builder.d.ts.map +0 -1
- package/dist/rescue/builder.js.map +0 -1
- package/dist/security/key-rotation.d.ts.map +0 -1
- package/dist/security/key-rotation.js.map +0 -1
- package/dist/semantics/decoder.d.ts.map +0 -1
- package/dist/semantics/decoder.js.map +0 -1
- package/dist/semantics/idl-registry.d.ts.map +0 -1
- package/dist/semantics/idl-registry.js.map +0 -1
- package/dist/semantics/types.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils/address.d.ts.map +0 -1
- package/dist/utils/address.js.map +0 -1
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- /package/dist/{crypto → sdk/crypto}/poseidon.d.ts +0 -0
- /package/dist/{crypto → sdk/crypto}/poseidon.js +0 -0
- /package/dist/{events → sdk/events}/bus.d.ts +0 -0
- /package/dist/{events → sdk/events}/bus.js +0 -0
- /package/dist/{index.d.ts → sdk/index.d.ts} +0 -0
- /package/dist/{index.js → sdk/index.js} +0 -0
- /package/dist/{integrity.d.ts → sdk/integrity.d.ts} +0 -0
- /package/dist/{integrity.js → sdk/integrity.js} +0 -0
- /package/dist/{network → sdk/network}/shadow-rpc.d.ts +0 -0
- /package/dist/{network → sdk/network}/shadow-rpc.js +0 -0
- /package/dist/{passport → sdk/passport}/manager.d.ts +0 -0
- /package/dist/{passport → sdk/passport}/manager.js +0 -0
- /package/dist/{pipeline.d.ts → sdk/pipeline.d.ts} +0 -0
- /package/dist/{pipeline.js → sdk/pipeline.js} +0 -0
- /package/dist/{privacy → sdk/privacy}/relayer.d.ts +0 -0
- /package/dist/{privacy → sdk/privacy}/relayer.js +0 -0
- /package/dist/{privacy-engine.d.ts → sdk/privacy-engine.d.ts} +0 -0
- /package/dist/{privacy-engine.js → sdk/privacy-engine.js} +0 -0
- /package/dist/{registry → sdk/registry}/idl-fetcher.d.ts +0 -0
- /package/dist/{registry → sdk/registry}/idl-fetcher.js +0 -0
- /package/dist/{registry → sdk/registry}/programs.d.ts +0 -0
- /package/dist/{registry → sdk/registry}/programs.js +0 -0
- /package/dist/{rescue → sdk/rescue}/analyzer.d.ts +0 -0
- /package/dist/{rescue → sdk/rescue}/analyzer.js +0 -0
- /package/dist/{rescue → sdk/rescue}/builder.d.ts +0 -0
- /package/dist/{rescue → sdk/rescue}/builder.js +0 -0
- /package/dist/{security → sdk/security}/key-rotation.d.ts +0 -0
- /package/dist/{security → sdk/security}/key-rotation.js +0 -0
- /package/dist/{semantics → sdk/semantics}/analyzer.d.ts +0 -0
- /package/dist/{semantics → sdk/semantics}/analyzer.js +0 -0
- /package/dist/{semantics → sdk/semantics}/decoder.d.ts +0 -0
- /package/dist/{semantics → sdk/semantics}/decoder.js +0 -0
- /package/dist/{semantics → sdk/semantics}/graph.d.ts +0 -0
- /package/dist/{semantics → sdk/semantics}/graph.js +0 -0
- /package/dist/{semantics → sdk/semantics}/idl-registry.d.ts +0 -0
- /package/dist/{semantics → sdk/semantics}/idl-registry.js +0 -0
- /package/dist/{semantics → sdk/semantics}/types.d.ts +0 -0
- /package/dist/{semantics → sdk/semantics}/types.js +0 -0
- /package/dist/{types.d.ts → sdk/types.d.ts} +0 -0
- /package/dist/{types.js → sdk/types.js} +0 -0
- /package/dist/{utils → sdk/utils}/address.d.ts +0 -0
- /package/dist/{utils → sdk/utils}/address.js +0 -0
- /package/dist/{utils → sdk/utils}/config.d.ts +0 -0
- /package/dist/{utils → sdk/utils}/config.js +0 -0
- /package/dist/{utils → sdk/utils}/logger.d.ts +0 -0
- /package/dist/{utils → sdk/utils}/logger.js +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ScanResult } from '../../sdk/pipeline';
|
|
2
|
+
export interface PrivacyBadge {
|
|
3
|
+
badgeType: 'GHOST' | 'SHIELD' | 'PHANTOM' | 'INVISIBLE';
|
|
4
|
+
score: number;
|
|
5
|
+
proofData: string;
|
|
6
|
+
imageUrl: string;
|
|
7
|
+
markdownEmbed: string;
|
|
8
|
+
htmlEmbed: string;
|
|
9
|
+
twitterText: string;
|
|
10
|
+
discordText: string;
|
|
11
|
+
}
|
|
12
|
+
export interface GhostScore {
|
|
13
|
+
score: number;
|
|
14
|
+
grade: 'A+' | 'A' | 'B' | 'C' | 'D' | 'F';
|
|
15
|
+
ghostLevel: 'Invisible' | 'Translucent' | 'Visible' | 'Exposed' | 'Glass House';
|
|
16
|
+
breakdown: {
|
|
17
|
+
anonymityScore: number;
|
|
18
|
+
linkageScore: number;
|
|
19
|
+
patternScore: number;
|
|
20
|
+
volumeScore: number;
|
|
21
|
+
timingScore: number;
|
|
22
|
+
};
|
|
23
|
+
threats: ThreatDetail[];
|
|
24
|
+
recommendations: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface ThreatDetail {
|
|
27
|
+
severity: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
|
|
28
|
+
category: 'CEX_LINK' | 'PATTERN_LEAK' | 'VOLUME_LEAK' | 'TIMING_LEAK' | 'DIRECT_LINK';
|
|
29
|
+
description: string;
|
|
30
|
+
hopCount?: number;
|
|
31
|
+
recommendation: string;
|
|
32
|
+
fixCommand?: string;
|
|
33
|
+
}
|
|
34
|
+
export declare class GhostScoreCalculator {
|
|
35
|
+
/**
|
|
36
|
+
* Calculate Ghost Score from existing scan results
|
|
37
|
+
* Non-breaking: uses existing ScanResult data
|
|
38
|
+
*/
|
|
39
|
+
static calculate(scanResults: ScanResult[]): GhostScore;
|
|
40
|
+
private static calculateAnonymityScore;
|
|
41
|
+
private static calculateLinkageScore;
|
|
42
|
+
private static calculatePatternScore;
|
|
43
|
+
private static calculateVolumeScore;
|
|
44
|
+
private static calculateTimingScore;
|
|
45
|
+
private static getGrade;
|
|
46
|
+
private static getGhostLevel;
|
|
47
|
+
private static extractThreats;
|
|
48
|
+
private static categorizeLeak;
|
|
49
|
+
private static generateFixCommand;
|
|
50
|
+
private static generateRecommendations;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=ghost-calculator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghost-calculator.d.ts","sourceRoot":"","sources":["../../../cli/utils/ghost-calculator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAC1C,UAAU,EAAE,WAAW,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;IAChF,SAAS,EAAE;QACT,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,QAAQ,EAAE,UAAU,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;IACtF,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAC/B;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU;IA4BvD,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAmBtC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IA+BpC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAgBpC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAYnC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAYnC,OAAO,CAAC,MAAM,CAAC,QAAQ;IASvB,OAAO,CAAC,MAAM,CAAC,aAAa;IAQ5B,OAAO,CAAC,MAAM,CAAC,cAAc;IA2B7B,OAAO,CAAC,MAAM,CAAC,cAAc;IAU7B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAcjC,OAAO,CAAC,MAAM,CAAC,uBAAuB;CA8CvC"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// cli/utils/ghost-calculator.ts
|
|
3
|
+
// Privacy Ghost Score Calculator
|
|
4
|
+
// Calculates comprehensive privacy score from existing scan results
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GhostScoreCalculator = void 0;
|
|
7
|
+
class GhostScoreCalculator {
|
|
8
|
+
/**
|
|
9
|
+
* Calculate Ghost Score from existing scan results
|
|
10
|
+
* Non-breaking: uses existing ScanResult data
|
|
11
|
+
*/
|
|
12
|
+
static calculate(scanResults) {
|
|
13
|
+
const breakdown = {
|
|
14
|
+
anonymityScore: this.calculateAnonymityScore(scanResults),
|
|
15
|
+
linkageScore: this.calculateLinkageScore(scanResults),
|
|
16
|
+
patternScore: this.calculatePatternScore(scanResults),
|
|
17
|
+
volumeScore: this.calculateVolumeScore(scanResults),
|
|
18
|
+
timingScore: this.calculateTimingScore(scanResults)
|
|
19
|
+
};
|
|
20
|
+
// Weighted average (linkage is most important)
|
|
21
|
+
const score = Math.round(breakdown.anonymityScore * 0.25 +
|
|
22
|
+
breakdown.linkageScore * 0.30 +
|
|
23
|
+
breakdown.patternScore * 0.20 +
|
|
24
|
+
breakdown.volumeScore * 0.15 +
|
|
25
|
+
breakdown.timingScore * 0.10);
|
|
26
|
+
return {
|
|
27
|
+
score,
|
|
28
|
+
grade: this.getGrade(score),
|
|
29
|
+
ghostLevel: this.getGhostLevel(score),
|
|
30
|
+
breakdown,
|
|
31
|
+
threats: this.extractThreats(scanResults),
|
|
32
|
+
recommendations: this.generateRecommendations(scanResults, score)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
static calculateAnonymityScore(results) {
|
|
36
|
+
if (results.length === 0)
|
|
37
|
+
return 50;
|
|
38
|
+
// Check average privacy score from existing scans
|
|
39
|
+
const avgScore = results.reduce((sum, r) => sum + r.privacyScore, 0) / results.length;
|
|
40
|
+
// Use existing privacy score as base
|
|
41
|
+
let score = avgScore;
|
|
42
|
+
// Bonus: Using shielded transactions
|
|
43
|
+
const shieldedCount = results.filter(r => r.privacyScore > 70).length;
|
|
44
|
+
const shieldedRatio = shieldedCount / results.length;
|
|
45
|
+
if (shieldedRatio > 0.5)
|
|
46
|
+
score += 10;
|
|
47
|
+
if (shieldedRatio > 0.8)
|
|
48
|
+
score += 5;
|
|
49
|
+
return Math.min(100, Math.round(score));
|
|
50
|
+
}
|
|
51
|
+
static calculateLinkageScore(results) {
|
|
52
|
+
const allLeaks = results.flatMap(r => r.leaks);
|
|
53
|
+
// Start at 100, penalize for each leak
|
|
54
|
+
let score = 100;
|
|
55
|
+
allLeaks.forEach(leak => {
|
|
56
|
+
const description = leak.description.toLowerCase();
|
|
57
|
+
// Heavy penalties for CEX links
|
|
58
|
+
if (description.includes('cex') || description.includes('exchange')) {
|
|
59
|
+
score -= leak.severity === 'CRITICAL' ? 20 : 10;
|
|
60
|
+
}
|
|
61
|
+
// Penalties for direct links
|
|
62
|
+
if (description.includes('direct link')) {
|
|
63
|
+
score -= leak.severity === 'CRITICAL' ? 15 : 8;
|
|
64
|
+
}
|
|
65
|
+
// Extract hop count and penalize
|
|
66
|
+
const hopMatch = description.match(/(\d+)\s*hop/i);
|
|
67
|
+
if (hopMatch) {
|
|
68
|
+
const hops = parseInt(hopMatch[1]);
|
|
69
|
+
// Closer = worse
|
|
70
|
+
score -= Math.max(0, 20 - hops * 2);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
return Math.max(0, Math.round(score));
|
|
74
|
+
}
|
|
75
|
+
static calculatePatternScore(results) {
|
|
76
|
+
if (results.length < 3)
|
|
77
|
+
return 70; // Not enough data
|
|
78
|
+
let score = 100;
|
|
79
|
+
// Check for patterns in existing leaks
|
|
80
|
+
const patternLeaks = results.flatMap(r => r.leaks).filter(leak => leak.description.toLowerCase().includes('pattern'));
|
|
81
|
+
// Penalize for pattern leaks
|
|
82
|
+
score -= patternLeaks.length * 10;
|
|
83
|
+
return Math.max(0, Math.min(100, score));
|
|
84
|
+
}
|
|
85
|
+
static calculateVolumeScore(results) {
|
|
86
|
+
// Check if volume-related leaks exist
|
|
87
|
+
const volumeLeaks = results.flatMap(r => r.leaks).filter(leak => leak.description.toLowerCase().includes('volume') ||
|
|
88
|
+
leak.description.toLowerCase().includes('amount'));
|
|
89
|
+
let score = 100 - (volumeLeaks.length * 12);
|
|
90
|
+
return Math.max(0, Math.min(100, score));
|
|
91
|
+
}
|
|
92
|
+
static calculateTimingScore(results) {
|
|
93
|
+
// Check for timing-related leaks
|
|
94
|
+
const timingLeaks = results.flatMap(r => r.leaks).filter(leak => leak.description.toLowerCase().includes('timing') ||
|
|
95
|
+
leak.description.toLowerCase().includes('time'));
|
|
96
|
+
let score = 100 - (timingLeaks.length * 10);
|
|
97
|
+
return Math.max(0, Math.min(100, score));
|
|
98
|
+
}
|
|
99
|
+
static getGrade(score) {
|
|
100
|
+
if (score >= 95)
|
|
101
|
+
return 'A+';
|
|
102
|
+
if (score >= 85)
|
|
103
|
+
return 'A';
|
|
104
|
+
if (score >= 70)
|
|
105
|
+
return 'B';
|
|
106
|
+
if (score >= 50)
|
|
107
|
+
return 'C';
|
|
108
|
+
if (score >= 30)
|
|
109
|
+
return 'D';
|
|
110
|
+
return 'F';
|
|
111
|
+
}
|
|
112
|
+
static getGhostLevel(score) {
|
|
113
|
+
if (score >= 90)
|
|
114
|
+
return 'Invisible';
|
|
115
|
+
if (score >= 70)
|
|
116
|
+
return 'Translucent';
|
|
117
|
+
if (score >= 50)
|
|
118
|
+
return 'Visible';
|
|
119
|
+
if (score >= 30)
|
|
120
|
+
return 'Exposed';
|
|
121
|
+
return 'Glass House';
|
|
122
|
+
}
|
|
123
|
+
static extractThreats(results) {
|
|
124
|
+
const threats = [];
|
|
125
|
+
results.forEach(result => {
|
|
126
|
+
result.leaks.forEach(leak => {
|
|
127
|
+
// Extract hop count from description if present
|
|
128
|
+
const hopMatch = leak.description.match(/(\d+)\s*hop/i);
|
|
129
|
+
const hopCount = hopMatch ? parseInt(hopMatch[1]) : undefined;
|
|
130
|
+
threats.push({
|
|
131
|
+
severity: leak.severity,
|
|
132
|
+
category: this.categorizeLeak(leak.description),
|
|
133
|
+
description: leak.description,
|
|
134
|
+
hopCount,
|
|
135
|
+
recommendation: leak.remediation || 'No specific remediation available',
|
|
136
|
+
fixCommand: this.generateFixCommand(leak)
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
// Sort by severity
|
|
141
|
+
return threats.sort((a, b) => {
|
|
142
|
+
const severityOrder = { CRITICAL: 0, HIGH: 1, MEDIUM: 2, LOW: 3 };
|
|
143
|
+
return severityOrder[a.severity] - severityOrder[b.severity];
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
static categorizeLeak(description) {
|
|
147
|
+
const lower = description.toLowerCase();
|
|
148
|
+
if (lower.includes('cex') || lower.includes('exchange'))
|
|
149
|
+
return 'CEX_LINK';
|
|
150
|
+
if (lower.includes('direct link'))
|
|
151
|
+
return 'DIRECT_LINK';
|
|
152
|
+
if (lower.includes('pattern'))
|
|
153
|
+
return 'PATTERN_LEAK';
|
|
154
|
+
if (lower.includes('volume') || lower.includes('amount'))
|
|
155
|
+
return 'VOLUME_LEAK';
|
|
156
|
+
if (lower.includes('timing') || lower.includes('time'))
|
|
157
|
+
return 'TIMING_LEAK';
|
|
158
|
+
return 'CEX_LINK'; // Default
|
|
159
|
+
}
|
|
160
|
+
static generateFixCommand(leak) {
|
|
161
|
+
const lower = leak.description.toLowerCase();
|
|
162
|
+
if (lower.includes('cex') || lower.includes('exchange')) {
|
|
163
|
+
return 'solvoid-scan shield <amount> --max-anonymity';
|
|
164
|
+
}
|
|
165
|
+
if (lower.includes('pattern')) {
|
|
166
|
+
return 'solvoid-scan shield <amount> --randomize-timing';
|
|
167
|
+
}
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
static generateRecommendations(results, score) {
|
|
171
|
+
const recommendations = [];
|
|
172
|
+
// Severity-based recommendations
|
|
173
|
+
if (score < 30) {
|
|
174
|
+
recommendations.push(' CRITICAL: Your wallet is a glass house. Immediate action required!');
|
|
175
|
+
recommendations.push('Use SolVoid shielding for ALL future transactions');
|
|
176
|
+
}
|
|
177
|
+
else if (score < 50) {
|
|
178
|
+
recommendations.push(' URGENT: Your wallet is heavily exposed. Use SolVoid shielding immediately.');
|
|
179
|
+
}
|
|
180
|
+
else if (score < 70) {
|
|
181
|
+
recommendations.push(' Your privacy needs improvement. Consider shielding your next transactions.');
|
|
182
|
+
}
|
|
183
|
+
// Specific recommendations based on leaks
|
|
184
|
+
const allLeaks = results.flatMap(r => r.leaks);
|
|
185
|
+
const cexLeaks = allLeaks.filter(l => l.description.toLowerCase().includes('cex') ||
|
|
186
|
+
l.description.toLowerCase().includes('exchange'));
|
|
187
|
+
if (cexLeaks.length > 0) {
|
|
188
|
+
recommendations.push(`Found ${cexLeaks.length} CEX link${cexLeaks.length > 1 ? 's' : ''}. Run: solvoid-scan rescue <address>`);
|
|
189
|
+
}
|
|
190
|
+
const patternLeaks = allLeaks.filter(l => l.description.toLowerCase().includes('pattern'));
|
|
191
|
+
if (patternLeaks.length > 0) {
|
|
192
|
+
recommendations.push('Randomize your transaction timing to avoid pattern detection');
|
|
193
|
+
recommendations.push('Vary transaction amounts (avoid round numbers like 1.0 SOL)');
|
|
194
|
+
}
|
|
195
|
+
// General best practices
|
|
196
|
+
if (score < 90) {
|
|
197
|
+
recommendations.push('Shield at least 50% of your transactions for baseline privacy');
|
|
198
|
+
recommendations.push('Use different withdrawal addresses each time');
|
|
199
|
+
}
|
|
200
|
+
if (score >= 90) {
|
|
201
|
+
recommendations.push(' Excellent privacy! Maintain this by continuing to use SolVoid shielding.');
|
|
202
|
+
}
|
|
203
|
+
return recommendations.slice(0, 5); // Max 5 recommendations
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
exports.GhostScoreCalculator = GhostScoreCalculator;
|
|
207
|
+
//# sourceMappingURL=ghost-calculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghost-calculator.js","sourceRoot":"","sources":["../../../cli/utils/ghost-calculator.ts"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,iCAAiC;AACjC,oEAAoE;;;AAuCpE,MAAa,oBAAoB;IAC/B;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,WAAyB;QACxC,MAAM,SAAS,GAAG;YAChB,cAAc,EAAE,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC;YACzD,YAAY,EAAE,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC;YACrD,YAAY,EAAE,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC;YACrD,WAAW,EAAE,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;YACnD,WAAW,EAAE,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;SACpD,CAAC;QAEF,+CAA+C;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACtB,SAAS,CAAC,cAAc,GAAG,IAAI;YAC/B,SAAS,CAAC,YAAY,GAAG,IAAI;YAC7B,SAAS,CAAC,YAAY,GAAG,IAAI;YAC7B,SAAS,CAAC,WAAW,GAAG,IAAI;YAC5B,SAAS,CAAC,WAAW,GAAG,IAAI,CAC7B,CAAC;QAEF,OAAO;YACL,KAAK;YACL,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC3B,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YACrC,SAAS;YACT,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;YACzC,eAAe,EAAE,IAAI,CAAC,uBAAuB,CAAC,WAAW,EAAE,KAAK,CAAC;SAClE,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,uBAAuB,CAAC,OAAqB;QAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,kDAAkD;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAEtF,qCAAqC;QACrC,IAAI,KAAK,GAAG,QAAQ,CAAC;QAErB,qCAAqC;QACrC,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC;QACtE,MAAM,aAAa,GAAG,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;QAErD,IAAI,aAAa,GAAG,GAAG;YAAE,KAAK,IAAI,EAAE,CAAC;QACrC,IAAI,aAAa,GAAG,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;QAEpC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,OAAqB;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAE/C,uCAAuC;QACvC,IAAI,KAAK,GAAG,GAAG,CAAC;QAEhB,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACtB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YAEnD,gCAAgC;YAChC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpE,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,CAAC;YAED,6BAA6B;YAC7B,IAAI,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBACxC,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,CAAC;YAED,iCAAiC;YACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACnD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,iBAAiB;gBACjB,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,OAAqB;QACxD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC,CAAC,kBAAkB;QAErD,IAAI,KAAK,GAAG,GAAG,CAAC;QAEhB,uCAAuC;QACvC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAC/D,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CACnD,CAAC;QAEF,6BAA6B;QAC7B,KAAK,IAAI,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC;QAElC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAAC,OAAqB;QACvD,sCAAsC;QACtC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAC9D,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACjD,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAClD,CAAC;QAEF,IAAI,KAAK,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAE5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAAC,OAAqB;QACvD,iCAAiC;QACjC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAC9D,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACjD,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAChD,CAAC;QAEF,IAAI,KAAK,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAE5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAEO,MAAM,CAAC,QAAQ,CAAC,KAAa;QACnC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QAC7B,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC;QAC5B,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC;QAC5B,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC;QAC5B,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,MAAM,CAAC,aAAa,CAAC,KAAa;QACxC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,WAAW,CAAC;QACpC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,aAAa,CAAC;QACtC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QAClC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QAClC,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,OAAqB;QACjD,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACvB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC1B,gDAAgD;gBAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAE9D,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ,EAAE,IAAI,CAAC,QAAe;oBAC9B,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;oBAC/C,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,QAAQ;oBACR,cAAc,EAAE,IAAI,CAAC,WAAW,IAAI,mCAAmC;oBACvE,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;iBAC1C,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,mBAAmB;QACnB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3B,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YAClE,OAAO,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,WAAmB;QAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC;QAC3E,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;YAAE,OAAO,aAAa,CAAC;QACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,cAAc,CAAC;QACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,aAAa,CAAC;QAC/E,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,aAAa,CAAC;QAC7E,OAAO,UAAU,CAAC,CAAC,UAAU;IAC/B,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,IAAS;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QAE7C,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,OAAO,8CAA8C,CAAC;QACxD,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,iDAAiD,CAAC;QAC3D,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,MAAM,CAAC,uBAAuB,CAAC,OAAqB,EAAE,KAAa;QACzE,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,iCAAiC;QACjC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YACf,eAAe,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;YAC5F,eAAe,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YACtB,eAAe,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QACtG,CAAC;aAAM,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YACtB,eAAe,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;QACvG,CAAC;QAED,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACnC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC3C,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CACjD,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,eAAe,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,MAAM,YAAY,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAC;QACjI,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACvC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAChD,CAAC;QAEF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,eAAe,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;YACrF,eAAe,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QACtF,CAAC;QAED,yBAAyB;QACzB,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YACf,eAAe,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;YACtF,eAAe,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YAChB,eAAe,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;QACpG,CAAC;QAED,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,wBAAwB;IAC9D,CAAC;CACF;AA7OD,oDA6OC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Connection, PublicKey, Keypair } from '@solana/web3.js';
|
|
2
|
+
interface RescueParams {
|
|
3
|
+
sourceKeypair: Keypair;
|
|
4
|
+
destination: PublicKey;
|
|
5
|
+
assets: any;
|
|
6
|
+
emergencyMode: boolean;
|
|
7
|
+
useJitoBundle: boolean;
|
|
8
|
+
reason: string;
|
|
9
|
+
}
|
|
10
|
+
interface RescueResult {
|
|
11
|
+
signature: string;
|
|
12
|
+
slot: number;
|
|
13
|
+
rescued: {
|
|
14
|
+
sol: string;
|
|
15
|
+
tokens: number;
|
|
16
|
+
nfts: number;
|
|
17
|
+
};
|
|
18
|
+
executionTime: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class RescueEngine {
|
|
21
|
+
private connection;
|
|
22
|
+
private programId;
|
|
23
|
+
constructor(connection: Connection, programId: string);
|
|
24
|
+
/**
|
|
25
|
+
* Execute atomic rescue - all assets moved in single transaction
|
|
26
|
+
*/
|
|
27
|
+
executeAtomicRescue(params: RescueParams): Promise<RescueResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Build SOL transfer instruction
|
|
30
|
+
*/
|
|
31
|
+
private buildSOLTransferInstruction;
|
|
32
|
+
/**
|
|
33
|
+
* Build shield instruction for privacy
|
|
34
|
+
*/
|
|
35
|
+
private buildShieldInstruction;
|
|
36
|
+
/**
|
|
37
|
+
* Create compute budget instruction
|
|
38
|
+
*/
|
|
39
|
+
private createComputeBudgetInstruction;
|
|
40
|
+
/**
|
|
41
|
+
* Create priority fee instruction
|
|
42
|
+
*/
|
|
43
|
+
private createPriorityFeeInstruction;
|
|
44
|
+
/**
|
|
45
|
+
* Execute transaction with retries
|
|
46
|
+
*/
|
|
47
|
+
private executeWithRetries;
|
|
48
|
+
/**
|
|
49
|
+
* Execute via Jito MEV bundle (front-running)
|
|
50
|
+
*/
|
|
51
|
+
private executeViaJitoBundle;
|
|
52
|
+
/**
|
|
53
|
+
* Estimate rescue fees
|
|
54
|
+
*/
|
|
55
|
+
estimateFees(assets: any, emergencyMode: boolean): Promise<{
|
|
56
|
+
fees: number;
|
|
57
|
+
breakdown: any;
|
|
58
|
+
}>;
|
|
59
|
+
}
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=rescue-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rescue-engine.d.ts","sourceRoot":"","sources":["../../../cli/utils/rescue-engine.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,UAAU,EACV,SAAS,EAGT,OAAO,EAIR,MAAM,iBAAiB,CAAC;AAGzB,UAAU,YAAY;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,SAAS,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC;IACZ,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAY;gBAEjB,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM;IAKrD;;OAEG;IACG,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAiFtE;;OAEG;YACW,2BAA2B;IAiBzC;;OAEG;YACW,sBAAsB;IAsBpC;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAWtC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAWpC;;OAEG;YACW,kBAAkB;IAsChC;;OAEG;YACW,oBAAoB;IAwClC;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,GAAG,EACX,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,GAAG,CAAA;KAAE,CAAC;CAqB7C"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// cli/utils/rescue-engine.ts
|
|
3
|
+
// Core Atomic Rescue Engine
|
|
4
|
+
// Executes emergency wallet rescue in a single atomic transaction
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RescueEngine = void 0;
|
|
7
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
8
|
+
class RescueEngine {
|
|
9
|
+
constructor(connection, programId) {
|
|
10
|
+
this.connection = connection;
|
|
11
|
+
this.programId = new web3_js_1.PublicKey(programId);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Execute atomic rescue - all assets moved in single transaction
|
|
15
|
+
*/
|
|
16
|
+
async executeAtomicRescue(params) {
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
// Build atomic transaction with all rescue instructions
|
|
19
|
+
const transaction = new web3_js_1.Transaction();
|
|
20
|
+
// Step 1: Add compute budget if emergency mode
|
|
21
|
+
if (params.emergencyMode) {
|
|
22
|
+
transaction.add(this.createComputeBudgetInstruction(1400000) // Max compute units
|
|
23
|
+
);
|
|
24
|
+
transaction.add(this.createPriorityFeeInstruction(100000) // High priority fee (0.0001 SOL per CU)
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
// Step 2: Transfer SOL (simplified - tokens would need proper implementation)
|
|
28
|
+
const solInstruction = await this.buildSOLTransferInstruction(params.sourceKeypair.publicKey, params.destination, params.assets.sol.lamports, params.emergencyMode);
|
|
29
|
+
transaction.add(solInstruction);
|
|
30
|
+
// Step 3: Add shield instruction (ZK commitment)
|
|
31
|
+
const shieldInstruction = await this.buildShieldInstruction(params.destination, params.assets.total.value);
|
|
32
|
+
transaction.add(shieldInstruction);
|
|
33
|
+
// Get recent blockhash with commitment
|
|
34
|
+
const { blockhash, lastValidBlockHeight } = await this.connection.getLatestBlockhash('finalized');
|
|
35
|
+
transaction.recentBlockhash = blockhash;
|
|
36
|
+
transaction.feePayer = params.sourceKeypair.publicKey;
|
|
37
|
+
// Sign transaction
|
|
38
|
+
transaction.sign(params.sourceKeypair);
|
|
39
|
+
// Execute based on mode
|
|
40
|
+
let signature;
|
|
41
|
+
if (params.useJitoBundle) {
|
|
42
|
+
// Use Jito MEV to front-run attackers
|
|
43
|
+
signature = await this.executeViaJitoBundle(transaction, params.sourceKeypair);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Standard execution with max retries
|
|
47
|
+
signature = await this.executeWithRetries(transaction, params.sourceKeypair, params.emergencyMode ? 5 : 3);
|
|
48
|
+
}
|
|
49
|
+
// Wait for confirmation
|
|
50
|
+
const confirmation = await this.connection.confirmTransaction({
|
|
51
|
+
signature,
|
|
52
|
+
blockhash,
|
|
53
|
+
lastValidBlockHeight
|
|
54
|
+
}, 'confirmed');
|
|
55
|
+
if (confirmation.value.err) {
|
|
56
|
+
throw new Error(`Transaction failed: ${confirmation.value.err}`);
|
|
57
|
+
}
|
|
58
|
+
// Get slot number
|
|
59
|
+
const status = await this.connection.getSignatureStatus(signature);
|
|
60
|
+
return {
|
|
61
|
+
signature,
|
|
62
|
+
slot: status.value?.slot || 0,
|
|
63
|
+
rescued: {
|
|
64
|
+
sol: (params.assets.sol.lamports / web3_js_1.LAMPORTS_PER_SOL).toFixed(4),
|
|
65
|
+
tokens: params.assets.tokens.length,
|
|
66
|
+
nfts: params.assets.nfts.length
|
|
67
|
+
},
|
|
68
|
+
executionTime: Date.now() - startTime
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Build SOL transfer instruction
|
|
73
|
+
*/
|
|
74
|
+
async buildSOLTransferInstruction(source, destination, totalLamports, emergencyMode) {
|
|
75
|
+
// Reserve SOL for transaction fees
|
|
76
|
+
const feeReserve = emergencyMode ? 0.15 * web3_js_1.LAMPORTS_PER_SOL : 0.02 * web3_js_1.LAMPORTS_PER_SOL;
|
|
77
|
+
const transferAmount = Math.max(0, totalLamports - feeReserve);
|
|
78
|
+
return web3_js_1.SystemProgram.transfer({
|
|
79
|
+
fromPubkey: source,
|
|
80
|
+
toPubkey: destination,
|
|
81
|
+
lamports: transferAmount
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Build shield instruction for privacy
|
|
86
|
+
*/
|
|
87
|
+
async buildShieldInstruction(recipient, totalValue) {
|
|
88
|
+
// This would call your actual SolVoid shield program
|
|
89
|
+
// For now, a placeholder that demonstrates the concept
|
|
90
|
+
const valueBuffer = Buffer.alloc(8);
|
|
91
|
+
valueBuffer.writeBigUInt64BE(BigInt(totalValue), 0);
|
|
92
|
+
const instruction = new web3_js_1.TransactionInstruction({
|
|
93
|
+
programId: this.programId,
|
|
94
|
+
keys: [
|
|
95
|
+
{ pubkey: recipient, isSigner: false, isWritable: true },
|
|
96
|
+
{ pubkey: web3_js_1.SystemProgram.programId, isSigner: false, isWritable: false }
|
|
97
|
+
],
|
|
98
|
+
data: Buffer.concat([Buffer.from([0x01]), valueBuffer]) // Shield instruction
|
|
99
|
+
});
|
|
100
|
+
return instruction;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create compute budget instruction
|
|
104
|
+
*/
|
|
105
|
+
createComputeBudgetInstruction(units) {
|
|
106
|
+
const unitsBuffer = Buffer.alloc(4);
|
|
107
|
+
unitsBuffer.writeUInt32LE(units, 0);
|
|
108
|
+
return new web3_js_1.TransactionInstruction({
|
|
109
|
+
programId: new web3_js_1.PublicKey('ComputeBudget111111111111111111111111111111'),
|
|
110
|
+
keys: [],
|
|
111
|
+
data: Buffer.concat([Buffer.from([0x00]), unitsBuffer])
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Create priority fee instruction
|
|
116
|
+
*/
|
|
117
|
+
createPriorityFeeInstruction(microLamports) {
|
|
118
|
+
const feeBuffer = Buffer.alloc(8);
|
|
119
|
+
feeBuffer.writeBigUInt64LE(BigInt(microLamports), 0);
|
|
120
|
+
return new web3_js_1.TransactionInstruction({
|
|
121
|
+
programId: new web3_js_1.PublicKey('ComputeBudget111111111111111111111111111111'),
|
|
122
|
+
keys: [],
|
|
123
|
+
data: Buffer.concat([Buffer.from([0x03]), feeBuffer])
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Execute transaction with retries
|
|
128
|
+
*/
|
|
129
|
+
async executeWithRetries(transaction, signer, maxRetries) {
|
|
130
|
+
let lastError = null;
|
|
131
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
132
|
+
try {
|
|
133
|
+
const signature = await (0, web3_js_1.sendAndConfirmTransaction)(this.connection, transaction, [signer], {
|
|
134
|
+
commitment: 'confirmed',
|
|
135
|
+
maxRetries: 0 // We handle retries manually
|
|
136
|
+
});
|
|
137
|
+
return signature;
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
lastError = error;
|
|
141
|
+
// If blockhash expired, get new one
|
|
142
|
+
if (error.message.includes('blockhash')) {
|
|
143
|
+
const { blockhash } = await this.connection.getLatestBlockhash('finalized');
|
|
144
|
+
transaction.recentBlockhash = blockhash;
|
|
145
|
+
transaction.sign(signer);
|
|
146
|
+
}
|
|
147
|
+
// Wait before retry
|
|
148
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
throw lastError || new Error('Transaction failed after retries');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Execute via Jito MEV bundle (front-running)
|
|
155
|
+
*/
|
|
156
|
+
async executeViaJitoBundle(transaction, signer) {
|
|
157
|
+
// Jito bundle execution
|
|
158
|
+
// This would integrate with Jito's MEV service
|
|
159
|
+
// For now, fallback to regular execution with high priority
|
|
160
|
+
const jitoUrl = 'https://mainnet.block-engine.jito.wtf/api/v1/bundles';
|
|
161
|
+
try {
|
|
162
|
+
// Serialize and encode transaction
|
|
163
|
+
const serialized = transaction.serialize();
|
|
164
|
+
const encoded = Buffer.from(serialized).toString('base64');
|
|
165
|
+
// Submit bundle to Jito
|
|
166
|
+
const response = await fetch(jitoUrl, {
|
|
167
|
+
method: 'POST',
|
|
168
|
+
headers: { 'Content-Type': 'application/json' },
|
|
169
|
+
body: JSON.stringify({
|
|
170
|
+
jsonrpc: '2.0',
|
|
171
|
+
id: 1,
|
|
172
|
+
method: 'sendBundle',
|
|
173
|
+
params: [[encoded]]
|
|
174
|
+
})
|
|
175
|
+
});
|
|
176
|
+
const result = await response.json();
|
|
177
|
+
if (result.error) {
|
|
178
|
+
throw new Error(result.error.message);
|
|
179
|
+
}
|
|
180
|
+
return result.result;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
console.warn('Jito bundle failed, falling back to regular execution');
|
|
184
|
+
return this.executeWithRetries(transaction, signer, 5);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Estimate rescue fees
|
|
189
|
+
*/
|
|
190
|
+
async estimateFees(assets, emergencyMode) {
|
|
191
|
+
const baseFee = 5000; // lamports per signature
|
|
192
|
+
const tokenFees = assets.tokens.length * 10000; // Account creation + transfer
|
|
193
|
+
const nftFees = assets.nfts.length * 10000;
|
|
194
|
+
const priorityFee = emergencyMode ? 0.1 * web3_js_1.LAMPORTS_PER_SOL : 0;
|
|
195
|
+
const jitoTip = emergencyMode ? 0.05 * web3_js_1.LAMPORTS_PER_SOL : 0;
|
|
196
|
+
const totalFees = baseFee + tokenFees + nftFees + priorityFee + jitoTip;
|
|
197
|
+
return {
|
|
198
|
+
fees: totalFees,
|
|
199
|
+
breakdown: {
|
|
200
|
+
base: baseFee,
|
|
201
|
+
tokens: tokenFees,
|
|
202
|
+
nfts: nftFees,
|
|
203
|
+
priority: priorityFee,
|
|
204
|
+
jitoTip: jitoTip
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
exports.RescueEngine = RescueEngine;
|
|
210
|
+
//# sourceMappingURL=rescue-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rescue-engine.js","sourceRoot":"","sources":["../../../cli/utils/rescue-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Connection, PublicKey } from '@solana/web3.js';
|
|
2
|
+
export interface Threat {
|
|
3
|
+
type: 'DRAINER' | 'MEV_BOT' | 'SANDWICH_ATTACK' | 'KEY_LEAK' | 'TRACKING' | 'UNKNOWN';
|
|
4
|
+
severity: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
|
|
5
|
+
description: string;
|
|
6
|
+
confidence: number;
|
|
7
|
+
evidence: any[];
|
|
8
|
+
timestamp: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class ThreatDetector {
|
|
11
|
+
private connection;
|
|
12
|
+
private knownDrainers;
|
|
13
|
+
private knownMEVBots;
|
|
14
|
+
constructor(connection: Connection);
|
|
15
|
+
/**
|
|
16
|
+
* Scan for active threats
|
|
17
|
+
*/
|
|
18
|
+
scan(address: PublicKey): Promise<Threat[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Detect active drainer
|
|
21
|
+
*/
|
|
22
|
+
private detectDrainer;
|
|
23
|
+
/**
|
|
24
|
+
* Detect MEV bot activity
|
|
25
|
+
*/
|
|
26
|
+
private detectMEVBot;
|
|
27
|
+
/**
|
|
28
|
+
* Detect potential key leak
|
|
29
|
+
*/
|
|
30
|
+
private detectKeyLeak;
|
|
31
|
+
/**
|
|
32
|
+
* Detect tracking/surveillance
|
|
33
|
+
*/
|
|
34
|
+
private detectTracking;
|
|
35
|
+
/**
|
|
36
|
+
* Detect suspicious transaction patterns
|
|
37
|
+
*/
|
|
38
|
+
private detectSuspiciousPatterns;
|
|
39
|
+
/**
|
|
40
|
+
* Check if transaction has suspicious approval
|
|
41
|
+
*/
|
|
42
|
+
private isSuspiciousApproval;
|
|
43
|
+
/**
|
|
44
|
+
* Get threat severity color
|
|
45
|
+
*/
|
|
46
|
+
static getSeverityColor(severity: Threat['severity']): string;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=threat-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threat-detector.d.ts","sourceRoot":"","sources":["../../../cli/utils/threat-detector.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACtF,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,YAAY,CAAc;gBAEtB,UAAU,EAAE,UAAU;IAelC;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiCjD;;OAEG;YACW,aAAa;IA0D3B;;OAEG;YACW,YAAY;IAiE1B;;OAEG;YACW,aAAa;IA0E3B;;OAEG;YACW,cAAc;IAuD5B;;OAEG;YACW,wBAAwB;IA6BtC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM;CAQ9D"}
|