Extensible Ethereum development framework with task runner, local network simulation, compilation tools, and plugin system.
npx @tessl/cli install tessl/npm-nomiclabs--buidler@1.1.0Buidler is an extensible Ethereum development framework that helps smart contract developers increase productivity by reliably bringing together the tools they want. It provides a task runner, local development network (BuidlerEVM), compilation tools, testing framework, and plugin system designed around task-based architecture.
npm install @nomiclabs/buidler// Main runtime environment (auto-loaded when using require/import in Node.js context)
const hre = require("@nomiclabs/buidler");
// The main export is the BuidlerRuntimeEnvironment instanceFor configuration files:
import { task, internalTask, extendEnvironment, extendConfig, usePlugin, types } from "@nomiclabs/buidler/config";For plugins:
import { BuidlerPluginError, saveArtifact, readArtifact, readArtifactSync, lazyObject, lazyFunction, ensurePluginLoadedWithUsePlugin, BUIDLEREVM_NETWORK_NAME } from "@nomiclabs/buidler/plugins";For plugin testing:
import { resetBuidlerContext, loadPluginFile } from "@nomiclabs/buidler/plugins-testing";Register environment globally:
import "@nomiclabs/buidler/register";// buidler.config.ts
import { BuidlerConfig, usePlugin } from "@nomiclabs/buidler/config";
usePlugin("@nomiclabs/buidler-ethers");
const config: BuidlerConfig = {
defaultNetwork: "buidlerevm",
solc: {
version: "0.5.15",
optimizer: {
enabled: true,
runs: 200
}
},
networks: {
localhost: {
url: "http://127.0.0.1:8545"
}
}
};
export default config;Buidler is built around several key architectural patterns:
Core task definition and execution system for organizing build workflows and development operations.
function task<ArgsT extends TaskArguments>(
name: string,
description?: string,
action?: ActionType<ArgsT>
): ConfigurableTaskDefinition;
function internalTask<ArgsT extends TaskArguments>(
name: string,
description?: string,
action?: ActionType<ArgsT>
): ConfigurableTaskDefinition;
interface BuidlerRuntimeEnvironment {
readonly config: ResolvedBuidlerConfig;
readonly buidlerArguments: BuidlerArguments;
readonly tasks: TasksMap;
readonly run: RunTaskFunction;
readonly network: Network;
/** @deprecated Use network.provider instead */
readonly ethereum: EthereumProvider;
}Flexible configuration system supporting network definitions, compilation settings, and plugin integration.
interface BuidlerConfig {
defaultNetwork?: string;
networks?: Networks;
paths?: Omit<Partial<ProjectPaths>, "configFile">;
solc?: DeepPartial<SolcConfig>;
mocha?: Mocha.MochaOptions;
analytics?: Partial<AnalyticsConfig>;
}
function extendConfig(extender: ConfigExtender): void;
function extendEnvironment(extender: EnvironmentExtender): void;Local Ethereum network simulation providing instant transactions, debugging features, and stack trace generation.
interface EthereumProvider extends EventEmitter {
send(method: string, params?: any[]): Promise<any>;
}
interface Network {
name: string;
config: NetworkConfig;
provider: EthereumProvider;
}Extensible plugin architecture for adding functionality and integrating with external tools.
function usePlugin(pluginName: string): void;
class BuidlerPluginError extends Error {
constructor(
pluginName: string,
message: string,
parent?: Error
);
}
function ensurePluginLoadedWithUsePlugin(): void;Core development tasks for compilation, testing, deployment, and project management.
// Core task names
const TASK_CLEAN = "clean";
const TASK_COMPILE = "compile";
const TASK_CONSOLE = "console";
const TASK_HELP = "help";
const TASK_RUN = "run";
const TASK_TEST = "test";
const TASK_FLATTEN = "flatten";Compilation artifact management for reading, writing, and processing contract compilation results.
interface Artifact {
contractName: string;
abi: any;
bytecode: string;
deployedBytecode: string;
linkReferences: LinkReferences;
deployedLinkReferences: LinkReferences;
}
function saveArtifact(artifactsPath: string, artifact: Artifact): Promise<void>;
function readArtifact(artifactsPath: string, contractName: string): Promise<Artifact>;
function readArtifactSync(artifactsPath: string, contractName: string): Artifact;type TaskArguments = any;
type ActionType<ArgsT extends TaskArguments> = (
taskArgs: ArgsT,
env: BuidlerRuntimeEnvironment,
runSuper: RunSuperFunction<ArgsT>
) => Promise<any>;
type RunTaskFunction = (
name: string,
taskArguments?: TaskArguments
) => Promise<any>;
interface RunSuperFunction<ArgT extends TaskArguments> {
(taskArguments?: ArgT): Promise<any>;
isDefined: boolean;
}
type EnvironmentExtender = (env: BuidlerRuntimeEnvironment) => void;
type ConfigExtender = (
config: ResolvedBuidlerConfig,
userConfig: DeepReadonly<BuidlerConfig>
) => void;
interface TasksMap {
[name: string]: TaskDefinition;
}
interface TaskDefinition extends ConfigurableTaskDefinition {
readonly name: string;
readonly description?: string;
readonly action: ActionType<TaskArguments>;
readonly isInternal: boolean;
readonly paramDefinitions: ParamDefinitionsMap;
readonly positionalParamDefinitions: Array<ParamDefinition<any>>;
}
interface ParamDefinitionsMap {
[paramName: string]: ParamDefinition<any>;
}
interface ParamDefinition<T> {
name: string;
defaultValue?: T;
type: ArgumentType<T>;
description?: string;
isOptional: boolean;
isFlag: boolean;
isVariadic: boolean;
}
interface ArgumentType<T> {
name: string;
parse(argName: string, strValue: string): T;
}
interface LinkReferences {
[libraryFileName: string]: {
[libraryName: string]: Array<{ length: number; start: number }>;
};
}
type NetworkConfig = BuidlerNetworkConfig | HttpNetworkConfig;
interface Networks {
[networkName: string]: NetworkConfig;
}
type NetworkConfigAccounts =
| "remote"
| string[]
| HDAccountsConfig
| OtherAccountsConfig;
interface ProjectPaths {
root: string;
configFile: string;
cache: string;
artifacts: string;
sources: string;
tests: string;
}
interface BuidlerNetworkAccount {
privateKey: string;
balance: string;
}
interface HDAccountsConfig {
mnemonic: string;
initialIndex?: number;
count?: number;
path?: string;
}
interface OtherAccountsConfig {
type: string;
}
interface SolcConfig {
version: string;
optimizer: SolcOptimizerConfig;
evmVersion?: string;
}
interface SolcOptimizerConfig {
enabled: boolean;
runs: number;
}
interface AnalyticsConfig {
enabled: boolean;
}
interface ResolvedBuidlerConfig extends BuidlerConfig {
defaultNetwork: string;
paths: ProjectPaths;
networks: Networks;
solc: SolcConfig;
analytics: AnalyticsConfig;
}
interface BuidlerArguments {
network?: string;
showStackTraces: boolean;
version: boolean;
help: boolean;
emoji: boolean;
config?: string;
verbose: boolean;
maxMemory?: number;
}