pact-audit-free
Version:
Free smart contract security scanner using Slither static analysis
119 lines • 5.66 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.scanContract = scanContract;
const chalk_1 = __importDefault(require("chalk"));
const fs_1 = require("fs");
const path_1 = require("path");
const slither_1 = require("./utils/slither");
const formatter_1 = require("./utils/formatter");
async function scanContract(target, options) {
try {
// Display banner
(0, formatter_1.printBanner)();
console.log('');
// Resolve target path
const targetPath = (0, path_1.resolve)(target);
console.log(chalk_1.default.blue(`🎯 Target: ${targetPath}`));
// Validate target path
console.log(chalk_1.default.blue('📋 Validating target path...'));
const validation = (0, slither_1.validatePath)(targetPath);
if (!validation.valid) {
console.error(chalk_1.default.red(`❌ Error: ${validation.error}`));
process.exit(1);
}
console.log(chalk_1.default.green('✅ Path validation passed'));
// Check Slither installation
console.log(chalk_1.default.blue('🔧 Checking Slither installation...'));
const isSlitherInstalled = await (0, slither_1.checkSlitherInstallation)();
if (!isSlitherInstalled) {
console.error(chalk_1.default.red('❌ Slither not found.'));
console.log('');
console.log(chalk_1.default.yellow('To install Slither:'));
console.log(chalk_1.default.cyan(' pip install slither-analyzer'));
console.log('');
console.log(chalk_1.default.yellow('Or using pip3:'));
console.log(chalk_1.default.cyan(' pip3 install slither-analyzer'));
console.log('');
console.log(chalk_1.default.yellow('For more installation options, visit:'));
console.log(chalk_1.default.cyan(' https://github.com/crytic/slither#installation'));
process.exit(1);
}
console.log(chalk_1.default.green('✅ Slither is installed and ready'));
// Run the scan
console.log('');
console.log(chalk_1.default.blue('🔍 Running Slither security analysis...'));
const result = await (0, slither_1.runSlitherScan)(targetPath);
if (!result.success) {
console.error(chalk_1.default.red(`❌ Scan failed: ${result.error}`));
if (result.rawOutput) {
console.log('');
console.log(chalk_1.default.gray('Raw Slither output:'));
console.log(result.rawOutput);
}
process.exit(1);
}
console.log(chalk_1.default.green('✅ Scan completed'));
// Output results
if (options.json) {
// JSON output to stdout
console.log(JSON.stringify(result.vulnerabilities, null, 2));
}
else {
// Formatted terminal output
(0, formatter_1.formatResults)(result.vulnerabilities);
}
// Save to file if requested
if (options.output) {
try {
const outputData = {
timestamp: new Date().toISOString(),
target: targetPath,
vulnerabilities: result.vulnerabilities,
summary: {
total: result.vulnerabilities.length,
high: result.vulnerabilities.filter(v => v.severity === 'HIGH').length,
medium: result.vulnerabilities.filter(v => v.severity === 'MEDIUM').length,
low: result.vulnerabilities.filter(v => v.severity === 'LOW').length,
informational: result.vulnerabilities.filter(v => v.severity === 'INFORMATIONAL').length,
}
};
(0, fs_1.writeFileSync)(options.output, JSON.stringify(outputData, null, 2));
console.log('');
console.log(chalk_1.default.green(`📄 Results saved to: ${options.output}`));
}
catch (error) {
console.warn(chalk_1.default.yellow(`⚠️ Warning: Failed to save results to file: ${error}`));
}
}
// Add upgrade promotion (non-intrusive)
if (!options.json) {
console.log('');
console.log(chalk_1.default.gray('━'.repeat(50)));
console.log(chalk_1.default.blue('🚀 Need advanced features?'));
console.log(chalk_1.default.cyan(' • AI-powered vulnerability analysis'));
console.log(chalk_1.default.cyan(' • Gas optimization recommendations'));
console.log(chalk_1.default.cyan(' • Detailed remediation guides'));
console.log(chalk_1.default.gray(' Learn more: https://pactprotocol.io/audit'));
}
// Exit with appropriate code based on severity
const hasHigh = result.vulnerabilities.some(v => v.severity === 'HIGH');
const hasMedium = result.vulnerabilities.some(v => v.severity === 'MEDIUM');
if (hasHigh) {
process.exit(2); // Exit code 2 for high severity issues
}
else if (hasMedium) {
process.exit(1); // Exit code 1 for medium severity issues
}
else {
process.exit(0); // Exit code 0 for success
}
}
catch (error) {
console.error(chalk_1.default.red(`❌ Unexpected error: ${error}`));
process.exit(1);
}
}
//# sourceMappingURL=scanner.js.map