UNPKG

solidityscan

Version:

SolidityScan is a tool for scanning Solidity smart contracts for vulnerabilities.

144 lines (127 loc) 4.54 kB
const { default: axios } = require("axios"); const { projectScan, contractScan, analyzeProject } = require("./api"); const utils = require("./utils"); function scan() { const [, , ...args] = process.argv; if (args[0] === "scan") { const scanType = args[1]; if (scanType === "project") { const provider = args[2]; const projectUrl = args[3]; const projectBranch = args[4]; const projecName = args[5]; const recurScan = args[7]; const apiKey = process.env.SOLIDITYSCAN_API_KEY || args[6]; if (!provider || !projectUrl || !projectBranch || !projecName) { console.error("Usage: solisityscan scan <projectUrl> <branch>"); process.exit(1); } const payload = { provider: provider, project_url: projectUrl, project_name: projecName, project_branch: projectBranch, recur_scans: recurScan || false, skip_file_paths: [], }; projectScan(payload, apiKey) .then((results) => { console.log("Scan results:", results); }) .catch((error) => { console.error("Error during scan:", error); }); } else if (scanType === "contract") { const contractAddress = args[2]; const contractChain = args[3]; const contractPlatform = args[4]; const cliProvidedToken = args[5]; // CLI provided token if (!contractAddress || !contractChain || !contractPlatform) { console.error("Usage: solisityscan scan contract <address> <chain> <platform> [apiToken]"); process.exit(1); } try { // Get API token from environment or command line const apiToken = process.env.SOLIDITYSCAN_API_KEY || cliProvidedToken; if (!apiToken) { console.error("No API token provided. Please set SOLIDITYSCAN_API_KEY environment variable or provide token as argument."); process.exit(1); } const payload = { contract_address: contractAddress, contract_platform: contractPlatform, contract_chain: contractChain, }; contractScan(payload, apiToken) .then((results) => { console.log("Scan results:",JSON.stringify(results, null, 2)); }) .catch((error) => { console.error("\nError during scan:", error); }); } catch (error) { console.error("\nError with API token:", error); process.exit(1); } } } else if (args[0] === "local") { const projectPath = args[1]; const apiKeyFromArgs = args[2] && !process.env.SOLIDITYSCAN_API_KEY; const apiKey = process.env.SOLIDITYSCAN_API_KEY || args[2]; const projectName = apiKeyFromArgs ? args[3] : args[2]; if(!projectName){ projectName = "LocalScan"; } if (!projectPath) { console.error("Usage: solisityscan run-tests <projectPath>"); process.exit(1); } analyzeProject(projectPath, apiKey, projectName) .then((results) => { if(results?.scan_details?.link){ axios.get(results.scan_details.link) .then((response) => { utils.displayScanResults(response.data.scan_report); }) .catch((error) => { console.error("Error during scan:", error); }); } }) .catch((error) => { console.error("Error during scan:", error); }); } else if (args.includes("-l")) { // Start local WebSocket file server to expose file system const dirFlagIndex = args.indexOf("-p"); const serveDirectory = dirFlagIndex !== -1 && args[dirFlagIndex + 1] ? args[dirFlagIndex + 1] : process.cwd(); const portFlagIndex = args.indexOf("--port"); const port = portFlagIndex !== -1 && args[portFlagIndex + 1] ? parseInt(args[portFlagIndex + 1], 10) : 8080; try { utils.startLocalFileServer(serveDirectory, port); } catch (error) { console.error(error.message); process.exit(1); } // keep the process alive when in local server mode return; } else { console.error( "Unknown command. Usage: solidityscan scan <projectUrl> <branch> <apiKey>" ); process.exit(1); } } if (require.main === module) { // executed via `node src/cli.js ...` – run the CLI scan(); } module.exports = { scan, };