UNPKG

hardhat-output-validator

Version:

Zero-config Hardhat plugin to check the build output of Solidity contracts

89 lines 4.09 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkFunction = void 0; const types_1 = require("../types"); const index_1 = require("../index"); const utils_1 = require("../utils"); // fullBuildInfo needed for utils.ts checks const checkFunction = (abiEntity, { addError }, info, fullBuildInfo) => { var _a, _b, _c, _d; const config = (0, index_1.getConfig)(); const defaultSeverity = (0, index_1.getDefaultSeverity)(); if (!config.checks.functions && !config.checks.variables) { return; } let hasUserDoc = true; let hasDevDoc = true; if (!config.checks.variables) { if ((0, utils_1.checkIfStateVar)(info.filePath, info.fileName, abiEntity.name.split('(')[0], fullBuildInfo)) { return; } } // Check in USER DOC if (config.checks.missingUserDoc && ((_a = config.checks.userDoc) === null || _a === void 0 ? void 0 : _a.functions) && info.userdoc) { const userDocEntry = (0, utils_1.findByName)(info.userdoc.methods, abiEntity.name); if (!userDocEntry || !userDocEntry.notice) { hasUserDoc = false; } } // Check in DEV DOC if (config.checks.missingDevDoc && ((_b = config.checks.devDoc) === null || _b === void 0 ? void 0 : _b.functions) && info.devdoc) { let devDocEntryFunc = (0, utils_1.findByName)(info.devdoc.methods, abiEntity.name); // check if variable if (!devDocEntryFunc) { const noBracketName = abiEntity.name.split("(")[0]; devDocEntryFunc = (0, utils_1.findByName)(info.devdoc.stateVariables, noBracketName); } // if checks.missingParams -> // if func exists in devdoc/userdoc & has params in abi // but not in devdoc if (!devDocEntryFunc) { hasDevDoc = false; } else { const check = (io) => { const paramsOrReturns = io === 'inputs' ? 'params' : 'returns'; const errorType = io === 'inputs' ? types_1.ErrorType.MissingParams : types_1.ErrorType.MissingReturnParams; if (config.checks[paramsOrReturns] && abiEntity[io].length > 0) { abiEntity[io].forEach((param, i) => { var _a; const paramName = param.name || `_${i}`; if (!((_a = devDocEntryFunc === null || devDocEntryFunc === void 0 ? void 0 : devDocEntryFunc[paramsOrReturns]) === null || _a === void 0 ? void 0 : _a[paramName])) { addError(errorType, defaultSeverity, `Function: (${abiEntity.name}), ${paramsOrReturns.slice(0, -1)}: (${paramName || ''})`); } }); } }; check('inputs'); check('outputs'); } } if (!config.strict) { if (!hasDevDoc && !hasUserDoc) { addError(types_1.ErrorType.MissingUserOrDevDoc, defaultSeverity, `Function: (${abiEntity.name})`); } if (!hasDevDoc && hasUserDoc) { if (abiEntity.inputs.length > 0) { addError(types_1.ErrorType.MissingAllParams, defaultSeverity, `Function: (${abiEntity.name})`); } if (abiEntity.outputs.length > 0) { addError(types_1.ErrorType.MissingAllReturnParams, defaultSeverity, `Function: (${abiEntity.name})`); } } } else { // STRICT const userSev = ((_c = config.checks.userDoc) === null || _c === void 0 ? void 0 : _c.functions) || config.checks.missingUserDoc; addError(types_1.ErrorType.MissingUserDoc, userSev, `Function: (${abiEntity.name})`); const severity = ((_d = config.checks.devDoc) === null || _d === void 0 ? void 0 : _d.functions) || config.checks.missingUserDoc; addError(types_1.ErrorType.MissingDevDoc, severity, `Function: (${abiEntity.name})`); } }; exports.checkFunction = checkFunction; //# sourceMappingURL=0funcs.js.map