hardhat-output-validator
Version:
Zero-config Hardhat plugin to check the build output of Solidity contracts
89 lines • 4.09 kB
JavaScript
;
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