<
<
<
Hardhat 3 is now production ready. Migrate now
>
>
>

#Hardhat plugin development

Welcome to the Hardhat plugin development documentation. In this section, you'll learn how to extend and customize Hardhat's behavior using plugins.

#What is a Hardhat plugin?

A Hardhat plugin is a reusable extension of the functionality of Hardhat and its plugins.

Plugins are defined as TypeScript objects with a HardhatPlugin type. Users add them to the plugins array in their hardhat.config.ts file.

Let's look at the structure of a basic plugin:

import type { HardhatPlugin } from "hardhat/types/plugins";

import "./type-extensions.js";

const plugin: HardhatPlugin = {
  id: "hardhat-my-plugin",
  hookHandlers: {
    // The hook handlers that this plugin defines
  },
  tasks: [
    // The tasks that this plugin defines
  ],
  globalOptions: [
    // The global options that this plugin defines
  ],
  dependencies: [
    // Other plugins that this plugin depends on
  ],
  conditionalDependencies: [
    // Plugins that are loaded only if the user is already using certain other plugins
  ],
};

export default plugin;

A plugin can define:

  • Type Extensions allow you to extend Hardhat's built-in types. For example, you can add custom fields to the HardhatUserConfig type. Read more about them here.

  • Hook Handlers are functions that customize different parts of Hardhat's behavior. Each extensibility point is called a Hook. Learn more about them here.

  • Hardhat Tasks are exposed in the CLI and can be run with npx hardhat <task>.

  • Global Options are exposed in the CLI and can be used with --<option>. When you define a Global Option, its value is available everywhere (Hook Handlers, Hardhat Tasks, tests, etc.).

  • Dependencies specify other plugins that this plugin depends on. Hardhat guarantees that dependencies are loaded before the plugin itself. Read this guide to learn how to use them.

  • Conditional Dependencies declare plugins that are loaded only if the user is already using certain other plugins, without forcing those to be loaded.

#Get started

Ready to build your first plugin? The tutorial walks you through creating a complete plugin from scratch, covering project setup, defining hooks, adding tasks, and testing your plugin.