solidityscan
Version:
SolidityScan is a tool for scanning Solidity smart contracts for vulnerabilities.
115 lines (105 loc) • 3.5 kB
JavaScript
const utils = require("./utils");
const fs = require("fs");
const cliSpinners = require("cli-spinners");
const spinner = cliSpinners.dots;
async function projectScan(projectPayload, apiToken) {
const request_payload = {
action: "message",
payload: {
type: "private_project_scan_initiate",
body: projectPayload,
},
};
return utils.initializeWebSocket(apiToken, request_payload);
}
async function contractScan(contractPayload, apiToken) {
const request_payload = {
action: "message",
payload: {
type: "private_threat_scan_initiate",
body: contractPayload,
},
};
return utils.initializeWebSocket(apiToken, request_payload);
}
async function analyzeProject(projectDirectory, apiToken, projectName, isRunningTest = false) {
try {
const initializingSpinner = await utils.showSpinnerWithStatus(
"Initializing Scan",
spinner.frames
);
const projectZipPath = await utils.createProjectZip(projectDirectory);
const uploadUrl = await utils.getUploadPresignedUrl(
projectZipPath,
apiToken
);
if (uploadUrl) {
const fileData = fs.readFileSync(projectZipPath);
const uploadSuccessful = await utils.uploadToS3(fileData, uploadUrl);
if (uploadSuccessful) {
utils.stopSpinner(initializingSpinner, "Initializing Scan");
const scanningSpinner = await utils.showSpinnerWithStatus(
"Scan in progress",
spinner.frames
);
const request_payload = {
type: "private_project_scan_initiate",
body: {
file_urls: [uploadUrl],
project_name: projectName,
project_visibility: "public",
project_type: "new",
},
};
const result = utils.initializeWebSocket(
apiToken,
request_payload,
scanningSpinner
);
return result;
}
} else {
throw new Error(`Error analyzing project`);
}
} catch (error) {
throw new Error(`Error analyzing project from directory: ${error.message}`);
}
}
async function runTests(projectDirectory, apiToken, projectName) {
try {
const results = await analyzeProject(projectDirectory, apiToken, projectName, true);
if (results && results.scan_details && results.scan_details.link) {
const axios = require('axios');
const response = await axios.get(results.scan_details.link, {
httpsAgent: new (require('https').Agent)({
rejectUnauthorized: false
})
});
const scanData = response.data;
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
const filename = `scan-result-${results.scan_id}-${timestamp}.json`;
fs.writeFileSync(filename, JSON.stringify(scanData, null, 2));
console.log(`\nScan results saved to: ${filename}`);
return {
metadata: results,
scanDetails: scanData,
resultFile: filename
};
} else {
console.error("Error: Scan results link not found in the response");
return results;
}
} catch (error) {
console.error("Error during scan:", error.message);
if (error.response) {
console.error("API response error:", error.response.data);
}
throw error;
}
}
module.exports = {
projectScan,
contractScan,
analyzeProject,
runTests,
};