@reinforcedai/hardhat-security-review 2511.26.1 → 2512.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/dist/AutoFixManager.d.ts +8 -0
- package/dist/AutoFixManager.d.ts.map +1 -0
- package/dist/AutoFixManager.js +199 -0
- package/dist/AutoFixManager.js.map +1 -0
- package/dist/ContractUnflattener.d.ts +25 -0
- package/dist/ContractUnflattener.d.ts.map +1 -0
- package/dist/ContractUnflattener.js +152 -0
- package/dist/ContractUnflattener.js.map +1 -0
- package/dist/ReinforcedHardhatRuntimeEnvironmentField.d.ts +13 -0
- package/dist/ReinforcedHardhatRuntimeEnvironmentField.d.ts.map +1 -0
- package/dist/ReinforcedHardhatRuntimeEnvironmentField.js +151 -0
- package/dist/ReinforcedHardhatRuntimeEnvironmentField.js.map +1 -0
- package/dist/consts.d.ts +4 -0
- package/dist/consts.d.ts.map +1 -0
- package/dist/consts.js +7 -0
- package/dist/consts.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +249 -0
- package/dist/index.js.map +1 -0
- package/dist/type-extensions.d.ts +24 -0
- package/dist/type-extensions.d.ts.map +1 -0
- package/dist/type-extensions.js +4 -0
- package/dist/type-extensions.js.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/package.json +2 -2
- package/src/index.ts +2 -2
package/README.md
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Reinforced Hardhat Plugin
|
|
2
|
+
|
|
3
|
+
This plugin integrates Reinforced-powered smart contract auditing into the Hardhat workflow. It enables automatic and manual security audits of Solidity contracts before deployment, leveraging decentralized intelligence for vulnerability detection and suggestions. The plugin provides tasks for auditing all contracts and formatting results for easy review.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Automatic audit after compilation
|
|
8
|
+
- Manual audit task (`npx hardhat audit`)
|
|
9
|
+
- Integration with Reinforced API for contract analysis
|
|
10
|
+
- Tabular vulnerability reports
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
1. Install the plugin and configure your Reinforced API key in `hardhat.config.js`.
|
|
15
|
+
2. Run `npx hardhat audit` to manually audit contracts.
|
|
16
|
+
3. Audits are also performed automatically before deployment.
|
|
17
|
+
|
|
18
|
+
## Configuration
|
|
19
|
+
|
|
20
|
+
Add the following to your `hardhat.config.js` to enable the plugin:
|
|
21
|
+
|
|
22
|
+
```js
|
|
23
|
+
module.exports = {
|
|
24
|
+
// ...existing config...
|
|
25
|
+
reinforced: {
|
|
26
|
+
compilationHookEnabled: true, // Set to true to enable auditing
|
|
27
|
+
apiKey: "YOUR_REINFORCED_API_KEY" // Your Reinforced API key
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- `compilationHookEnabled` (boolean): Enables or disables automatic Reinforced auditing before deployment. Manual audit task always work regardless of this flag.
|
|
33
|
+
- `apiKey` (string): Your API key for accessing Reinforced's audit service.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AutoFixSelection, CodeReplacementResult, Vulnerability } from './types';
|
|
2
|
+
export declare class AutoFixManager {
|
|
3
|
+
constructor();
|
|
4
|
+
promptUserForVulnerabilitySelection(vulnerabilities: Vulnerability[]): AutoFixSelection[];
|
|
5
|
+
applyAutoFixes(vulnerabilities: Vulnerability[], selections: AutoFixSelection[], sourceCode: string, sourcePaths: string[]): CodeReplacementResult;
|
|
6
|
+
displayAutoFixSummary(result: CodeReplacementResult, vulnerabilities: Vulnerability[]): void;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=AutoFixManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutoFixManager.d.ts","sourceRoot":"","sources":["../src/AutoFixManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,EAA0B,MAAM,SAAS,CAAC;AAEzG,qBAAa,cAAc;;IAKlB,mCAAmC,CAAC,eAAe,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE;IA+DzF,cAAc,CACnB,eAAe,EAAE,aAAa,EAAE,EAChC,UAAU,EAAE,gBAAgB,EAAE,EAC9B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,GACpB,qBAAqB;IA2FjB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,EAAE,eAAe,EAAE,aAAa,EAAE;CAsC7F"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.AutoFixManager = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const readlineSync = __importStar(require("readline-sync"));
|
|
39
|
+
const ContractUnflattener_1 = require("./ContractUnflattener");
|
|
40
|
+
class AutoFixManager {
|
|
41
|
+
constructor() {
|
|
42
|
+
}
|
|
43
|
+
promptUserForVulnerabilitySelection(vulnerabilities) {
|
|
44
|
+
if (vulnerabilities.length === 0) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
console.log('\n🔍 Found vulnerabilities that can be auto-fixed:');
|
|
48
|
+
console.log('━'.repeat(80));
|
|
49
|
+
const vulnerabilitiesWithIndex = vulnerabilities
|
|
50
|
+
.map((vuln, index) => ({ ...vuln, index }))
|
|
51
|
+
.filter(vuln => vuln.fixed_lines !== null && vuln.fixed_lines.trim().length > 0);
|
|
52
|
+
if (vulnerabilitiesWithIndex.length === 0) {
|
|
53
|
+
console.log('ℹ️ No auto-fixable vulnerabilities found (no miner suggestions available).');
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
vulnerabilitiesWithIndex.forEach((vuln) => {
|
|
57
|
+
console.log(`\n[${vuln.index + 1}] ${vuln.vulnerability_class}`);
|
|
58
|
+
console.log(` Lines ${vuln.original_from_line || vuln.from_line}-${vuln.original_to_line || vuln.to_line}${vuln.original_file ? ` in ${vuln.original_file.split('/').pop()}` : ''}`);
|
|
59
|
+
console.log(` Miners consensus: ${vuln.miners_select_count}/${vuln.miners_participated_count}`);
|
|
60
|
+
console.log(` Description: ${vuln.description.substring(0, 100)}...`);
|
|
61
|
+
console.log(` Has fix: ${vuln.fixed_lines ? 'Yes' : 'No'}`);
|
|
62
|
+
});
|
|
63
|
+
console.log('━'.repeat(80));
|
|
64
|
+
console.log('Select vulnerabilities to auto-fix:');
|
|
65
|
+
console.log('• Enter numbers separated by commas (e.g., 1,3,5)');
|
|
66
|
+
console.log('• Enter "all" to fix all vulnerabilities');
|
|
67
|
+
console.log('• Enter "none" or press Enter to skip auto-fixing');
|
|
68
|
+
const userInput = readlineSync.question('\nYour selection: ').trim();
|
|
69
|
+
if (userInput.toLowerCase() === 'none' || userInput === '') {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
let selectedIndices = [];
|
|
73
|
+
if (userInput.toLowerCase() === 'all') {
|
|
74
|
+
selectedIndices = vulnerabilitiesWithIndex.map(v => v.index);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const inputNumbers = userInput.split(',')
|
|
78
|
+
.map(s => parseInt(s.trim()))
|
|
79
|
+
.filter(n => !isNaN(n) && n >= 1 && n <= vulnerabilities.length);
|
|
80
|
+
selectedIndices = inputNumbers.map(n => n - 1);
|
|
81
|
+
}
|
|
82
|
+
const selections = vulnerabilities.map((_, index) => ({
|
|
83
|
+
vulnerabilityIndex: index,
|
|
84
|
+
shouldFix: selectedIndices.includes(index) &&
|
|
85
|
+
vulnerabilities[index].fixed_lines !== null &&
|
|
86
|
+
vulnerabilities[index].fixed_lines.trim().length > 0,
|
|
87
|
+
}));
|
|
88
|
+
const selectedCount = selections.filter(s => s.shouldFix).length;
|
|
89
|
+
console.log(`\n✅ Selected ${selectedCount} vulnerabilities for auto-fixing.`);
|
|
90
|
+
return selections;
|
|
91
|
+
}
|
|
92
|
+
applyAutoFixes(vulnerabilities, selections, sourceCode, sourcePaths) {
|
|
93
|
+
const selectedVulns = selections
|
|
94
|
+
.filter(s => s.shouldFix)
|
|
95
|
+
.map(s => ({ ...vulnerabilities[s.vulnerabilityIndex], index: s.vulnerabilityIndex }))
|
|
96
|
+
.sort((a, b) => b.to_line - a.to_line); // Sort by line number descending to avoid offset issues
|
|
97
|
+
if (selectedVulns.length === 0) {
|
|
98
|
+
return {
|
|
99
|
+
success: true,
|
|
100
|
+
appliedFixes: [],
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const unflattener = new ContractUnflattener_1.ContractUnflattener();
|
|
105
|
+
unflattener.parseFlattened(sourceCode, sourcePaths);
|
|
106
|
+
const vulnerabilitiesByFile = new Map();
|
|
107
|
+
for (const vuln of selectedVulns) {
|
|
108
|
+
const mapping = unflattener.mapVulnerabilityToOriginal(vuln.from_line, vuln.to_line);
|
|
109
|
+
if (mapping) {
|
|
110
|
+
const filePath = mapping.originalFile;
|
|
111
|
+
if (!vulnerabilitiesByFile.has(filePath)) {
|
|
112
|
+
vulnerabilitiesByFile.set(filePath, []);
|
|
113
|
+
}
|
|
114
|
+
vulnerabilitiesByFile.get(filePath).push({ vulnerability: vuln, mapping });
|
|
115
|
+
vuln.original_file = filePath;
|
|
116
|
+
vuln.original_from_line = mapping.originalFromLine;
|
|
117
|
+
vuln.original_to_line = mapping.originalToLine;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (vulnerabilitiesByFile.size === 0) {
|
|
121
|
+
return {
|
|
122
|
+
success: false,
|
|
123
|
+
error: 'Could not map vulnerabilities to original files',
|
|
124
|
+
appliedFixes: [],
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const appliedFixes = [];
|
|
128
|
+
const modifiedFiles = [];
|
|
129
|
+
console.log('\n🔧 Applying auto-fixes to original files...');
|
|
130
|
+
for (const [filePath, vulnMappings] of vulnerabilitiesByFile.entries()) {
|
|
131
|
+
vulnMappings.sort((a, b) => b.mapping.originalToLine - a.mapping.originalToLine);
|
|
132
|
+
console.log(` 📄 Processing ${path.basename(filePath)} (${vulnMappings.length} fixes)`);
|
|
133
|
+
for (const { vulnerability: vuln, mapping } of vulnMappings) {
|
|
134
|
+
if (!vuln.fixed_lines)
|
|
135
|
+
continue;
|
|
136
|
+
console.log(` • Fixing ${vuln.vulnerability_class} at lines ${mapping.originalFromLine}-${mapping.originalToLine}`);
|
|
137
|
+
const fixResult = unflattener.applyFixToOriginalFile(mapping, vuln.fixed_lines);
|
|
138
|
+
if (fixResult.success) {
|
|
139
|
+
appliedFixes.push(vuln.index);
|
|
140
|
+
if (!modifiedFiles.includes(filePath)) {
|
|
141
|
+
modifiedFiles.push(filePath);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
console.warn(` ⚠️ Failed to apply fix: ${fixResult.error}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
console.log(`✅ Applied ${appliedFixes.length} fixes to ${modifiedFiles.length} files`);
|
|
150
|
+
return {
|
|
151
|
+
success: true,
|
|
152
|
+
appliedFixes,
|
|
153
|
+
modifiedFiles,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
return {
|
|
158
|
+
success: false,
|
|
159
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
160
|
+
appliedFixes: [],
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
displayAutoFixSummary(result, vulnerabilities) {
|
|
165
|
+
console.log('\n' + '='.repeat(80));
|
|
166
|
+
console.log('AUTO-FIX SUMMARY');
|
|
167
|
+
console.log('='.repeat(80));
|
|
168
|
+
if (!result.success) {
|
|
169
|
+
console.log(`❌ Auto-fix failed: ${result.error}`);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (result.appliedFixes.length === 0) {
|
|
173
|
+
console.log('ℹ️ No fixes were applied.');
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
console.log(`✅ Successfully applied ${result.appliedFixes.length} auto-fixes:`);
|
|
177
|
+
result.appliedFixes.forEach(index => {
|
|
178
|
+
const vuln = vulnerabilities[index];
|
|
179
|
+
const originalInfo = vuln.original_file && vuln.original_from_line && vuln.original_to_line
|
|
180
|
+
? ` in ${path.basename(vuln.original_file)} (lines ${vuln.original_from_line}-${vuln.original_to_line})`
|
|
181
|
+
: ` (lines ${vuln.from_line}-${vuln.to_line})`;
|
|
182
|
+
console.log(` • ${vuln.vulnerability_class}${originalInfo}`);
|
|
183
|
+
});
|
|
184
|
+
if (result.modifiedFiles && result.modifiedFiles.length > 0) {
|
|
185
|
+
console.log('\n📄 Modified files:');
|
|
186
|
+
result.modifiedFiles.forEach(filePath => {
|
|
187
|
+
console.log(` • ${path.basename(filePath)}`);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
else if (result.filePath) {
|
|
191
|
+
console.log(`\n📄 Fixed code saved to: ${path.basename(result.filePath)}`);
|
|
192
|
+
}
|
|
193
|
+
console.log('\n⚠️ IMPORTANT: Please review the changes carefully before deploying!');
|
|
194
|
+
console.log(' The fixes have been applied directly to your original contract files.');
|
|
195
|
+
console.log('='.repeat(80));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
exports.AutoFixManager = AutoFixManager;
|
|
199
|
+
//# sourceMappingURL=AutoFixManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutoFixManager.js","sourceRoot":"","sources":["../src/AutoFixManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface FileMapping {
|
|
2
|
+
filePath: string;
|
|
3
|
+
startLine: number;
|
|
4
|
+
endLine: number;
|
|
5
|
+
originalContent: string;
|
|
6
|
+
}
|
|
7
|
+
export interface VulnerabilityMapping {
|
|
8
|
+
originalFile: string;
|
|
9
|
+
originalFromLine: number;
|
|
10
|
+
originalToLine: number;
|
|
11
|
+
flattenedFromLine: number;
|
|
12
|
+
flattenedToLine: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class ContractUnflattener {
|
|
15
|
+
private fileMappings;
|
|
16
|
+
parseFlattened(flattenedSource: string, sourcePaths: string[]): FileMapping[];
|
|
17
|
+
mapVulnerabilityToOriginal(flattenedFromLine: number, flattenedToLine: number): VulnerabilityMapping | null;
|
|
18
|
+
applyFixToOriginalFile(mapping: VulnerabilityMapping, fixedLines: string): {
|
|
19
|
+
success: boolean;
|
|
20
|
+
error?: string;
|
|
21
|
+
};
|
|
22
|
+
private findFullPath;
|
|
23
|
+
private findOriginalContent;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ContractUnflattener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContractUnflattener.d.ts","sourceRoot":"","sources":["../src/ContractUnflattener.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,YAAY,CAAqB;IAElC,cAAc,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE;IA4D7E,0BAA0B,CAC/B,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,GACtB,oBAAoB,GAAG,IAAI;IAiBvB,sBAAsB,CAC3B,OAAO,EAAE,oBAAoB,EAC7B,UAAU,EAAE,MAAM,GACjB;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAuBvC,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,mBAAmB;CAU5B"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ContractUnflattener = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
class ContractUnflattener {
|
|
40
|
+
fileMappings = [];
|
|
41
|
+
parseFlattened(flattenedSource, sourcePaths) {
|
|
42
|
+
const lines = flattenedSource.split('\n');
|
|
43
|
+
const mappings = [];
|
|
44
|
+
let currentFile = null;
|
|
45
|
+
let currentStartLine = 0;
|
|
46
|
+
let currentLines = [];
|
|
47
|
+
for (let i = 0; i < lines.length; i++) {
|
|
48
|
+
const line = lines[i];
|
|
49
|
+
const fileMarker = line.match(/^\/\/ File (.+)$/);
|
|
50
|
+
if (fileMarker) {
|
|
51
|
+
if (currentFile && currentLines.length > 0) {
|
|
52
|
+
const originalContent = this.findOriginalContent(currentFile);
|
|
53
|
+
mappings.push({
|
|
54
|
+
filePath: currentFile,
|
|
55
|
+
startLine: currentStartLine,
|
|
56
|
+
endLine: i - 2,
|
|
57
|
+
originalContent,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const fullPath = this.findFullPath(fileMarker[1], sourcePaths);
|
|
61
|
+
if (fullPath) {
|
|
62
|
+
currentFile = fullPath;
|
|
63
|
+
let nextNonEmptyLine = i + 1;
|
|
64
|
+
while (nextNonEmptyLine < lines.length && lines[nextNonEmptyLine].trim() === '') {
|
|
65
|
+
nextNonEmptyLine++;
|
|
66
|
+
}
|
|
67
|
+
currentStartLine = nextNonEmptyLine + 1;
|
|
68
|
+
currentLines = [];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (currentFile) {
|
|
72
|
+
if (line.startsWith('// Original license:')) {
|
|
73
|
+
const group = line.match(/^\/\/ Original license:(.*)$/);
|
|
74
|
+
if (group && group[1]) {
|
|
75
|
+
currentLines.push(group[1].trim());
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
currentLines.push(line);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (currentFile && currentLines.length > 0) {
|
|
84
|
+
mappings.push({
|
|
85
|
+
filePath: currentFile,
|
|
86
|
+
startLine: currentStartLine,
|
|
87
|
+
endLine: lines.length,
|
|
88
|
+
originalContent: this.findOriginalContent(currentFile),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
this.fileMappings = mappings;
|
|
92
|
+
return mappings;
|
|
93
|
+
}
|
|
94
|
+
mapVulnerabilityToOriginal(flattenedFromLine, flattenedToLine) {
|
|
95
|
+
for (const mapping of this.fileMappings) {
|
|
96
|
+
if (flattenedFromLine >= mapping.startLine && flattenedToLine <= mapping.endLine) {
|
|
97
|
+
return {
|
|
98
|
+
originalFile: mapping.filePath,
|
|
99
|
+
originalFromLine: flattenedFromLine - mapping.startLine + 1,
|
|
100
|
+
originalToLine: flattenedToLine - mapping.startLine + 1,
|
|
101
|
+
flattenedFromLine,
|
|
102
|
+
flattenedToLine,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
applyFixToOriginalFile(mapping, fixedLines) {
|
|
109
|
+
try {
|
|
110
|
+
if (!fs.existsSync(mapping.originalFile)) {
|
|
111
|
+
return { success: false, error: `Original file not found: ${mapping.originalFile}` };
|
|
112
|
+
}
|
|
113
|
+
const originalLines = fs.readFileSync(mapping.originalFile, 'utf8').split('\n');
|
|
114
|
+
const startIndex = mapping.originalFromLine - 1;
|
|
115
|
+
const endIndex = mapping.originalToLine - 1;
|
|
116
|
+
originalLines.splice(startIndex, endIndex - startIndex + 1, ...fixedLines.split('\n'));
|
|
117
|
+
fs.writeFileSync(mapping.originalFile, originalLines.join('\n'));
|
|
118
|
+
return { success: true };
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
return {
|
|
122
|
+
success: false,
|
|
123
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
findFullPath(relativePath, sourcePaths) {
|
|
128
|
+
const exactMatch = sourcePaths.find(sp => sp === relativePath);
|
|
129
|
+
if (exactMatch)
|
|
130
|
+
return exactMatch;
|
|
131
|
+
const byFilename = sourcePaths.find(sp => path.basename(sp) === path.basename(relativePath));
|
|
132
|
+
if (byFilename)
|
|
133
|
+
return byFilename;
|
|
134
|
+
const pathMatch = sourcePaths.find(sp => sp.endsWith(relativePath));
|
|
135
|
+
if (pathMatch)
|
|
136
|
+
return pathMatch;
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
findOriginalContent(filePath) {
|
|
140
|
+
try {
|
|
141
|
+
if (fs.existsSync(filePath)) {
|
|
142
|
+
return fs.readFileSync(filePath, 'utf8');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.warn(`Could not read original content for ${filePath}:`, error);
|
|
147
|
+
}
|
|
148
|
+
return '';
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.ContractUnflattener = ContractUnflattener;
|
|
152
|
+
//# sourceMappingURL=ContractUnflattener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContractUnflattener.js","sourceRoot":"","sources":["../src/ContractUnflattener.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AuditResult } from './types';
|
|
2
|
+
export declare class ReinforcedHardhatRuntimeEnvironmentField {
|
|
3
|
+
auditContract(sourceCode: string, apiKey: string, statusCheckInterval?: number, maxRetries?: number, reportFolder?: string): Promise<AuditResult>;
|
|
4
|
+
private checkAuditStatusWithRetry;
|
|
5
|
+
private getAuditResultWithRetry;
|
|
6
|
+
private requestAuditWithRetry;
|
|
7
|
+
private fetchAudit;
|
|
8
|
+
private requestAudit;
|
|
9
|
+
private checkAuditStatus;
|
|
10
|
+
private getAuditResult;
|
|
11
|
+
private getPdfReport;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=ReinforcedHardhatRuntimeEnvironmentField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReinforcedHardhatRuntimeEnvironmentField.d.ts","sourceRoot":"","sources":["../src/ReinforcedHardhatRuntimeEnvironmentField.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAyD,MAAM,SAAS,CAAC;AAE7F,qBAAa,wCAAwC;IACtC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YAgChJ,yBAAyB;YAIzB,uBAAuB;YAIvB,qBAAqB;YAIrB,UAAU;YAQV,YAAY;YAcZ,gBAAgB;YAkBhB,cAAc;YAmBd,YAAY;CAc3B"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ReinforcedHardhatRuntimeEnvironmentField = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const nanospinner_1 = require("nanospinner");
|
|
9
|
+
const consts_1 = require("./consts");
|
|
10
|
+
const types_1 = require("./types");
|
|
11
|
+
class ReinforcedHardhatRuntimeEnvironmentField {
|
|
12
|
+
async auditContract(sourceCode, apiKey, statusCheckInterval, maxRetries, reportFolder) {
|
|
13
|
+
const taskId = await this.requestAuditWithRetry(statusCheckInterval, maxRetries, sourceCode, apiKey);
|
|
14
|
+
let spinner = null;
|
|
15
|
+
while (true) {
|
|
16
|
+
const status = await this.checkAuditStatusWithRetry(statusCheckInterval, maxRetries, taskId, apiKey);
|
|
17
|
+
if (status == 'pending' || status == 'processing') {
|
|
18
|
+
if (!spinner)
|
|
19
|
+
spinner = (0, nanospinner_1.createSpinner)('Processing...').start();
|
|
20
|
+
await sleep(statusCheckInterval ?? consts_1.STATUS_CHECK_INTERVAL);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
if (spinner)
|
|
26
|
+
spinner.success();
|
|
27
|
+
const result = this.getAuditResultWithRetry(statusCheckInterval, maxRetries, taskId, apiKey);
|
|
28
|
+
fs_1.default.mkdirSync(reportFolder ?? './reinforcedai_reports', { recursive: true });
|
|
29
|
+
try {
|
|
30
|
+
const report = await this.getPdfReport(taskId, apiKey);
|
|
31
|
+
console.log(`📄 PDF report generated: ${report.filename} (${(report.size_bytes / 1024).toFixed(2)} KB)`);
|
|
32
|
+
const bin = Buffer.from(report.pdf_base64, 'base64');
|
|
33
|
+
if (report.size_bytes !== bin.length) {
|
|
34
|
+
console.warn(`Warning: PDF size mismatch. Expected ${report.size_bytes} bytes, but got ${bin.length} bytes.`);
|
|
35
|
+
}
|
|
36
|
+
fs_1.default.writeFileSync(`${reportFolder ?? './reinforcedai_reports'}/${report.filename}`, bin);
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
console.error(`Failed to generate PDF report: ${e.message}`);
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
async checkAuditStatusWithRetry(retryDelay, maxRetries, ...args) {
|
|
44
|
+
return await retryHttpRequest(() => this.checkAuditStatus(...args), retryDelay, maxRetries);
|
|
45
|
+
}
|
|
46
|
+
async getAuditResultWithRetry(retryDelay, maxRetries, ...args) {
|
|
47
|
+
return await retryHttpRequest(() => this.getAuditResult(...args), retryDelay, maxRetries);
|
|
48
|
+
}
|
|
49
|
+
async requestAuditWithRetry(retryDelay, maxRetries, ...args) {
|
|
50
|
+
return await retryHttpRequest(() => this.requestAudit(...args), retryDelay, maxRetries);
|
|
51
|
+
}
|
|
52
|
+
async fetchAudit(payload, apiKey) {
|
|
53
|
+
return await fetch(consts_1.AUDIT_URL, {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: auditHeaders(apiKey),
|
|
56
|
+
body: JSON.stringify(payload),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async requestAudit(sourceCode, apiKey) {
|
|
60
|
+
const payload = {
|
|
61
|
+
'jsonrpc': '2.0',
|
|
62
|
+
'method': 'audit.get',
|
|
63
|
+
'params': { 'code': sourceCode },
|
|
64
|
+
'id': 1,
|
|
65
|
+
};
|
|
66
|
+
const response = await this.fetchAudit(payload, apiKey);
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw new types_1.HttpError(`HTTP ${response.status} ${response.statusText}`, response.status);
|
|
69
|
+
}
|
|
70
|
+
return (await response.json()).result.task_id;
|
|
71
|
+
}
|
|
72
|
+
async checkAuditStatus(taskId, apiKey) {
|
|
73
|
+
const payload = {
|
|
74
|
+
'jsonrpc': '2.0',
|
|
75
|
+
'method': 'task.status',
|
|
76
|
+
'params': { 'task_id': taskId },
|
|
77
|
+
'id': 2,
|
|
78
|
+
};
|
|
79
|
+
const response = await this.fetchAudit(payload, apiKey);
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
throw new types_1.HttpError(`HTTP ${response.status} ${response.statusText}`, response.status);
|
|
82
|
+
}
|
|
83
|
+
const auditResponse = (await response.json());
|
|
84
|
+
if (auditResponse.result.error_message) {
|
|
85
|
+
throw new Error(`Error on task.status ${auditResponse.result.error_message}`);
|
|
86
|
+
}
|
|
87
|
+
return auditResponse.result.status;
|
|
88
|
+
}
|
|
89
|
+
async getAuditResult(taskId, apiKey) {
|
|
90
|
+
const payload = {
|
|
91
|
+
'jsonrpc': '2.0',
|
|
92
|
+
'method': 'task.result',
|
|
93
|
+
'params': { 'task_id': taskId },
|
|
94
|
+
'id': 3,
|
|
95
|
+
};
|
|
96
|
+
const response = await this.fetchAudit(payload, apiKey);
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
throw new types_1.HttpError(`HTTP ${response.status} ${response.statusText}`, response.status);
|
|
99
|
+
}
|
|
100
|
+
const auditResponse = (await response.json());
|
|
101
|
+
if (auditResponse.result.error_message) {
|
|
102
|
+
throw new Error(`Error on task.result ${auditResponse.result.error_message}`);
|
|
103
|
+
}
|
|
104
|
+
return auditResponse.result;
|
|
105
|
+
}
|
|
106
|
+
async getPdfReport(taskId, apiKey) {
|
|
107
|
+
const payload = {
|
|
108
|
+
'jsonrpc': '2.0',
|
|
109
|
+
'method': 'task.generate_pdf',
|
|
110
|
+
'params': { 'task_id': taskId },
|
|
111
|
+
'id': 4,
|
|
112
|
+
};
|
|
113
|
+
const response = await this.fetchAudit(payload, apiKey);
|
|
114
|
+
if (!response.ok) {
|
|
115
|
+
throw new types_1.HttpError(`HTTP ${response.status} ${response.statusText}`, response.status);
|
|
116
|
+
}
|
|
117
|
+
return (await response.json()).result;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.ReinforcedHardhatRuntimeEnvironmentField = ReinforcedHardhatRuntimeEnvironmentField;
|
|
121
|
+
async function retryHttpRequest(request, retryDelay = consts_1.STATUS_CHECK_INTERVAL, maxRetries = consts_1.MAX_RETRIES) {
|
|
122
|
+
let attempt = 0;
|
|
123
|
+
while (true) {
|
|
124
|
+
try {
|
|
125
|
+
return await request();
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
attempt++;
|
|
129
|
+
if (attempt <= maxRetries && e instanceof types_1.HttpError && (e.statusCode == 429 || e.statusCode >= 500)) {
|
|
130
|
+
const base = retryDelay * 2 ** (attempt - 1);
|
|
131
|
+
const delay = Math.random() * base;
|
|
132
|
+
console.warn(`Retry #${attempt} in ${Math.round(delay)} ms`, e);
|
|
133
|
+
await sleep(delay);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
throw e;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function sleep(ms) {
|
|
143
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
144
|
+
}
|
|
145
|
+
function auditHeaders(apiKey) {
|
|
146
|
+
return {
|
|
147
|
+
'Content-Type': 'application/json',
|
|
148
|
+
'X-Auth-Token': 'Bearer ' + apiKey,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=ReinforcedHardhatRuntimeEnvironmentField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReinforcedHardhatRuntimeEnvironmentField.js","sourceRoot":"","sources":["../src/ReinforcedHardhatRuntimeEnvironmentField.ts"],"names":[],"mappings":"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"}
|
package/dist/consts.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C,eAAO,MAAM,SAAS,uCAAuC,CAAC;AAC9D,eAAO,MAAM,WAAW,IAAI,CAAC"}
|
package/dist/consts.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_RETRIES = exports.AUDIT_URL = exports.STATUS_CHECK_INTERVAL = void 0;
|
|
4
|
+
exports.STATUS_CHECK_INTERVAL = 10_000;
|
|
5
|
+
exports.AUDIT_URL = 'https://api.reinforced.app/jsonrpc';
|
|
6
|
+
exports.MAX_RETRIES = 3;
|
|
7
|
+
//# sourceMappingURL=consts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG,MAAM,CAAC;AAC/B,QAAA,SAAS,GAAG,oCAAoC,CAAC;AACjD,QAAA,WAAW,GAAG,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const task_names_1 = require("hardhat/builtin-tasks/task-names");
|
|
41
|
+
const config_1 = require("hardhat/config");
|
|
42
|
+
const contract_names_1 = require("hardhat/utils/contract-names");
|
|
43
|
+
const tty_table_1 = __importDefault(require("tty-table"));
|
|
44
|
+
const AutoFixManager_1 = require("./AutoFixManager");
|
|
45
|
+
const ContractUnflattener_1 = require("./ContractUnflattener");
|
|
46
|
+
const ReinforcedHardhatRuntimeEnvironmentField_1 = require("./ReinforcedHardhatRuntimeEnvironmentField");
|
|
47
|
+
require("./type-extensions");
|
|
48
|
+
(0, config_1.subtask)(task_names_1.TASK_COMPILE_SOLIDITY, async (args, hre, runSuper) => {
|
|
49
|
+
await runSuper(args); // run regular compilation first
|
|
50
|
+
if (!hre.config.reinforced?.compilationHookEnabled) {
|
|
51
|
+
console.log('Reinforced verification not enabled.');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
await auditAllContracts(hre);
|
|
55
|
+
console.log('✅ Audit complete before deployment.');
|
|
56
|
+
});
|
|
57
|
+
(0, config_1.task)('scan', 'Run pre-deployment audit', async (_, hre) => {
|
|
58
|
+
await hre.run(task_names_1.TASK_COMPILE_SOLIDITY, { force: false, quiet: true });
|
|
59
|
+
await auditAllContracts(hre);
|
|
60
|
+
console.log('✅ Audit complete');
|
|
61
|
+
});
|
|
62
|
+
(0, config_1.task)('scan:autofix', 'Run audit and apply auto-fixes for vulnerabilities', async (_, hre) => {
|
|
63
|
+
await hre.run(task_names_1.TASK_COMPILE_SOLIDITY, { force: false, quiet: true });
|
|
64
|
+
await auditAllContractsWithAutoFix(hre);
|
|
65
|
+
console.log('✅ Audit and auto-fix complete');
|
|
66
|
+
});
|
|
67
|
+
async function auditAllContractsWithAutoFix(hre) {
|
|
68
|
+
const apiKey = hre.config.reinforced?.apiKey;
|
|
69
|
+
if (!apiKey) {
|
|
70
|
+
console.log('Reinforced API key not set.');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const flatSource = await hre.run(task_names_1.TASK_FLATTEN_GET_FLATTENED_SOURCE, { force: false, quiet: true });
|
|
74
|
+
const qualifiedContractNames = await hre.artifacts.getAllFullyQualifiedNames();
|
|
75
|
+
const sourcePaths = [];
|
|
76
|
+
for (const qualifiedContractName of qualifiedContractNames) {
|
|
77
|
+
const { sourceName } = (0, contract_names_1.parseFullyQualifiedName)(qualifiedContractName);
|
|
78
|
+
if (sourcePaths.includes(sourceName))
|
|
79
|
+
continue;
|
|
80
|
+
sourcePaths.push(sourceName);
|
|
81
|
+
}
|
|
82
|
+
if (sourcePaths.length > 0) {
|
|
83
|
+
try {
|
|
84
|
+
if (sourcePaths.length > 1) {
|
|
85
|
+
console.log('Auditing:');
|
|
86
|
+
for (const path of sourcePaths)
|
|
87
|
+
console.log(' ', path);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.log('Auditing ', sourcePaths[0]);
|
|
91
|
+
}
|
|
92
|
+
const auditResult = await hre.reinforced.auditContract(flatSource, apiKey, hre.config.reinforced?.statusCheckInterval);
|
|
93
|
+
if (auditResult.error_message)
|
|
94
|
+
console.log('Error processing contract:', auditResult.error_message);
|
|
95
|
+
else if (!auditResult.result || auditResult.result.length == 0)
|
|
96
|
+
console.log('No vulnerabilities found');
|
|
97
|
+
else {
|
|
98
|
+
const enrichedVulnerabilities = enrichVulnerabilitiesWithOriginalMapping(auditResult.result, flatSource, sourcePaths.map(sp => sp.trim()));
|
|
99
|
+
console.log(formatAuditResult(enrichedVulnerabilities, flatSource));
|
|
100
|
+
const autoFixManager = new AutoFixManager_1.AutoFixManager();
|
|
101
|
+
const selections = autoFixManager.promptUserForVulnerabilitySelection(enrichedVulnerabilities);
|
|
102
|
+
if (selections.some(s => s.shouldFix)) {
|
|
103
|
+
const result = autoFixManager.applyAutoFixes(enrichedVulnerabilities, selections, flatSource, sourcePaths.map(sp => sp.trim()));
|
|
104
|
+
autoFixManager.displayAutoFixSummary(result, enrichedVulnerabilities);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.error('Error auditing contracts:', error);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function enrichVulnerabilitiesWithOriginalMapping(vulnerabilities, flattenedSource, sourcePaths) {
|
|
114
|
+
const unflattener = new ContractUnflattener_1.ContractUnflattener();
|
|
115
|
+
unflattener.parseFlattened(flattenedSource, sourcePaths);
|
|
116
|
+
return vulnerabilities.map(vuln => {
|
|
117
|
+
const mapping = unflattener.mapVulnerabilityToOriginal(vuln.from_line, vuln.to_line);
|
|
118
|
+
console.log('Mapping for vulnerability:', mapping);
|
|
119
|
+
if (mapping) {
|
|
120
|
+
return {
|
|
121
|
+
...vuln,
|
|
122
|
+
original_file: mapping.originalFile,
|
|
123
|
+
original_from_line: mapping.originalFromLine,
|
|
124
|
+
original_to_line: mapping.originalToLine,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return vuln;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
async function auditAllContracts(hre) {
|
|
131
|
+
const apiKey = hre.config.reinforced?.apiKey;
|
|
132
|
+
if (!apiKey) {
|
|
133
|
+
console.log('Reinforced API key not set.');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const flatSource = await hre.run(task_names_1.TASK_FLATTEN_GET_FLATTENED_SOURCE, { force: false, quiet: true });
|
|
137
|
+
const qualifiedContractNames = await hre.artifacts.getAllFullyQualifiedNames();
|
|
138
|
+
const sourcePaths = [];
|
|
139
|
+
for (const qualifiedContractName of qualifiedContractNames) {
|
|
140
|
+
const { sourceName } = (0, contract_names_1.parseFullyQualifiedName)(qualifiedContractName);
|
|
141
|
+
if (sourcePaths.includes(sourceName))
|
|
142
|
+
continue;
|
|
143
|
+
sourcePaths.push(sourceName);
|
|
144
|
+
}
|
|
145
|
+
if (sourcePaths.length > 0) {
|
|
146
|
+
try {
|
|
147
|
+
if (sourcePaths.length > 1) {
|
|
148
|
+
console.log('Auditing:');
|
|
149
|
+
for (const path of sourcePaths)
|
|
150
|
+
console.log(' ', path);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
console.log('Auditing ', sourcePaths[0]);
|
|
154
|
+
}
|
|
155
|
+
const auditResult = await hre.reinforced.auditContract(flatSource, apiKey, hre.config.reinforced?.statusCheckInterval);
|
|
156
|
+
if (auditResult.error_message)
|
|
157
|
+
console.log('Error processing contract:', auditResult.error_message);
|
|
158
|
+
else if (!auditResult.result || auditResult.result.length == 0)
|
|
159
|
+
console.log('No vulnerabilities found');
|
|
160
|
+
else {
|
|
161
|
+
const enrichedVulnerabilities = enrichVulnerabilitiesWithOriginalMapping(auditResult.result, flatSource, sourcePaths.map(sp => sp.trim()));
|
|
162
|
+
console.log('Enriched vulnerabilities:', enrichedVulnerabilities);
|
|
163
|
+
console.log(formatAuditResult(enrichedVulnerabilities, flatSource));
|
|
164
|
+
if (hre.config.reinforced?.autoFixEnabled !== false) {
|
|
165
|
+
const autoFixManager = new AutoFixManager_1.AutoFixManager();
|
|
166
|
+
const selections = autoFixManager.promptUserForVulnerabilitySelection(enrichedVulnerabilities);
|
|
167
|
+
if (selections.some(s => s.shouldFix)) {
|
|
168
|
+
const result = autoFixManager.applyAutoFixes(enrichedVulnerabilities, selections, flatSource, sourcePaths.map(sp => sp.trim()));
|
|
169
|
+
autoFixManager.displayAutoFixSummary(result, enrichedVulnerabilities);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
console.log('\n💡 Auto-fix is disabled. You can enable it by setting "autoFixEnabled: true" in your hardhat.config.ts');
|
|
174
|
+
console.log(' Or run "npx hardhat audit:autofix" to run with auto-fix enabled.');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
console.error('Error auditing contracts:', error);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function formatAuditResult(vulnerabilities, sourceCode) {
|
|
184
|
+
let output = '\n';
|
|
185
|
+
for (let i = 0; i < vulnerabilities.length; i++) {
|
|
186
|
+
const vulnerability = vulnerabilities[i];
|
|
187
|
+
output += `Possible vulnerability: ${vulnerability.vulnerability_class}${vulnerability.original_file ? ` in ${vulnerability.original_file.split('/').pop()}` : ''}`;
|
|
188
|
+
const headers = [{
|
|
189
|
+
value: '',
|
|
190
|
+
width: '20%',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
value: '',
|
|
194
|
+
width: '80%',
|
|
195
|
+
}];
|
|
196
|
+
let affectedCode;
|
|
197
|
+
if (vulnerability.original_file && vulnerability.original_from_line && vulnerability.original_to_line) {
|
|
198
|
+
try {
|
|
199
|
+
const originalFileContent = fs.readFileSync(vulnerability.original_file, 'utf8');
|
|
200
|
+
affectedCode = originalFileContent.split('\n')
|
|
201
|
+
.slice(vulnerability.original_from_line - 1, vulnerability.original_to_line)
|
|
202
|
+
.map((line, index) => {
|
|
203
|
+
const lineNumber = vulnerability.original_from_line + index;
|
|
204
|
+
return `${lineNumber.toString().padStart(4, ' ')}: ${line}`;
|
|
205
|
+
})
|
|
206
|
+
.join('\n');
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
affectedCode = sourceCode.split('\n')
|
|
210
|
+
.slice(vulnerability.from_line - 1, vulnerability.to_line)
|
|
211
|
+
.map((line, index) => {
|
|
212
|
+
const lineNumber = vulnerability.from_line + index;
|
|
213
|
+
return `${lineNumber.toString().padStart(4, ' ')}: ${line}`;
|
|
214
|
+
})
|
|
215
|
+
.join('\n');
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
affectedCode = sourceCode.split('\n')
|
|
220
|
+
.slice(vulnerability.from_line - 1, vulnerability.to_line)
|
|
221
|
+
.map((line, index) => {
|
|
222
|
+
const lineNumber = vulnerability.from_line + index;
|
|
223
|
+
return `${lineNumber.toString().padStart(4, ' ')}: ${line}`;
|
|
224
|
+
})
|
|
225
|
+
.join('\n');
|
|
226
|
+
}
|
|
227
|
+
const rows = [
|
|
228
|
+
['Possibility ', `${vulnerability.miners_select_count}/${vulnerability.miners_participated_count}`],
|
|
229
|
+
['Description ', vulnerability.description],
|
|
230
|
+
['Affected code ', affectedCode],
|
|
231
|
+
['Possible fix ', vulnerability.fixed_lines || 'No fix provided'],
|
|
232
|
+
['Test case ', vulnerability.test_case || 'No test case provided'],
|
|
233
|
+
['Is suggestion', vulnerability.is_suggestion ? 'Yes' : 'No'],
|
|
234
|
+
];
|
|
235
|
+
const options = {
|
|
236
|
+
width: '100%',
|
|
237
|
+
borderStyle: 'solid',
|
|
238
|
+
align: 'left',
|
|
239
|
+
};
|
|
240
|
+
const table = (0, tty_table_1.default)(headers, rows, options);
|
|
241
|
+
output += table.render();
|
|
242
|
+
output += '\n\n';
|
|
243
|
+
}
|
|
244
|
+
return output;
|
|
245
|
+
}
|
|
246
|
+
(0, config_1.extendEnvironment)((hre) => {
|
|
247
|
+
hre.reinforced = new ReinforcedHardhatRuntimeEnvironmentField_1.ReinforcedHardhatRuntimeEnvironmentField();
|
|
248
|
+
});
|
|
249
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ReinforcedHardhatRuntimeEnvironmentField } from 'ReinforcedHardhatRuntimeEnvironmentField';
|
|
2
|
+
import 'hardhat/types/config';
|
|
3
|
+
export interface ReinforcedUserConfig {
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
compilationHookEnabled?: boolean;
|
|
6
|
+
statusCheckInterval?: number;
|
|
7
|
+
maxRetries?: number;
|
|
8
|
+
autoFixEnabled?: boolean;
|
|
9
|
+
reportFolder?: string;
|
|
10
|
+
}
|
|
11
|
+
declare module 'hardhat/types/config' {
|
|
12
|
+
interface HardhatUserConfig {
|
|
13
|
+
reinforced?: ReinforcedUserConfig;
|
|
14
|
+
}
|
|
15
|
+
interface HardhatConfig {
|
|
16
|
+
reinforced?: ReinforcedUserConfig;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
declare module 'hardhat/types/runtime' {
|
|
20
|
+
interface HardhatRuntimeEnvironment {
|
|
21
|
+
reinforced: ReinforcedHardhatRuntimeEnvironmentField;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=type-extensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-extensions.d.ts","sourceRoot":"","sources":["../src/type-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wCAAwC,EAAE,MAAM,0CAA0C,CAAC;AACpG,OAAO,sBAAsB,CAAC;AAE9B,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,iBAAiB;QACzB,UAAU,CAAC,EAAE,oBAAoB,CAAC;KACnC;IAED,UAAU,aAAa;QACrB,UAAU,CAAC,EAAE,oBAAoB,CAAC;KACnC;CACF;AAED,OAAO,QAAQ,uBAAuB,CAAC;IACrC,UAAiB,yBAAyB;QACtC,UAAU,EAAE,wCAAwC,CAAC;KACxD;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-extensions.js","sourceRoot":"","sources":["../src/type-extensions.ts"],"names":[],"mappings":";;AACA,gCAA8B"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export type AuditStatus = 'pending' | 'processing' | 'failed' | 'completed';
|
|
2
|
+
export interface AuditResult {
|
|
3
|
+
error_message: string | null;
|
|
4
|
+
result: Vulnerability[] | null;
|
|
5
|
+
status: AuditStatus;
|
|
6
|
+
task_id: string;
|
|
7
|
+
}
|
|
8
|
+
export interface JRPCResponse<T> {
|
|
9
|
+
id: number;
|
|
10
|
+
jsonrpc: string;
|
|
11
|
+
result: T;
|
|
12
|
+
}
|
|
13
|
+
export interface PdfReportResult {
|
|
14
|
+
task_id: string;
|
|
15
|
+
filename: string;
|
|
16
|
+
pdf_base64: string;
|
|
17
|
+
size_bytes: number;
|
|
18
|
+
}
|
|
19
|
+
export interface Vulnerability {
|
|
20
|
+
description: string;
|
|
21
|
+
fixed_lines: string | null;
|
|
22
|
+
from_line: number;
|
|
23
|
+
is_suggestion: boolean;
|
|
24
|
+
miners_select_count: number;
|
|
25
|
+
miners_participated_count: number;
|
|
26
|
+
prior_art: any[];
|
|
27
|
+
test_case: string | null;
|
|
28
|
+
to_line: number;
|
|
29
|
+
vulnerability_class: string;
|
|
30
|
+
original_file?: string;
|
|
31
|
+
original_from_line?: number;
|
|
32
|
+
original_to_line?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface VulnerabilityWithIndex extends Vulnerability {
|
|
35
|
+
index: number;
|
|
36
|
+
}
|
|
37
|
+
export interface AutoFixSelection {
|
|
38
|
+
vulnerabilityIndex: number;
|
|
39
|
+
shouldFix: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface CodeReplacementResult {
|
|
42
|
+
success: boolean;
|
|
43
|
+
filePath?: string;
|
|
44
|
+
error?: string;
|
|
45
|
+
appliedFixes: number[];
|
|
46
|
+
modifiedFiles?: string[];
|
|
47
|
+
}
|
|
48
|
+
export declare class HttpError extends Error {
|
|
49
|
+
statusCode: number;
|
|
50
|
+
constructor(message: string, statusCode: number);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE5E,MAAM,WAAW,WAAW;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,aAAa,EAAG,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,CAAA;CACZ;AAED,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB,EAAE,MAAM,CAAC;IAClC,SAAS,EAAE,GAAG,EAAG,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IACzD,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,qBAAa,SAAU,SAAQ,KAAK;IAC3B,UAAU,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAKhD"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpError = void 0;
|
|
4
|
+
;
|
|
5
|
+
class HttpError extends Error {
|
|
6
|
+
statusCode;
|
|
7
|
+
constructor(message, statusCode) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'HttpError';
|
|
10
|
+
this.statusCode = statusCode;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.HttpError = HttpError;
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAOC,CAAC;AAgDF,MAAa,SAAU,SAAQ,KAAK;IAC3B,UAAU,CAAS;IAE1B,YAAY,OAAe,EAAE,UAAkB;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AARD,8BAQC"}
|
package/package.json
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
"main": "dist/index.js",
|
|
4
4
|
"types": "dist/index.d.ts",
|
|
5
5
|
"type": "commonjs",
|
|
6
|
-
"version": "
|
|
6
|
+
"version": "2512.08.1",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"lint:fix": "prettier --write 'src/**/*.{js,ts}' 'test/**/*.{js,ts}' && tslint --fix --config tslint.json --project tsconfig.json",
|
|
9
9
|
"lint": "tslint --config tslint.json --project tsconfig.json",
|
|
10
10
|
"test": "mocha",
|
|
11
11
|
"clean": "rm -rf dist && cd test/fixture-projects/hardhat-project && npx hardhat clean",
|
|
12
|
-
"build": "npm run clean &&
|
|
12
|
+
"build": "npm run clean && tsc",
|
|
13
13
|
"watch": "tsc -w",
|
|
14
14
|
"prepublishOnly": "npm run build"
|
|
15
15
|
},
|
package/src/index.ts
CHANGED
|
@@ -23,13 +23,13 @@ subtask(TASK_COMPILE_SOLIDITY, async (args, hre, runSuper) => {
|
|
|
23
23
|
console.log('✅ Audit complete before deployment.');
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
-
task('
|
|
26
|
+
task('scan', 'Run pre-deployment audit', async (_, hre) => {
|
|
27
27
|
await hre.run(TASK_COMPILE_SOLIDITY, {force: false, quiet: true});
|
|
28
28
|
await auditAllContracts(hre);
|
|
29
29
|
console.log('✅ Audit complete');
|
|
30
30
|
});
|
|
31
31
|
|
|
32
|
-
task('
|
|
32
|
+
task('scan:autofix', 'Run audit and apply auto-fixes for vulnerabilities', async (_, hre) => {
|
|
33
33
|
await hre.run(TASK_COMPILE_SOLIDITY, {force: false, quiet: true});
|
|
34
34
|
await auditAllContractsWithAutoFix(hre);
|
|
35
35
|
console.log('✅ Audit and auto-fix complete');
|