hardhat
Version:
Hardhat is an extensible developer tool that helps smart contract developers increase productivity by reliably bringing together the tools they want.
230 lines (204 loc) • 6.85 kB
text/typescript
import {
ActionType,
ConfigExtender,
ConfigurableScopeDefinition,
ConfigurableTaskDefinition,
EnvironmentExtender,
ExperimentalHardhatNetworkMessageTraceHook,
ProviderExtender,
TaskArguments,
} from "../../../types";
import { HardhatContext } from "../../context";
import { HardhatError } from "../errors";
import { ERRORS } from "../errors-list";
import * as argumentTypes from "../params/argumentTypes";
/**
* Creates a task, overriding any previous task with the same name.
*
* @remarks The action must await every async call made within it.
*
* @param name The task's name.
* @param description The task's description.
* @param action The task's action.
* @returns A task definition.
*/
export function task<TaskArgumentsT extends TaskArguments>(
name: string,
description?: string,
action?: ActionType<TaskArgumentsT>
): ConfigurableTaskDefinition;
/**
* Creates a task without description, overriding any previous task
* with the same name.
*
* @remarks The action must await every async call made within it.
*
* @param name The task's name.
* @param action The task's action.
*
* @returns A task definition.
*/
export function task<TaskArgumentsT extends TaskArguments>(
name: string,
action: ActionType<TaskArgumentsT>
): ConfigurableTaskDefinition;
export function task<TaskArgumentsT extends TaskArguments>(
name: string,
descriptionOrAction?: string | ActionType<TaskArgumentsT>,
action?: ActionType<TaskArgumentsT>
): ConfigurableTaskDefinition {
const ctx = HardhatContext.getHardhatContext();
const dsl = ctx.tasksDSL;
if (descriptionOrAction === undefined) {
return dsl.task(name);
}
if (typeof descriptionOrAction !== "string") {
return dsl.task(name, descriptionOrAction);
}
return dsl.task(name, descriptionOrAction, action);
}
/**
* Creates a subtask, overriding any previous task with the same name.
*
* @remarks The subtasks won't be displayed in the CLI help messages.
* @remarks The action must await every async call made within it.
*
* @param name The task's name.
* @param description The task's description.
* @param action The task's action.
* @returns A task definition.
*/
export function subtask<TaskArgumentsT extends TaskArguments>(
name: string,
description?: string,
action?: ActionType<TaskArgumentsT>
): ConfigurableTaskDefinition;
/**
* Creates a subtask without description, overriding any previous
* task with the same name.
*
* @remarks The subtasks won't be displayed in the CLI help messages.
* @remarks The action must await every async call made within it.
*
* @param name The task's name.
* @param action The task's action.
* @returns A task definition.
*/
export function subtask<TaskArgumentsT extends TaskArguments>(
name: string,
action: ActionType<TaskArgumentsT>
): ConfigurableTaskDefinition;
export function subtask<TaskArgumentsT extends TaskArguments>(
name: string,
descriptionOrAction?: string | ActionType<TaskArgumentsT>,
action?: ActionType<TaskArgumentsT>
): ConfigurableTaskDefinition {
const ctx = HardhatContext.getHardhatContext();
const dsl = ctx.tasksDSL;
if (descriptionOrAction === undefined) {
return dsl.subtask(name);
}
if (typeof descriptionOrAction !== "string") {
return dsl.subtask(name, descriptionOrAction);
}
return dsl.subtask(name, descriptionOrAction, action);
}
// Backwards compatibility alias
export const internalTask = subtask;
export function scope(
name: string,
description?: string
): ConfigurableScopeDefinition {
const ctx = HardhatContext.getHardhatContext();
const dsl = ctx.tasksDSL;
return dsl.scope(name, description);
}
export const types = argumentTypes;
/**
* Register an environment extender what will be run after the
* Hardhat Runtime Environment is initialized.
*
* @param extender A function that receives the Hardhat Runtime
* Environment.
*/
export function extendEnvironment(extender: EnvironmentExtender) {
const ctx = HardhatContext.getHardhatContext();
ctx.environmentExtenders.push(extender);
}
/**
* Register a config extender what will be run after the
* Hardhat Runtime Environment is initialized.
*
* @param extender A function that receives the resolved config
* to be modified and the config provided by the user
*/
export function extendConfig(extender: ConfigExtender) {
const ctx = HardhatContext.getHardhatContext();
ctx.configExtenders.push(extender);
}
/**
* Register a provider extender what will be run after the
* Hardhat Runtime Environment is initialized.
*
* @param extender A function that receives the current provider
* and returns a new one.
*/
export function extendProvider(extender: ProviderExtender) {
const ctx = HardhatContext.getHardhatContext();
ctx.providerExtenders.push(extender);
}
// NOTE: This is experimental and will be removed. Please contact our team
// if you are planning to use it.
export function experimentalAddHardhatNetworkMessageTraceHook(
hook: ExperimentalHardhatNetworkMessageTraceHook
) {
const ctx = HardhatContext.getHardhatContext();
ctx.experimentalHardhatNetworkMessageTraceHooks.push(hook);
}
/**
* This object provides methods to interact with the configuration variables.
*/
export const vars = {
has: hasVar,
get: getVar,
};
/**
* Checks if a configuration variable exists.
*
* @remarks
* This method, when used during setup (via `npx hardhat vars setup`), will mark the variable as optional.
*
* @param varName - The name of the variable to check.
*
* @returns `true` if the variable exists, `false` otherwise.
*/
function hasVar(varName: string): boolean {
// varsManager will be an instance of VarsManager or VarsManagerSetup depending on the context (vars setup mode or not)
return HardhatContext.getHardhatContext().varsManager.has(varName, true);
}
/**
* Gets the value of the given configuration variable.
*
* @remarks
* This method, when used during setup (via `npx hardhat vars setup`), will mark the variable as required,
* unless a default value is provided.
*
* @param varName - The name of the variable to retrieve.
* @param [defaultValue] - An optional default value to return if the variable does not exist.
*
* @returns The value of the configuration variable if it exists, or the default value if provided.
*
* @throws HH1201 if the variable does not exist and no default value is set.
*/
function getVar(varName: string, defaultValue?: string): string {
// varsManager will be an instance of VarsManager or VarsManagerSetup depending on the context (vars setup mode or not)
const value = HardhatContext.getHardhatContext().varsManager.get(
varName,
defaultValue,
true
);
if (value !== undefined) return value;
throw new HardhatError(ERRORS.VARS.VALUE_NOT_FOUND_FOR_VAR, {
value: varName,
});
}