UNPKG

pact-audit-free

Version:

Free smart contract security scanner using Slither static analysis

119 lines 5.66 kB
"use strict"; 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