hardhat
Version:
Hardhat is an extensible developer tool that helps smart contract developers increase productivity by reliably bringing together the tools they want.
321 lines (282 loc) • 10.2 kB
text/typescript
import type { CompilationJob } from "./compilation-job.js";
import type { CompilerOutput, CompilerOutputError } from "./compiler-io.js";
import type { SolidityBuildInfo } from "./solidity-artifacts.js";
import type { Compiler } from "../../internal/builtin-plugins/solidity/build-system/compiler/compiler.js";
/**
* The options of the `build` method.
*/
export interface BuildOptions {
/**
* If `true`, it forces rebuilding every file, ignoring the compilation cache.
*/
force?: boolean;
/**
* The build profile to use.
*
* Default: "default".
*/
buildProfile?: string;
/**
* If `false`, this option allows the build process to merge compilation jobs
* if they have the same compiler version and settings.
*
* This is an useful optimization to be used when compiling a large number of
* files, but keep in mind that it can lead to unrelated files being compiled
* together, block explorer verification processes trickier and/or with
* unexpected results.
*/
isolated?: boolean;
/**
* The number of concurrent compilation jobs to run.
*
* Default: The number of CPU cores - 1.
*/
concurrency?: number;
/**
* If `true`, the build process doesn't print any output.
*/
quiet?: boolean;
/**
* Whether to compile contracts or tests. Defaults to contracts
*/
scope?: BuildScope;
}
/**
* The options of the `getCompilationJobs` method.
*
* Note that this option object includes a `quiet` property, as this process
* may require downloading compilers, and potentially printing some output.
*/
export type GetCompilationJobsOptions = Omit<
BuildOptions,
"removeUnusedArtifacts"
>;
/**
* The options of the `runCompilationJob` method.
*/
export type RunCompilationJobOptions = Pick<
BuildOptions,
"quiet" | "buildProfile"
>;
/**
* The options of the `compileBuildInfo` method.
*/
export interface CompileBuildInfoOptions {
/**
* If `true`, this option foces the build system to recompile the build info,
* even if its output is cached.
*/
force?: boolean;
/**
* If `true`, the compilation process doesn't print any output.
*/
quiet?: boolean;
}
export enum CompilationJobCreationErrorReason {
NO_COMPATIBLE_SOLC_VERSION_FOUND = "NO_COMPATIBLE_SOLC_VERSION_FOUND",
NO_COMPATIBLE_SOLC_VERSION_WITH_ROOT = "NO_COMPATIBLE_SOLC_VERSION_WITH_ROOT",
INCOMPATIBLE_OVERRIDDEN_SOLC_VERSION = "INCOMPATIBLE_OVERRIDDEN_SOLC_VERSION",
IMPORT_OF_INCOMPATIBLE_FILE = "IMPORT_OF_INCOMPATIBLE_FILE",
}
export interface BaseCompilationJobCreationError {
buildProfile: string;
rootFilePath: string;
formattedReason: string;
}
export interface CompilationJobCreationErrorNoCompatibleSolcVersionFound
extends BaseCompilationJobCreationError {
reason: CompilationJobCreationErrorReason.NO_COMPATIBLE_SOLC_VERSION_WITH_ROOT;
}
export interface CompilationJobCreationErrorIncompatibleOverriddenSolcVersion
extends BaseCompilationJobCreationError {
reason: CompilationJobCreationErrorReason.INCOMPATIBLE_OVERRIDDEN_SOLC_VERSION;
}
export interface CompilationJobCreationErrorIncompatibleOverriddenSolcVersion
extends BaseCompilationJobCreationError {
reason: CompilationJobCreationErrorReason.INCOMPATIBLE_OVERRIDDEN_SOLC_VERSION;
}
export interface CompilationJobCreationErrorIportOfIncompatibleFile
extends BaseCompilationJobCreationError {
reason: CompilationJobCreationErrorReason.IMPORT_OF_INCOMPATIBLE_FILE;
// The path of absolute files imported, starting from the root, that take you
// to the first file with an incompatible version pragma.
incompatibleImportPath: string[];
}
export interface NoCompatibleSolcVersionFound
extends BaseCompilationJobCreationError {
reason: CompilationJobCreationErrorReason.NO_COMPATIBLE_SOLC_VERSION_FOUND;
}
export type CompilationJobCreationError =
| CompilationJobCreationErrorNoCompatibleSolcVersionFound
| CompilationJobCreationErrorIportOfIncompatibleFile
| CompilationJobCreationErrorIncompatibleOverriddenSolcVersion
| NoCompatibleSolcVersionFound;
/**
* The restult of building a file.
*/
export enum FileBuildResultType {
CACHE_HIT = "CACHE_HIT",
BUILD_SUCCESS = "BUILD_SUCCESS",
BUILD_FAILURE = "BUILD_FAILURE",
}
export type FileBuildResult =
| CacheHitFileBuildResult
| SuccessfulFileBuildResult
| FailedFileBuildResult;
export interface CacheHitFileBuildResult {
type: FileBuildResultType.CACHE_HIT;
compilationJob: CompilationJob;
contractArtifactsGenerated: string[];
warnings: CompilerOutputError[];
}
export interface SuccessfulFileBuildResult {
type: FileBuildResultType.BUILD_SUCCESS;
compilationJob: CompilationJob;
contractArtifactsGenerated: string[];
warnings: CompilerOutputError[];
}
export interface FailedFileBuildResult {
type: FileBuildResultType.BUILD_FAILURE;
compilationJob: CompilationJob;
errors: CompilerOutputError[];
}
export interface GetCompilationJobsResult {
compilationJobsPerFile: Map<string, CompilationJob>;
indexedIndividualJobs: Map<string, CompilationJob>;
}
export interface EmitArtifactsResult {
artifactsPerFile: ReadonlyMap<string, string[]>;
buildInfoPath: string;
typeFilePaths: ReadonlyMap<string, string>;
buildInfoOutputPath: string;
}
/**
* Result object for the `runCompilationJob` method
*/
export interface RunCompilationJobResult {
output: CompilerOutput;
compiler: Compiler;
}
/**
* The Solidity build system.
*/
export interface SolidityBuildSystem {
/**
* Returns all the root files of the project.
*
* The root files are either absolute paths or
* `npm:<package-name>/<file-path>` URIs.
*
* @returns An array of root file paths.
*/
getRootFilePaths(options?: { scope?: BuildScope }): Promise<string[]>;
/**
* Given the filesystem path for a source file, returns the build scope
*/
getScope(fsPath: string): Promise<BuildScope>;
/**
* Builds the provided files, generating their compilation artifacts.
*
* @param rootFilePaths The files to build, which can be either absolute paths
* or `npm:<package-name>/<file-path>` URIs.
* @param options The options to use when building the files.
* @returns An `Map` of the files to their build results, or an error if
* there was a problem when trying to create the necessary compilation jobs.
*/
build(
rootFilePaths: string[],
options?: BuildOptions,
): Promise<CompilationJobCreationError | Map<string, FileBuildResult>>;
/**
* Returns the CompilationJobs that would be used to build the provided files.
*
* Note that if `options.mergeCompilationJobs` is true, the same instance of
* can be returned for multiple files, so you should deduplicate the results
* before using them.
*
* @param rootFilePaths The files to analyze, which can be either absolute
* paths or `npm:<package-name>/<file-path>` URIs.
* @param options The options to use when analyzing the files.
* @returns A `Map` of the files to their compilation jobs, or an error if
* there was a problem when trying to create them.
*/
getCompilationJobs(
rootFilePaths: string[],
options?: GetCompilationJobsOptions,
): Promise<CompilationJobCreationError | GetCompilationJobsResult>;
/**
* Returns the output of running the given compilation job.
*
* Note that this method returns the compiler output verbatim, as `solc`
* returns it. This means that any error message or location will use input
* source names, and not fs paths. To transform the paths to fs paths, use
* the `remapCompilerError` method.
*
* @param compilationJob The compilation job to run.
* @param options The options to use when running the compilation job.
* @returns The output of the compilation, as returned by `solc`.
*/
runCompilationJob(
compilationJob: CompilationJob,
options?: RunCompilationJobOptions,
): Promise<RunCompilationJobResult>;
/**
* Remaps the given compiler error paths from input source names to fs paths.
*
* @param compilationJob The compilation job where the error occurred.
* @param error The compiler error to remap.
* @param shouldShortenPaths If `true`, the paths will be shortened to their
* relative path from the CWD, if that results in a shorter path.
*/
remapCompilerError(
compilationJob: CompilationJob,
error: CompilerOutputError,
shouldShortenPaths?: boolean,
): Promise<CompilerOutputError>;
/**
* Emits the artifacts of the given compilation job.
*
* @param compilationJob The compilation job to emit the artifacts of.
* @param compilerOutput The result of running the compilation job.
* @returns A map from user source name to the absolute paths of the
* artifacts that were emitted for it.
*/
emitArtifacts(
compilationJob: CompilationJob,
compilerOutput: CompilerOutput,
options?: { scope?: BuildScope },
): Promise<EmitArtifactsResult>;
/**
* Analyzes the project and cleans up the artifacts by:
* - Removing any existing artifact of non-existent contracts.
* - Removing any unreachable build info and build info output files.
* - Overloading the `ArtifactMap` entries for repeated contract names so
* so that they map to `never`.
*
* This method should only be used after a complete build has succeeded, as
* it relies on the build system to have generated all the necessary artifact
* files.
* @param rootFilePaths All the root files of the project.
*/
cleanupArtifacts(
rootFilePaths: string[],
options?: { scope?: BuildScope },
): Promise<void>;
/**
* Compiles a build info, returning the output of the compilation, verbatim,
* as `solc` returns it.
*
* @param buildInfo The build info to compile.
* @param options The options to use when compiling the build info.
* @returns The output of the compilation.
*/
compileBuildInfo(
buildInfo: SolidityBuildInfo,
options?: CompileBuildInfoOptions,
): Promise<CompilerOutput>;
/**
* Gets the artifacts directory for a given target (contracts/tests)
*/
getArtifactsDirectory(scope: BuildScope): Promise<string>;
}
export type BuildScope = "contracts" | "tests";