Solidity code linter providing security and style guide validations for smart contract development
npx @tessl/cli install tessl/npm-solhint@6.0.0Solhint is a comprehensive linting tool specifically designed for Solidity smart contract development. It offers both security and style guide validations, helping developers identify potential vulnerabilities, enforce coding standards, and improve code quality in Ethereum smart contracts. The tool supports configurable rulesets with recommended defaults, inline comment-based rule configuration, automatic fixing for certain issues, caching for improved performance, and multiple output formats including JSON and SARIF.
npm install -g solhintconst { processStr, processFile, processPath } = require('solhint');For library modules:
const { loadConfig, applyExtends } = require('solhint/lib/config/config-file');
const Reporter = require('solhint/lib/reporter');# Initialize configuration
solhint --init
# Lint all Solidity files in contracts directory
solhint 'contracts/**/*.sol'
# Lint with specific configuration
solhint -c .solhint.json contracts/MyToken.sol
# Auto-fix issues where possible
solhint --fix 'contracts/**/*.sol'const { processStr, processFile } = require('solhint');
// Process Solidity source code string
const sourceCode = 'contract Example { function test() public {} }';
const config = { rules: { 'func-visibility': 'error' } };
const report = processStr(sourceCode, config, 'Example.sol');
console.log('Errors:', report.errorCount);
console.log('Warnings:', report.warningCount);
console.log('Messages:', report.messages);
// Process a single file
const fileReport = processFile('./contracts/Token.sol');
console.log('File path:', fileReport.filePath);Solhint is built around several key components:
processStr, processFile, processPath) that orchestrate linting workflow@solidity-parser/parser to parse Solidity code into Abstract Syntax TreesMain linting functions for processing Solidity source code at different levels - from strings to files to directory patterns.
function processStr(inputStr, config = {}, fileName = '');
function processFile(file, config, rootDir = process.cwd(), explicitConfigPath);
function processPath(pattern, config, rootDir = process.cwd(), explicitConfigPath);
// Cache Management APIs
function readCache(cachePath);
function writeCache(cachePath, cacheData);
function shouldLint(filePath, content, config, cacheData);
function updateCacheEntry(filePath, content, config, cacheData);Reporter system for collecting, managing, and accessing linting results with severity levels and structured output.
class Reporter {
constructor(tokens, config);
addReport(line, column, severity, message, ruleId, fix);
error(ctx, ruleId, message, fix);
warn(ctx, ruleId, message, fix);
get errorCount();
get warningCount();
get messages();
}Configuration loading and management system with hierarchical config resolution and rule inheritance.
function loadConfig(configFile);
function loadConfigForFile(filePath, rootDir, explicitConfigPath);
function applyExtends(config, getter);
function validate(config);Comprehensive rule system with 64+ rules across 7 categories for security, style, and best practices validation.
function checkers(reporter, configVals, inputSrc, tokens, fileName);Multiple formatter functions for different output formats and integration needs.
function stylish(reports);
function json(reports);
function table(reports);
function compact(reports);
function unix(reports);
function tap(reports);
function sarif(reports);Command-line interface with main command and subcommands for various linting operations.
solhint [options] <file> [...other_files]
solhint stdin [--filename <name>]
solhint init-config
solhint list-rulesinterface LintingReport {
line: number;
column: number;
severity: number;
message: string;
ruleId: string;
fix?: Function;
}
interface ConfigObject {
rules?: { [ruleId: string]: string | [string, ...any[]] };
extends?: string | string[];
excludedFiles?: string[];
plugins?: string[];
cache?: boolean;
cacheLocation?: string;
}
interface ProcessingResult {
reports: LintingReport[];
file?: string;
filePath?: string;
errorCount: number;
warningCount: number;
messages: LintingReport[];
skipped?: boolean;
}const SEVERITY = {
ERROR: 2,
WARN: 3
};
const EXIT_CODES = {
OK: 0,
REPORTED_ERRORS: 1,
BAD_OPTIONS: 255
};