diff --git a/package.json b/package.json index 17f954a6..4cb91cbb 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ "scripts": { "test": "hardhat run scripts/tests/global-test.ts", "coverage": "./node_modules/.bin/solidity-coverage", - "check": "ts-node status-checks/huskyCheck.ts", - "check-husky": "ts-node status-checks/huskyCheck.ts", + "check": "node status-checks/huskyCheck.js", + "check-husky": "node status-checks/huskyCheck.js", "deploy": "node scripts/deployConnectorsFromCmd.js", "test:runner": "hardhat run scripts/tests/run-tests.ts", "typechain": "hardhat typechain", diff --git a/status-checks/check.js b/status-checks/check.js new file mode 100644 index 00000000..dfd33130 --- /dev/null +++ b/status-checks/check.js @@ -0,0 +1,436 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __importStar(require("fs")); +const path = __importStar(require("path")); +const forbiddenStrings = ["selfdestruct"]; +const getConnectorsList = async (connectorsRootsDirs) => { + try { + const connectors = []; + for (let index = 0; index < connectorsRootsDirs.length; index++) { + const dirs = [connectorsRootsDirs[index]]; + while (dirs.length) { + const currentDir = dirs.pop(); + const subs = fs.readdirSync(currentDir, { withFileTypes: true }); + for (let index = 0; index < subs.length; index++) { + const sub = subs[index]; + if (sub.isFile() && sub.name === "main.sol") { + connectors.push(currentDir); + } + else if (sub.isDirectory()) { + dirs.push(`${currentDir}/${sub.name}`); + } + } + } + } + return connectors.map((dir) => ({ path: dir })); + } + catch (error) { + return Promise.reject(error); + } +}; +const checkCodeForbidden = async (code, codePath) => { + try { + const forbidden = []; + for (let i1 = 0; i1 < forbiddenStrings.length; i1++) { + const forbiddenStr = forbiddenStrings[i1]; + const strs = code.split("\n"); + for (let i2 = 0; i2 < strs.length; i2++) { + if (strs[i2].includes(forbiddenStr)) { + forbidden.push(`found '${forbiddenStr}' in ${codePath}:${i2 + 1}`); + } + } + } + return forbidden; + } + catch (error) { + return Promise.reject(error); + } +}; +const checkForbidden = async (parentPath, codePath = "./main.sol") => { + try { + if (codePath.startsWith("@")) { + codePath = path.resolve("node_modules", `./${codePath}`); + } + else { + codePath = path.resolve(parentPath, codePath); + } + const code = fs.readFileSync(codePath, { encoding: "utf8" }); + const forbidden = await checkCodeForbidden(code, codePath); + if (code.includes("import")) { + const importsPathes = code + .split("\n") + .filter((str) => str.includes("import") && + str.includes("from") && + str.includes(".sol")) + .map((str) => str.split("from")[1].replace(/["; ]/gi, "")); + for (let index = 0; index < importsPathes.length; index++) { + const forbiddenErrors = await checkForbidden(path.parse(codePath).dir, importsPathes[index]); + forbidden.push(...forbiddenErrors); + } + } + return codePath.endsWith("main.sol") + ? { forbiddenErrors: forbidden, code } + : forbidden; + } + catch (error) { + return Promise.reject(error); + } +}; +const checkEvents = async (connector) => { + try { + const errors = []; + const warnings = []; + const eventsPath = `${connector.path}/events.sol`; + const mainPath = `${connector.path}/main.sol`; + if (connector.events.length) { + const eventNames = []; + for (let i1 = 0; i1 < connector.mainEvents.length; i1++) { + const mainEvent = connector.mainEvents[i1]; + const name = mainEvent.split("(")[0]; + eventNames.push(name); + const event = connector.events.find((e) => e.split("(")[0].split(" ")[1] === name); + if (event) { + const mainEventArgs = mainEvent + .split("(")[1] + .split(")")[0] + .split(",") + .map((a) => a.trim()); + const eventArgs = event + .split("(")[1] + .split(")")[0] + .split(",") + .map((a) => a.trim()); + if (mainEventArgs.length !== eventArgs.length) { + errors.push(`arguments amount don't match for ${name} at ${mainPath}:${connector.mainEventsLines[i1]}`); + continue; + } + for (let i2 = 0; i2 < mainEventArgs.length; i2++) { + if (!mainEventArgs[i2].startsWith(eventArgs[i2].split(" ")[0])) { + errors.push(`invalid argument #${i2 + 1} for ${name} at ${mainPath}:${connector.mainEventsLines[i1]}`); + } + } + } + else { + errors.push(`event ${name} missing at ${eventsPath}`); + } + } + if (connector.mainEvents.length < connector.events.length) { + const deprecatedEvents = connector.events.filter((e) => { + let used = false; + for (let index = 0; index < eventNames.length; index++) { + if (e.split("(")[0].split(" ")[1] === eventNames[index]) + used = true; + } + return !used; + }); + warnings.push(`${deprecatedEvents + .map((e) => e.split("(")[0].split(" ")[1]) + .join(", ")} event(s) not used at ${connector.path}/main.sol`); + } + } + else { + warnings.push(`missing events file for ${connector.path}/main.sol`); + } + return { eventsErrors: errors, eventsWarnings: warnings }; + } + catch (error) { + return Promise.reject(error); + } +}; +const getCommments = async (strs) => { + try { + const comments = []; + let type = ''; + for (let index = strs.length - 1; index >= 0; index--) { + const str = strs[index]; + if (!type) { + if (str.trim().startsWith("//")) { + type = "single"; + } + else if (str.trim().startsWith("*/")) { + type = "multiple"; + } + } + if (type === "single" && str.trim().startsWith("//")) { + comments.push(str.replace(/[/]/gi, "").trim()); + } + else if (type === "multiple" && + !str.trim().startsWith("/**") && + !str.trim().startsWith("*/")) { + comments.push(str.replace(/[*]/gi, "").trim()); + } + else if (type === "single" && !str.trim().startsWith("//")) { + break; + } + else if (type === "multiple" && str.trim().startsWith("/**")) { + break; + } + } + return comments; + } + catch (error) { + return Promise.reject(error); + } +}; +const parseCode = async (connector) => { + try { + const strs = connector.code.split("\n"); + const events = []; + const eventsFirstLines = []; + let func = []; + let funcs = []; + let event = []; + let mainEvents = []; + let firstLine = -1; + let mainEventsLines = []; + for (let index = 0; index < strs.length; index++) { + const str = strs[index]; + if (str.includes("function") && !str.trim().startsWith("//")) { + func = [str]; + firstLine = index + 1; + } + else if (func.length && !str.trim().startsWith("//")) { + func.push(str); + } + if (func.length && str.startsWith(`${func[0].split("function")[0]}}`)) { + funcs.push({ + raw: func.map((str) => str.trim()).join(" "), + comments: await getCommments(strs.slice(0, firstLine)), + firstLine, + }); + func = []; + } + } + const allPublicFuncs = funcs + .filter(({ raw }) => { + return raw.includes("external") || raw.includes("public"); + }) + .map((f) => { + const name = f.raw + .split("(")[0] + .split("function")[1] + .trim(); + return { + ...f, + name, + }; + }); + funcs = allPublicFuncs + .filter(({ raw }) => { + if (raw.includes("returns")) { + const returns = raw + .split("returns")[1] + .split("(")[1] + .split(")")[0]; + return returns.includes("string") && returns.includes("bytes"); + } + return false; + }) + .map((f) => { + const args = f.raw + .split("(")[1] + .split(")")[0] + .split(",") + .map((arg) => arg.trim()) + .filter((arg) => arg !== ""); + return { + ...f, + args, + }; + }); + const eventsPath = `${connector.path}/events.sol`; + if (fs.existsSync(eventsPath)) { + mainEvents = funcs + .map(({ raw }) => raw + .split("_eventName")[2] + .trim() + .split('"')[1]) + .filter((raw) => !!raw); + mainEventsLines = mainEvents.map((me) => strs.findIndex((str) => str.includes(me)) + 1); + const eventsCode = fs.readFileSync(eventsPath, { encoding: "utf8" }); + const eventsStrs = eventsCode.split("\n"); + for (let index = 0; index < eventsStrs.length; index++) { + const str = eventsStrs[index]; + if (str.includes("event")) { + event = [str]; + firstLine = index + 1; + } + else if (event.length && !str.trim().startsWith("//")) { + event.push(str); + } + if (event.length && str.includes(")")) { + events.push(event.map((str) => str.trim()).join(" ")); + eventsFirstLines.push(firstLine); + event = []; + } + } + } + return { + ...connector, + events, + eventsFirstLines, + mainEvents, + mainEventsLines, + funcs, + allPublicFuncs, + }; + } + catch (error) { + return Promise.reject(error); + } +}; +const checkComments = async (connector) => { + try { + const errors = []; + for (let i1 = 0; i1 < connector.funcs.length; i1++) { + const func = connector.funcs[i1]; + for (let i2 = 0; i2 < func.args.length; i2++) { + const argName = func.args[i2].split(" ").pop(); + if (!func.comments.some((comment) => comment.startsWith("@param") && comment.split(" ")[1] === argName)) { + errors.push(`argument ${argName} has no @param for function ${func.name} at ${connector.path}/main.sol:${func.firstLine}`); + } + } + const reqs = ["@dev", "@notice"]; + for (let i3 = 0; i3 < reqs.length; i3++) { + if (!func.comments.some((comment) => comment.startsWith(reqs[i3]))) { + errors.push(`no ${reqs[i3]} for function ${func.name} at ${connector.path}/main.sol:${func.firstLine}`); + } + } + } + return errors; + } + catch (error) { + return Promise.reject(error); + } +}; +const checkPublicFuncs = async (connector) => { + try { + const errors = []; + for (let i1 = 0; i1 < connector.allPublicFuncs.length; i1++) { + const { raw, firstLine, name } = connector.allPublicFuncs[i1]; + if (!raw.includes("payable")) { + errors.push(`public function ${name} is not payable at ${connector.path}/main.sol:${firstLine}`); + } + } + return errors; + } + catch (error) { + return Promise.reject(error); + } +}; +const checkName = async (connector) => { + try { + const strs = connector.code.split("\n"); + let haveName = false; + for (let index = strs.length - 1; index > 0; index--) { + const str = strs[index]; + if (str.includes("string") && + str.includes("public") && + str.includes("name = ")) { + haveName = true; + } + } + return haveName + ? [] + : [`name variable missing in ${connector.path}/main.sol`]; + } + catch (error) { + return Promise.reject(error); + } +}; +const checkHeadComments = async (connector) => { + try { + const errors = []; + const strs = connector.code.split("\n"); + let haveTitle = false; + let haveDev = false; + for (let index = 0; index < strs.length; index++) { + if (!strs[index].includes("{")) { + if (strs[index].includes("@title")) + haveTitle = true; + if (strs[index].includes("@dev")) + haveDev = true; + } + else { + break; + } + } + if (!haveTitle) + errors.push(`@title missing in ${connector.path}/main.sol`); + if (!haveDev) + errors.push(`@dev missing in ${connector.path}/main.sol`); + return errors; + } + catch (error) { + return Promise.reject(error); + } +}; +async function checkMain() { + try { + const connectorsRootsDirsDefault = ["mainnet", "polygon"].map((v) => `contracts/${v}/connectors`); + const customPathArg = process.argv.find((a) => a.startsWith("connector=")); + const connectorsRootsDirs = customPathArg + ? [customPathArg.slice(10)] + : connectorsRootsDirsDefault; + const errors = []; + const warnings = []; + const connectors = await getConnectorsList(connectorsRootsDirs); + for (let index = 0; index < connectors.length; index++) { + const { forbiddenErrors, code } = await checkForbidden(connectors[index].path); + connectors[index].code = code; + connectors[index] = await parseCode(connectors[index]); + const { eventsErrors, eventsWarnings } = await checkEvents(connectors[index]); + const commentsErrors = await checkComments(connectors[index]); + const nameErrors = await checkName(connectors[index]); + const headCommentsErrors = await checkHeadComments(connectors[index]); + const publicFuncsErrors = await checkPublicFuncs(connectors[index]); + errors.push(...forbiddenErrors); + errors.push(...eventsErrors); + errors.push(...commentsErrors); + errors.push(...nameErrors); + errors.push(...headCommentsErrors); + errors.push(...publicFuncsErrors); + warnings.push(...eventsWarnings); + } + if (errors.length) { + console.log("\x1b[31m%s\x1b[0m", `Total errors: ${errors.length}`); + errors.forEach((error) => console.log("\x1b[31m%s\x1b[0m", error)); + } + else { + console.log("\x1b[32m%s\x1b[0m", "No Errors Found"); + } + if (warnings.length) { + console.log("\x1b[33m%s\x1b[0m", `Total warnings: ${warnings.length}`); + warnings.forEach((warning) => console.log("\x1b[33m%s\x1b[0m", warning)); + } + else { + console.log("\x1b[32m%s\x1b[0m", "No Warnings Found"); + } + if (errors.length) + return Promise.reject(errors.join("\n")); + } + catch (error) { + console.error("check execution error:", error); + } +} +exports.default = checkMain; +//# sourceMappingURL=check.js.map \ No newline at end of file diff --git a/status-checks/check.js.map b/status-checks/check.js.map new file mode 100644 index 00000000..e6074ebe --- /dev/null +++ b/status-checks/check.js.map @@ -0,0 +1 @@ +{"version":3,"file":"check.js","sourceRoot":"","sources":["check.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/status-checks/checks.js b/status-checks/checks.js new file mode 100644 index 00000000..9ee7f59f --- /dev/null +++ b/status-checks/checks.js @@ -0,0 +1,21 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const check_1 = __importDefault(require("./check")); +exports.default = [ + { + name: "Solidity check", + callback: async () => { + try { + await (0, check_1.default)(); + return "Check passed!"; + } + catch (error) { + throw new Error("Check failed!"); + } + }, + }, +]; +//# sourceMappingURL=checks.js.map \ No newline at end of file diff --git a/status-checks/checks.js.map b/status-checks/checks.js.map new file mode 100644 index 00000000..a034d6b2 --- /dev/null +++ b/status-checks/checks.js.map @@ -0,0 +1 @@ +{"version":3,"file":"checks.js","sourceRoot":"","sources":["checks.ts"],"names":[],"mappings":";;;;;AAAA,oDAAgC;AAEhC,kBAAe;IACb;QACE,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,IAAI;gBACF,MAAM,IAAA,eAAS,GAAE,CAAC;gBAClB,OAAO,eAAe,CAAC;aACxB;YAAC,OAAO,KAAK,EAAE;gBACd,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;aAClC;QACH,CAAC;KACF;CACF,CAAC"} \ No newline at end of file diff --git a/status-checks/huskyCheck.js b/status-checks/huskyCheck.js new file mode 100644 index 00000000..d8de1494 --- /dev/null +++ b/status-checks/huskyCheck.js @@ -0,0 +1,15 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const check_1 = __importDefault(require("./check")); +(async function runHusky() { + try { + await (0, check_1.default)(); + } + catch (error) { + process.exit(1); + } +})(); +//# sourceMappingURL=huskyCheck.js.map \ No newline at end of file diff --git a/status-checks/huskyCheck.js.map b/status-checks/huskyCheck.js.map new file mode 100644 index 00000000..fd511c40 --- /dev/null +++ b/status-checks/huskyCheck.js.map @@ -0,0 +1 @@ +{"version":3,"file":"huskyCheck.js","sourceRoot":"","sources":["huskyCheck.ts"],"names":[],"mappings":";;;;;AAAA,oDAAgC;AAEhC,CAAC,KAAK,UAAU,QAAQ;IACtB,IAAI;QACF,MAAM,IAAA,eAAS,GAAE,CAAC;KACnB;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;AACH,CAAC,CAAC,EAAE,CAAC"} \ No newline at end of file diff --git a/status-checks/index.js b/status-checks/index.js new file mode 100644 index 00000000..3ae26ace --- /dev/null +++ b/status-checks/index.js @@ -0,0 +1,69 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const cp = __importStar(require("child_process")); +const node_fetch_1 = __importDefault(require("node-fetch")); +const checks_1 = __importDefault(require("./checks")); +const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/"); +function getCurrentCommitSha() { + return cp + .execSync("git rev-parse HEAD") + .toString() + .trim(); +} +// The SHA provied by GITHUB_SHA is the merge (PR) commit. +// We need to get the current commit sha ourself. +const sha = getCurrentCommitSha(); +async function setStatus(context, state, description) { + return (0, node_fetch_1.default)(`https://api.github.com/repos/${owner}/${repo}/statuses/${sha}`, { + method: "POST", + body: JSON.stringify({ + state, + description, + context, + }), + headers: { + Authorization: `Bearer ${process.env.GITHUB_TOKEN}`, + "Content-Type": "application/json", + }, + }); +} +(async () => { + console.log(`Starting status checks for commit ${sha}`); + // Run in parallel + await Promise.all(checks_1.default.map(async (check) => { + const { name, callback } = check; + await setStatus(name, "pending", "Running check.."); + try { + const response = await callback(); + await setStatus(name, "success", response); + } + catch (err) { + const message = err ? err.message : "Something went wrong"; + await setStatus(name, "failure", message); + } + })); + console.log("Finished status checks"); +})(); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/status-checks/index.js.map b/status-checks/index.js.map new file mode 100644 index 00000000..09f454d2 --- /dev/null +++ b/status-checks/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAAoC;AACpC,4DAA+B;AAE/B,sDAA8B;AAE9B,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAE/D,SAAS,mBAAmB;IAC1B,OAAO,EAAE;SACN,QAAQ,CAAC,oBAAoB,CAAC;SAC9B,QAAQ,EAAE;SACV,IAAI,EAAE,CAAC;AACZ,CAAC;AACD,0DAA0D;AAC1D,iDAAiD;AACjD,MAAM,GAAG,GAAG,mBAAmB,EAAE,CAAC;AAElC,KAAK,UAAU,SAAS,CAAC,OAAY,EAAE,KAAa,EAAE,WAAmB;IACvE,OAAO,IAAA,oBAAK,EACV,gCAAgC,KAAK,IAAI,IAAI,aAAa,GAAG,EAAE,EAC/D;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK;YACL,WAAW;YACX,OAAO;SACR,CAAC;QACF,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE;YACnD,cAAc,EAAE,kBAAkB;SACnC;KACF,CACF,CAAC;AACJ,CAAC;AAED,CAAC,KAAK,IAAI,EAAE;IACV,OAAO,CAAC,GAAG,CAAC,qCAAqC,GAAG,EAAE,CAAC,CAAC;IACxD,kBAAkB;IAClB,MAAM,OAAO,CAAC,GAAG,CACf,gBAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAmC,EAAE,EAAE;QACvD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAEjC,MAAM,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAEpD,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,QAAQ,EAAE,CAAC;YAClC,MAAM,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;SAC5C;QAAC,OAAO,GAAG,EAAE;YACZ,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC;YAC3D,MAAM,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;SAC3C;IACH,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AACxC,CAAC,CAAC,EAAE,CAAC"} \ No newline at end of file