hardhat 3.13.0 → 3.15.0
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/CHANGELOG.md +30 -0
- package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.d.ts +2 -2
- package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.d.ts.map +1 -1
- package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.js +41 -20
- package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.js.map +1 -1
- package/dist/src/internal/builtin-plugins/network-manager/chain-descriptors.d.ts.map +1 -1
- package/dist/src/internal/builtin-plugins/network-manager/chain-descriptors.js +0 -17
- package/dist/src/internal/builtin-plugins/network-manager/chain-descriptors.js.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity/build-system/resolver/dependency-resolver.d.ts.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity/build-system/resolver/dependency-resolver.js +10 -4
- package/dist/src/internal/builtin-plugins/solidity/build-system/resolver/dependency-resolver.js.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity/type-extensions.d.ts +2 -2
- package/dist/src/internal/builtin-plugins/solidity-test/edr-artifacts.d.ts.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/edr-artifacts.js +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/edr-artifacts.js.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/formatters.d.ts +6 -1
- package/dist/src/internal/builtin-plugins/solidity-test/formatters.d.ts.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/formatters.js +41 -0
- package/dist/src/internal/builtin-plugins/solidity-test/formatters.js.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/helpers.d.ts +16 -3
- package/dist/src/internal/builtin-plugins/solidity-test/helpers.d.ts.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/helpers.js +45 -2
- package/dist/src/internal/builtin-plugins/solidity-test/helpers.js.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/reporter.js +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/reporter.js.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/runner.d.ts.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/runner.js +18 -1
- package/dist/src/internal/builtin-plugins/solidity-test/runner.js.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/task-action.d.ts.map +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/task-action.js +15 -16
- package/dist/src/internal/builtin-plugins/solidity-test/task-action.js.map +1 -1
- package/package.json +3 -3
- package/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.ts +65 -23
- package/src/internal/builtin-plugins/network-manager/chain-descriptors.ts +0 -17
- package/src/internal/builtin-plugins/solidity/build-system/resolver/dependency-resolver.ts +25 -5
- package/src/internal/builtin-plugins/solidity/type-extensions.ts +2 -2
- package/src/internal/builtin-plugins/solidity-test/edr-artifacts.ts +1 -1
- package/src/internal/builtin-plugins/solidity-test/formatters.ts +60 -1
- package/src/internal/builtin-plugins/solidity-test/helpers.ts +56 -4
- package/src/internal/builtin-plugins/solidity-test/reporter.ts +1 -1
- package/src/internal/builtin-plugins/solidity-test/runner.ts +33 -1
- package/src/internal/builtin-plugins/solidity-test/task-action.ts +20 -20
- package/templates/01-node-test-runner-viem/contracts/Counter.sol +1 -1
- package/templates/01-node-test-runner-viem/contracts/Counter.t.sol +1 -1
- package/templates/01-node-test-runner-viem/hardhat.config.ts +2 -2
- package/templates/01-node-test-runner-viem/package.json +2 -2
- package/templates/02-mocha-ethers/contracts/Counter.sol +1 -1
- package/templates/02-mocha-ethers/contracts/Counter.t.sol +1 -1
- package/templates/02-mocha-ethers/hardhat.config.ts +2 -2
- package/templates/02-mocha-ethers/package.json +2 -2
- package/templates/03-minimal/hardhat.config.ts +1 -1
- package/templates/03-minimal/package.json +1 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/constants.d.ts +0 -9
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/constants.d.ts.map +0 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/constants.js +0 -24
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/constants.js.map +0 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/helpers.d.ts +0 -24
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/helpers.d.ts.map +0 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/helpers.js +0 -80
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/helpers.js.map +0 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.d.ts +0 -13
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.d.ts.map +0 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.js +0 -146
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.js.map +0 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/parsing.d.ts +0 -19
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/parsing.d.ts.map +0 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/parsing.js +0 -134
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/parsing.js.map +0 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/types.d.ts +0 -10
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/types.d.ts.map +0 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/types.js +0 -2
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/types.js.map +0 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/validation.d.ts +0 -13
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/validation.d.ts.map +0 -1
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/validation.js +0 -96
- package/dist/src/internal/builtin-plugins/solidity-test/inline-config/validation.js.map +0 -1
- package/src/internal/builtin-plugins/solidity-test/inline-config/constants.ts +0 -25
- package/src/internal/builtin-plugins/solidity-test/inline-config/helpers.ts +0 -110
- package/src/internal/builtin-plugins/solidity-test/inline-config/index.ts +0 -285
- package/src/internal/builtin-plugins/solidity-test/inline-config/parsing.ts +0 -187
- package/src/internal/builtin-plugins/solidity-test/inline-config/types.ts +0 -9
- package/src/internal/builtin-plugins/solidity-test/inline-config/validation.ts +0 -144
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { assertHardhatInvariant } from "@nomicfoundation/hardhat-errors";
|
|
2
|
-
import { bytesIncludesUtf8String } from "@nomicfoundation/hardhat-utils/bytes";
|
|
3
|
-
import { getFullyQualifiedName } from "../../../../utils/contract-names.js";
|
|
4
|
-
import { HARDHAT_CONFIG_PREFIX, FORGE_CONFIG_PREFIX, KEY_TYPES, } from "./constants.js";
|
|
5
|
-
/**
|
|
6
|
-
* Returns true if the build info bytes contain either of the inline config
|
|
7
|
-
* prefixes.
|
|
8
|
-
*/
|
|
9
|
-
export function buildInfoContainsInlineConfig(buildInfoBytes) {
|
|
10
|
-
return (bytesIncludesUtf8String(buildInfoBytes, HARDHAT_CONFIG_PREFIX) ||
|
|
11
|
-
bytesIncludesUtf8String(buildInfoBytes, FORGE_CONFIG_PREFIX));
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Finds the function selector for a given function name in the methodIdentifiers
|
|
15
|
-
* map. Matches the first entry whose signature starts with `functionName(`.
|
|
16
|
-
* Returns the selector prefixed with "0x".
|
|
17
|
-
*/
|
|
18
|
-
export function resolveFunctionSelector(methodIdentifiers, functionName) {
|
|
19
|
-
const prefix = `${functionName}(`;
|
|
20
|
-
for (const [signature, selector] of Object.entries(methodIdentifiers)) {
|
|
21
|
-
if (signature.startsWith(prefix)) {
|
|
22
|
-
return `0x${selector}`;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return undefined;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Converts a validated set of raw overrides into a TestFunctionConfigOverride
|
|
29
|
-
* object.
|
|
30
|
-
*/
|
|
31
|
-
export function buildConfigOverride(overrides) {
|
|
32
|
-
const config = {};
|
|
33
|
-
const fuzz = {};
|
|
34
|
-
const invariant = {};
|
|
35
|
-
for (const override of overrides) {
|
|
36
|
-
const expectedType = KEY_TYPES[override.key];
|
|
37
|
-
let parsed;
|
|
38
|
-
if (expectedType === "number") {
|
|
39
|
-
parsed = Number(override.rawValue);
|
|
40
|
-
}
|
|
41
|
-
else if (expectedType === "boolean") {
|
|
42
|
-
parsed = override.rawValue.toLowerCase() === "true";
|
|
43
|
-
}
|
|
44
|
-
else if (expectedType === "string") {
|
|
45
|
-
// Validation has already proven the surrounding double quotes.
|
|
46
|
-
parsed = override.rawValue.slice(1, -1);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
assertHardhatInvariant(false, `Unhandled inline config value type for key ${override.key}`);
|
|
50
|
-
}
|
|
51
|
-
const dotIndex = override.key.indexOf(".");
|
|
52
|
-
if (dotIndex === -1) {
|
|
53
|
-
// Top-level key, like "allowInternalExpectRevert"
|
|
54
|
-
config[override.key] = parsed;
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
const section = override.key.slice(0, dotIndex);
|
|
58
|
-
const field = override.key.slice(dotIndex + 1);
|
|
59
|
-
const target = section === "fuzz" ? fuzz : invariant;
|
|
60
|
-
target[field] = field === "timeout" ? { time: parsed } : parsed;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
if (Object.keys(fuzz).length > 0) {
|
|
64
|
-
config.fuzz = fuzz;
|
|
65
|
-
}
|
|
66
|
-
if (Object.keys(invariant).length > 0) {
|
|
67
|
-
config.invariant = invariant;
|
|
68
|
-
}
|
|
69
|
-
/* eslint-disable-next-line @typescript-eslint/consistent-type-assertions --
|
|
70
|
-
Cast is safe because we have validated all keys and value types in the previous step. */
|
|
71
|
-
return config;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Constructs a fully qualified function name, in the format
|
|
75
|
-
* "source.sol:ContractName#functionName".
|
|
76
|
-
*/
|
|
77
|
-
export function getFunctionFqn(inputSourceName, contractName, functionName) {
|
|
78
|
-
return `${getFullyQualifiedName(inputSourceName, contractName)}#${functionName}`;
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../../../src/internal/builtin-plugins/solidity-test/inline-config/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { BuildInfoAndOutput, EdrArtifactWithMetadata } from "../edr-artifacts.js";
|
|
2
|
-
import type { TestFunctionOverride } from "@nomicfoundation/edr";
|
|
3
|
-
export type { RawInlineOverride } from "./types.js";
|
|
4
|
-
export { buildInfoContainsInlineConfig, resolveFunctionSelector, buildConfigOverride, getFunctionFqn, } from "./helpers.js";
|
|
5
|
-
export { extractInlineConfigFromAst, extractDocText, parseInlineConfigLine, } from "./parsing.js";
|
|
6
|
-
export { validateInlineOverrides } from "./validation.js";
|
|
7
|
-
/**
|
|
8
|
-
* Extracts per-test inline configuration overrides from the NatSpec comments
|
|
9
|
-
* in the solc AST. It only extracts them from the build info where each
|
|
10
|
-
* test artifact's file was compiled as a root file.
|
|
11
|
-
*/
|
|
12
|
-
export declare function getTestFunctionOverrides(testSuiteArtifacts: EdrArtifactWithMetadata[], buildInfosAndOutputs: BuildInfoAndOutput[]): Promise<TestFunctionOverride[]>;
|
|
13
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/builtin-plugins/solidity-test/inline-config/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAc,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAoB7E,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,0BAA0B,EAC1B,cAAc,EACd,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAQ1D;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,kBAAkB,EAAE,uBAAuB,EAAE,EAC7C,oBAAoB,EAAE,kBAAkB,EAAE,GACzC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CASjC"}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { HardhatError, assertHardhatInvariant, } from "@nomicfoundation/hardhat-errors";
|
|
2
|
-
import { parseJsonBytes } from "@nomicfoundation/hardhat-utils/bytes";
|
|
3
|
-
import { ensureError } from "@nomicfoundation/hardhat-utils/error";
|
|
4
|
-
import { getFullyQualifiedName } from "../../../../utils/contract-names.js";
|
|
5
|
-
import { buildInfoContainsInlineConfig, resolveFunctionSelector, buildConfigOverride, getFunctionFqn, } from "./helpers.js";
|
|
6
|
-
import { extractInlineConfigFromAst } from "./parsing.js";
|
|
7
|
-
import { validateInlineOverrides } from "./validation.js";
|
|
8
|
-
export { buildInfoContainsInlineConfig, resolveFunctionSelector, buildConfigOverride, getFunctionFqn, } from "./helpers.js";
|
|
9
|
-
export { extractInlineConfigFromAst, extractDocText, parseInlineConfigLine, } from "./parsing.js";
|
|
10
|
-
export { validateInlineOverrides } from "./validation.js";
|
|
11
|
-
/**
|
|
12
|
-
* Extracts per-test inline configuration overrides from the NatSpec comments
|
|
13
|
-
* in the solc AST. It only extracts them from the build info where each
|
|
14
|
-
* test artifact's file was compiled as a root file.
|
|
15
|
-
*/
|
|
16
|
-
export async function getTestFunctionOverrides(testSuiteArtifacts, buildInfosAndOutputs) {
|
|
17
|
-
const allRawOverrides = await collectRawOverrides(testSuiteArtifacts, buildInfosAndOutputs);
|
|
18
|
-
validateInlineOverrides(allRawOverrides.overrides);
|
|
19
|
-
return buildTestFunctionOverrides(allRawOverrides);
|
|
20
|
-
}
|
|
21
|
-
async function collectRawOverrides(testSuiteArtifacts, buildInfosAndOutputs) {
|
|
22
|
-
const overrides = [];
|
|
23
|
-
const methodIdentifiersByContract = new Map();
|
|
24
|
-
// Note: We group the artifacts by their build info, so that we only process
|
|
25
|
-
// the relevant build infos, and only the root files of each of them.
|
|
26
|
-
//
|
|
27
|
-
// The last part is important, as a test file can be present in multiple build
|
|
28
|
-
// infos in the presence of partial recompilations
|
|
29
|
-
//
|
|
30
|
-
// At the same time, the same root file could have produced multiple test
|
|
31
|
-
// artifacts, so we need a two-level map to avoid processing the root files
|
|
32
|
-
// multiple times.
|
|
33
|
-
// Build lookup structures for fast access
|
|
34
|
-
const artifactsGroupedByBuildInfo = new Map();
|
|
35
|
-
const artifactIdsByFqn = new Map();
|
|
36
|
-
const buildInfoAndOutputById = new Map(buildInfosAndOutputs.map((bio) => [bio.buildInfoId, bio]));
|
|
37
|
-
for (const edrArtifactWithMetadata of testSuiteArtifacts) {
|
|
38
|
-
const fqn = getFullyQualifiedName(edrArtifactWithMetadata.edrArtifact.id.source, edrArtifactWithMetadata.edrArtifact.id.name);
|
|
39
|
-
const buildInfoId = edrArtifactWithMetadata.buildInfoId;
|
|
40
|
-
let artifactsBySource = artifactsGroupedByBuildInfo.get(buildInfoId);
|
|
41
|
-
if (artifactsBySource === undefined) {
|
|
42
|
-
artifactsBySource = new Map();
|
|
43
|
-
artifactsGroupedByBuildInfo.set(buildInfoId, artifactsBySource);
|
|
44
|
-
}
|
|
45
|
-
let artifacts = artifactsBySource.get(edrArtifactWithMetadata.edrArtifact.id.source);
|
|
46
|
-
if (artifacts === undefined) {
|
|
47
|
-
artifacts = [];
|
|
48
|
-
artifactsBySource.set(edrArtifactWithMetadata.edrArtifact.id.source, artifacts);
|
|
49
|
-
}
|
|
50
|
-
artifacts.push(edrArtifactWithMetadata);
|
|
51
|
-
artifactIdsByFqn.set(fqn, edrArtifactWithMetadata.edrArtifact.id);
|
|
52
|
-
}
|
|
53
|
-
for (const [buildInfoId, artifactsBySource,] of artifactsGroupedByBuildInfo.entries()) {
|
|
54
|
-
const buildInfoAndOutput = buildInfoAndOutputById.get(buildInfoId);
|
|
55
|
-
if (buildInfoAndOutput === undefined) {
|
|
56
|
-
// We can throw for this error for the first artifact with this build info
|
|
57
|
-
// as all of them have the same problem.
|
|
58
|
-
const artifacts = artifactsBySource.values().next().value;
|
|
59
|
-
assertHardhatInvariant(artifacts !== undefined && artifacts.length > 0, "An artifact must be present for the build info");
|
|
60
|
-
const anyArtifact = artifacts[0];
|
|
61
|
-
const fqn = getFullyQualifiedName(anyArtifact.userSourceName, anyArtifact.edrArtifact.id.name);
|
|
62
|
-
throw new HardhatError(HardhatError.ERRORS.CORE.SOLIDITY_TESTS
|
|
63
|
-
.BUILD_INFO_NOT_FOUND_FOR_CONTRACT, {
|
|
64
|
-
fqn,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
if (!buildInfoContainsInlineConfig(buildInfoAndOutput.buildInfo)) {
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
let buildInfoOutput;
|
|
71
|
-
try {
|
|
72
|
-
buildInfoOutput = await parseJsonBytes(buildInfoAndOutput.output);
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
ensureError(error);
|
|
76
|
-
throw new HardhatError(HardhatError.ERRORS.CORE.SOLIDITY.BUILD_INFO_OUTPUT_PARSE_ERROR, { buildInfoId }, error);
|
|
77
|
-
}
|
|
78
|
-
for (const [inputSourceName, sourceArtifacts,] of artifactsBySource.entries()) {
|
|
79
|
-
const contractNames = new Set(sourceArtifacts.map((a) => a.edrArtifact.id.name));
|
|
80
|
-
const source = buildInfoOutput.output.sources[inputSourceName];
|
|
81
|
-
const extracted = extractInlineConfigFromAst(source.ast, inputSourceName, contractNames);
|
|
82
|
-
overrides.push(...extracted);
|
|
83
|
-
for (const artifact of sourceArtifacts) {
|
|
84
|
-
const contractName = artifact.edrArtifact.id.name;
|
|
85
|
-
const fqn = getFullyQualifiedName(inputSourceName, contractName);
|
|
86
|
-
const methodIdentifiers = buildInfoOutput.output.contracts?.[inputSourceName][contractName]?.evm
|
|
87
|
-
?.methodIdentifiers;
|
|
88
|
-
methodIdentifiersByContract.set(fqn, methodIdentifiers ?? {});
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return { overrides, artifactIdsByFqn, methodIdentifiersByContract };
|
|
93
|
-
}
|
|
94
|
-
function buildTestFunctionOverrides(collected) {
|
|
95
|
-
const { overrides, artifactIdsByFqn, methodIdentifiersByContract } = collected;
|
|
96
|
-
// Group overrides by function. When the AST provides a functionSelector
|
|
97
|
-
// (public/external functions in solc >= 0.6.0), use it to distinguish
|
|
98
|
-
// overloaded functions. Otherwise fall back to function name only.
|
|
99
|
-
const overridesByFunction = new Map();
|
|
100
|
-
for (const override of overrides) {
|
|
101
|
-
const functionFqn = getFunctionFqn(override.inputSourceName, override.contractName, override.functionName);
|
|
102
|
-
const groupKey = override.functionSelector !== undefined
|
|
103
|
-
? `${functionFqn}#${override.functionSelector}`
|
|
104
|
-
: functionFqn;
|
|
105
|
-
const existing = overridesByFunction.get(groupKey);
|
|
106
|
-
if (existing === undefined) {
|
|
107
|
-
overridesByFunction.set(groupKey, [override]);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
existing.push(override);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// Build TestFunctionOverride objects
|
|
114
|
-
const testFunctionOverrides = [];
|
|
115
|
-
for (const [_groupKey, groupOverrides] of overridesByFunction.entries()) {
|
|
116
|
-
const firstOverride = groupOverrides[0];
|
|
117
|
-
const functionFqn = getFunctionFqn(firstOverride.inputSourceName, firstOverride.contractName, firstOverride.functionName);
|
|
118
|
-
const contractFqn = `${firstOverride.inputSourceName}:${firstOverride.contractName}`;
|
|
119
|
-
const artifactId = artifactIdsByFqn.get(contractFqn);
|
|
120
|
-
assertHardhatInvariant(artifactId !== undefined, `Missing artifact id for "${contractFqn}"`);
|
|
121
|
-
// Use the AST-provided selector when available, otherwise fall back to
|
|
122
|
-
// resolving via methodIdentifiers.
|
|
123
|
-
let selector;
|
|
124
|
-
if (firstOverride.functionSelector !== undefined) {
|
|
125
|
-
selector = `0x${firstOverride.functionSelector}`;
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
const methodIdentifiers = methodIdentifiersByContract.get(contractFqn);
|
|
129
|
-
assertHardhatInvariant(methodIdentifiers !== undefined, `Missing method identifiers for "${contractFqn}"`);
|
|
130
|
-
selector = resolveFunctionSelector(methodIdentifiers, firstOverride.functionName);
|
|
131
|
-
}
|
|
132
|
-
if (selector === undefined) {
|
|
133
|
-
throw new HardhatError(HardhatError.ERRORS.CORE.SOLIDITY_TESTS
|
|
134
|
-
.INLINE_CONFIG_UNRESOLVED_SELECTOR, { functionFqn });
|
|
135
|
-
}
|
|
136
|
-
testFunctionOverrides.push({
|
|
137
|
-
identifier: {
|
|
138
|
-
contractArtifact: artifactId,
|
|
139
|
-
functionSelector: selector,
|
|
140
|
-
},
|
|
141
|
-
config: buildConfigOverride(groupOverrides),
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
return testFunctionOverrides;
|
|
145
|
-
}
|
|
146
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/internal/builtin-plugins/solidity-test/inline-config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { RawInlineOverride } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Extracts raw inline config overrides from a solc AST for a single source
|
|
4
|
-
* file.
|
|
5
|
-
*/
|
|
6
|
-
export declare function extractInlineConfigFromAst(ast: unknown, inputSourceName: string, contractNames: Set<string>): RawInlineOverride[];
|
|
7
|
-
/**
|
|
8
|
-
* Extracts the documentation text from a FunctionDefinition's documentation
|
|
9
|
-
* field, which can be a StructuredDocumentation node, a plain string, or null.
|
|
10
|
-
*/
|
|
11
|
-
export declare function extractDocText(doc: unknown): string | undefined;
|
|
12
|
-
/**
|
|
13
|
-
* Parses a single line from a NatSpec comment and returns a RawInlineOverride
|
|
14
|
-
* if the line contains a valid inline config directive. The line must start
|
|
15
|
-
* with either "hardhat-config:" or "forge-config:", followed by a key=value pair.
|
|
16
|
-
* Returns undefined if the line does not contain an inline config directive.
|
|
17
|
-
*/
|
|
18
|
-
export declare function parseInlineConfigLine(line: string, inputSourceName: string, contractName: string, functionName: string): RawInlineOverride | undefined;
|
|
19
|
-
//# sourceMappingURL=parsing.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parsing.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/builtin-plugins/solidity-test/inline-config/parsing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAgBpD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,OAAO,EACZ,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,iBAAiB,EAAE,CA6DrB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAY/D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,iBAAiB,GAAG,SAAS,CAsE/B"}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { HardhatError } from "@nomicfoundation/hardhat-errors";
|
|
2
|
-
import { isObject } from "@nomicfoundation/hardhat-utils/lang";
|
|
3
|
-
import { kebabToCamelCase, snakeToCamelCase, } from "@nomicfoundation/hardhat-utils/string";
|
|
4
|
-
import { HARDHAT_CONFIG_PREFIX, FORGE_CONFIG_PREFIX, TOP_LEVEL_KEYS, } from "./constants.js";
|
|
5
|
-
import { getFunctionFqn } from "./helpers.js";
|
|
6
|
-
/**
|
|
7
|
-
* Extracts raw inline config overrides from a solc AST for a single source
|
|
8
|
-
* file.
|
|
9
|
-
*/
|
|
10
|
-
export function extractInlineConfigFromAst(ast, inputSourceName, contractNames) {
|
|
11
|
-
if (!isObject(ast) || ast.nodeType !== "SourceUnit") {
|
|
12
|
-
return [];
|
|
13
|
-
}
|
|
14
|
-
const results = [];
|
|
15
|
-
const nodes = Array.isArray(ast.nodes) ? ast.nodes : [];
|
|
16
|
-
for (const node of nodes) {
|
|
17
|
-
if (!isObject(node) || node.nodeType !== "ContractDefinition") {
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
const contractName = node.name;
|
|
21
|
-
if (typeof contractName !== "string") {
|
|
22
|
-
continue;
|
|
23
|
-
}
|
|
24
|
-
if (!contractNames.has(contractName)) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
const members = Array.isArray(node.nodes) ? node.nodes : [];
|
|
28
|
-
for (const member of members) {
|
|
29
|
-
if (!isObject(member) || member.nodeType !== "FunctionDefinition") {
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
const fnName = member.name;
|
|
33
|
-
if (typeof fnName !== "string" ||
|
|
34
|
-
(!fnName.startsWith("test") && !fnName.startsWith("invariant"))) {
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
const fnSelector = typeof member.functionSelector === "string"
|
|
38
|
-
? member.functionSelector
|
|
39
|
-
: undefined;
|
|
40
|
-
const docText = extractDocText(member.documentation);
|
|
41
|
-
if (docText === undefined) {
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
for (const line of docText.split("\n")) {
|
|
45
|
-
const parsed = parseInlineConfigLine(line, inputSourceName, contractName, fnName);
|
|
46
|
-
if (parsed !== undefined) {
|
|
47
|
-
parsed.functionSelector = fnSelector;
|
|
48
|
-
results.push(parsed);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return results;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Extracts the documentation text from a FunctionDefinition's documentation
|
|
57
|
-
* field, which can be a StructuredDocumentation node, a plain string, or null.
|
|
58
|
-
*/
|
|
59
|
-
export function extractDocText(doc) {
|
|
60
|
-
if (isObject(doc) &&
|
|
61
|
-
doc.nodeType === "StructuredDocumentation" &&
|
|
62
|
-
typeof doc.text === "string") {
|
|
63
|
-
return doc.text;
|
|
64
|
-
}
|
|
65
|
-
else if (typeof doc === "string") {
|
|
66
|
-
return doc;
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
return undefined;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Parses a single line from a NatSpec comment and returns a RawInlineOverride
|
|
74
|
-
* if the line contains a valid inline config directive. The line must start
|
|
75
|
-
* with either "hardhat-config:" or "forge-config:", followed by a key=value pair.
|
|
76
|
-
* Returns undefined if the line does not contain an inline config directive.
|
|
77
|
-
*/
|
|
78
|
-
export function parseInlineConfigLine(line, inputSourceName, contractName, functionName) {
|
|
79
|
-
// Strip leading whitespace and optional leading '*' from NatSpec text.
|
|
80
|
-
// Solc's StructuredDocumentation.text has delimiters (///, /**, */) removed.
|
|
81
|
-
// For /// comments, text has leading whitespace; for /** */ blocks, interior
|
|
82
|
-
// lines may start with " * ". The regex handles both styles.
|
|
83
|
-
const trimmedLine = line.replace(/^\s*\*?\s*/, "");
|
|
84
|
-
const functionFqn = getFunctionFqn(inputSourceName, contractName, functionName);
|
|
85
|
-
let keyValueSegment;
|
|
86
|
-
if (trimmedLine.startsWith(HARDHAT_CONFIG_PREFIX)) {
|
|
87
|
-
keyValueSegment = trimmedLine.slice(HARDHAT_CONFIG_PREFIX.length).trim();
|
|
88
|
-
}
|
|
89
|
-
else if (trimmedLine.startsWith(FORGE_CONFIG_PREFIX)) {
|
|
90
|
-
keyValueSegment = trimmedLine.slice(FORGE_CONFIG_PREFIX.length).trim();
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
return undefined;
|
|
94
|
-
}
|
|
95
|
-
const eqIndex = keyValueSegment.indexOf("=");
|
|
96
|
-
if (eqIndex === -1) {
|
|
97
|
-
throw new HardhatError(HardhatError.ERRORS.CORE.SOLIDITY_TESTS.INLINE_CONFIG_INVALID_SYNTAX, {
|
|
98
|
-
line: trimmedLine,
|
|
99
|
-
functionFqn,
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
const rawKey = keyValueSegment.slice(0, eqIndex).trim();
|
|
103
|
-
let parsedKey = rawKey;
|
|
104
|
-
const rawValue = keyValueSegment.slice(eqIndex + 1).trim();
|
|
105
|
-
// Detect profile prefix: if the first dot-segment is NOT a known top-level
|
|
106
|
-
// category, treat it as a profile name.
|
|
107
|
-
const firstDot = rawKey.indexOf(".");
|
|
108
|
-
if (firstDot !== -1) {
|
|
109
|
-
const firstSegment = rawKey.slice(0, firstDot);
|
|
110
|
-
if (!TOP_LEVEL_KEYS.includes(firstSegment)) {
|
|
111
|
-
// It's a profile. Validate it.
|
|
112
|
-
const profile = firstSegment;
|
|
113
|
-
if (profile !== "default") {
|
|
114
|
-
throw new HardhatError(HardhatError.ERRORS.CORE.SOLIDITY_TESTS
|
|
115
|
-
.INLINE_CONFIG_UNSUPPORTED_PROFILE, {
|
|
116
|
-
profile,
|
|
117
|
-
functionFqn,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
// Strip the "default." prefix
|
|
121
|
-
parsedKey = rawKey.slice(firstDot + 1);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
parsedKey = snakeToCamelCase(kebabToCamelCase(parsedKey));
|
|
125
|
-
return {
|
|
126
|
-
inputSourceName,
|
|
127
|
-
contractName,
|
|
128
|
-
functionName,
|
|
129
|
-
key: parsedKey,
|
|
130
|
-
rawKey,
|
|
131
|
-
rawValue,
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
//# sourceMappingURL=parsing.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parsing.js","sourceRoot":"","sources":["../../../../../../src/internal/builtin-plugins/solidity-test/inline-config/parsing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/builtin-plugins/solidity-test/inline-config/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/internal/builtin-plugins/solidity-test/inline-config/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { RawInlineOverride } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Validates a list of raw inline overrides, checking for:
|
|
4
|
-
* - Valid keys
|
|
5
|
-
* - No duplicate keys for the same function
|
|
6
|
-
* - Values of the expected type (numbers must be non-negative integers,
|
|
7
|
-
* booleans must be "true" or "false", strings must be a non-empty
|
|
8
|
-
* double-quoted literal)
|
|
9
|
-
*
|
|
10
|
-
* Throws a HardhatError if any validation fails.
|
|
11
|
-
*/
|
|
12
|
-
export declare function validateInlineOverrides(overrides: RawInlineOverride[]): void;
|
|
13
|
-
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/builtin-plugins/solidity-test/inline-config/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAUpD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,IAAI,CA2H5E"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { HardhatError, assertHardhatInvariant, } from "@nomicfoundation/hardhat-errors";
|
|
2
|
-
import { KEY_TYPES } from "./constants.js";
|
|
3
|
-
import { getFunctionFqn } from "./helpers.js";
|
|
4
|
-
/**
|
|
5
|
-
* Validates a list of raw inline overrides, checking for:
|
|
6
|
-
* - Valid keys
|
|
7
|
-
* - No duplicate keys for the same function
|
|
8
|
-
* - Values of the expected type (numbers must be non-negative integers,
|
|
9
|
-
* booleans must be "true" or "false", strings must be a non-empty
|
|
10
|
-
* double-quoted literal)
|
|
11
|
-
*
|
|
12
|
-
* Throws a HardhatError if any validation fails.
|
|
13
|
-
*/
|
|
14
|
-
export function validateInlineOverrides(overrides) {
|
|
15
|
-
const seen = new Set();
|
|
16
|
-
for (const { inputSourceName, contractName, functionName, functionSelector, rawKey, rawValue, key, } of overrides) {
|
|
17
|
-
const functionFqn = getFunctionFqn(inputSourceName, contractName, functionName);
|
|
18
|
-
// Validate key
|
|
19
|
-
if (!Object.hasOwn(KEY_TYPES, key)) {
|
|
20
|
-
throw new HardhatError(HardhatError.ERRORS.CORE.SOLIDITY_TESTS.INLINE_CONFIG_INVALID_KEY, {
|
|
21
|
-
key: rawKey,
|
|
22
|
-
validKeys: Object.keys(KEY_TYPES).join(", "),
|
|
23
|
-
functionFqn,
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
// Validate key matches test type
|
|
27
|
-
const dotIndex = key.indexOf(".");
|
|
28
|
-
if (dotIndex !== -1) {
|
|
29
|
-
const keyCategory = key.slice(0, dotIndex);
|
|
30
|
-
const isFuzzTest = functionName.startsWith("test");
|
|
31
|
-
const isInvariantTest = functionName.startsWith("invariant");
|
|
32
|
-
if ((isFuzzTest && keyCategory === "invariant") ||
|
|
33
|
-
(isInvariantTest && keyCategory === "fuzz")) {
|
|
34
|
-
const testType = isFuzzTest ? "fuzz" : "invariant";
|
|
35
|
-
const validPrefix = isFuzzTest ? "fuzz." : "invariant.";
|
|
36
|
-
const validKeys = Object.keys(KEY_TYPES)
|
|
37
|
-
.filter((k) => k.startsWith(validPrefix) || !k.includes("."))
|
|
38
|
-
.join(", ");
|
|
39
|
-
throw new HardhatError(HardhatError.ERRORS.CORE.SOLIDITY_TESTS
|
|
40
|
-
.INLINE_CONFIG_INVALID_KEY_FOR_TEST_TYPE, {
|
|
41
|
-
key: rawKey,
|
|
42
|
-
functionFqn,
|
|
43
|
-
testType,
|
|
44
|
-
validKeys,
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
// Check for duplicates (include selector to allow same key on overloaded functions)
|
|
49
|
-
const functionId = functionSelector !== undefined
|
|
50
|
-
? `${functionFqn}#${functionSelector}`
|
|
51
|
-
: functionFqn;
|
|
52
|
-
const dedupeKey = `${functionId}-${key}`;
|
|
53
|
-
if (seen.has(dedupeKey)) {
|
|
54
|
-
throw new HardhatError(HardhatError.ERRORS.CORE.SOLIDITY_TESTS.INLINE_CONFIG_DUPLICATE_KEY, { key: rawKey, functionFqn });
|
|
55
|
-
}
|
|
56
|
-
seen.add(dedupeKey);
|
|
57
|
-
// Validate value type
|
|
58
|
-
const expectedType = KEY_TYPES[key];
|
|
59
|
-
if (expectedType === "number") {
|
|
60
|
-
if (!/^(0|[1-9]\d*)$/.test(rawValue) ||
|
|
61
|
-
!Number.isSafeInteger(Number(rawValue))) {
|
|
62
|
-
throw new HardhatError(HardhatError.ERRORS.CORE.SOLIDITY_TESTS.INLINE_CONFIG_INVALID_VALUE, {
|
|
63
|
-
value: rawValue,
|
|
64
|
-
key: rawKey,
|
|
65
|
-
expectedType: "non-negative integer",
|
|
66
|
-
functionFqn,
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
else if (expectedType === "boolean") {
|
|
71
|
-
const lowerValue = rawValue.toLowerCase();
|
|
72
|
-
if (lowerValue !== "true" && lowerValue !== "false") {
|
|
73
|
-
throw new HardhatError(HardhatError.ERRORS.CORE.SOLIDITY_TESTS.INLINE_CONFIG_INVALID_VALUE, {
|
|
74
|
-
value: rawValue,
|
|
75
|
-
key: rawKey,
|
|
76
|
-
expectedType: "boolean",
|
|
77
|
-
functionFqn,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
else if (expectedType === "string") {
|
|
82
|
-
if (!/^"[^"\n]+"$/.test(rawValue)) {
|
|
83
|
-
throw new HardhatError(HardhatError.ERRORS.CORE.SOLIDITY_TESTS.INLINE_CONFIG_INVALID_VALUE, {
|
|
84
|
-
value: rawValue,
|
|
85
|
-
key: rawKey,
|
|
86
|
-
expectedType: "non-empty double-quoted string",
|
|
87
|
-
functionFqn,
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
assertHardhatInvariant(false, `Unhandled inline config value type for key ${key}`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../../src/internal/builtin-plugins/solidity-test/inline-config/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export const HARDHAT_CONFIG_PREFIX = "hardhat-config:";
|
|
2
|
-
export const FORGE_CONFIG_PREFIX = "forge-config:";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* All supported inline config keys and their expected value types.
|
|
6
|
-
*/
|
|
7
|
-
export const KEY_TYPES: Record<string, "number" | "boolean" | "string"> = {
|
|
8
|
-
"fuzz.runs": "number",
|
|
9
|
-
"fuzz.maxTestRejects": "number",
|
|
10
|
-
"fuzz.showLogs": "boolean",
|
|
11
|
-
"fuzz.timeout": "number",
|
|
12
|
-
"invariant.runs": "number",
|
|
13
|
-
"invariant.depth": "number",
|
|
14
|
-
"invariant.failOnRevert": "boolean",
|
|
15
|
-
"invariant.callOverride": "boolean",
|
|
16
|
-
"invariant.timeout": "number",
|
|
17
|
-
allowInternalExpectRevert: "boolean",
|
|
18
|
-
isolate: "boolean",
|
|
19
|
-
evmVersion: "string",
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
/** Top-level key categories (e.g. "fuzz", "invariant", "allowInternalExpectRevert"). */
|
|
23
|
-
export const TOP_LEVEL_KEYS: string[] = [
|
|
24
|
-
...new Set(Object.keys(KEY_TYPES).map((k) => k.split(".")[0])),
|
|
25
|
-
];
|