Socket
Socket
Sign inDemoInstall

@nomiclabs/hardhat-etherscan

Package Overview
Dependencies
Maintainers
3
Versions
34
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@nomiclabs/hardhat-etherscan

Hardhat plugin for verifying contracts on etherscan


Version published
Weekly downloads
56K
increased by1.83%
Maintainers
3
Weekly downloads
 
Created
Source

npm hardhat

hardhat-etherscan

Hardhat plugin for integration with Etherscan's contract verification service.

What

This plugin helps you verify the source code for your Solidity contracts on Etherscan.

It's smart and it tries to do as much as possible to facilitate the process:

  • Just provide the deployment address and constructor arguments, and the plugin will detect locally which contract to verify.
  • If your contract uses Solidity libraries, the plugin will detect them and deal with them automatically. You don't need to do anything about them.
  • A simulation of the verification process will run locally, allowing the plugin to detect and communicate any mistakes during the process.
  • Once the simulation is successful the contract will be verified using the Etherscan API.

Installation

npm install --save-dev @nomiclabs/hardhat-etherscan

And add the following statement to your hardhat.config.js:

require("@nomiclabs/hardhat-etherscan");

Or, if you are using TypeScript, add this to your hardhat.config.ts:

import "@nomiclabs/hardhat-etherscan";

Tasks

This plugin provides the verify task, which allows you to verify contracts through Etherscan's service.

Environment extensions

This plugin does not extend the environment.

Usage

You need to add the following Etherscan config to your hardhat.config.js file:

module.exports = {
  networks: {
    mainnet: { ... }
  },
  etherscan: {
    // Your API key for Etherscan
    // Obtain one at https://etherscan.io/
    apiKey: "YOUR_ETHERSCAN_API_KEY"
  }
};

Lastly, run the verify task, passing the address of the contract, the network where it's deployed, and the constructor arguments that were used to deploy it (if any):

npx hardhat verify --network mainnet DEPLOYED_CONTRACT_ADDRESS "Constructor argument 1"

Complex arguments

When the constructor has a complex argument list, you'll need to write a javascript module that exports the argument list. The expected format is the same as a constructor list for an ethers contract. For example, if you have a contract like this:

struct Point {
  uint x;
  uint y;
}

contract Foo {
  constructor (uint x, string s, Point memory point, bytes b) { ... }
}

then you can use an arguments.js file like this:

module.exports = [
  50,
  "a string argument",
  {
    x: 10,
    y: 5,
  },
  // bytes have to be 0x-prefixed
  "0xabcdef",
];

Where the third argument represents the value for the point parameter.

The module can then be loaded by the verify task when invoked like this:

npx hardhat verify --constructor-args arguments.js DEPLOYED_CONTRACT_ADDRESS

Libraries with undetectable addresses

Some library addresses are undetectable. If your contract uses a library only in the constructor, then its address cannot be found in the deployed bytecode.

To supply these missing addresses, you can create a javascript module that exports a library dictionary and pass it through the --libraries parameter:

hardhat verify --libraries libraries.js OTHER_ARGS

where libraries.js looks like this:

module.exports = {
  SomeLibrary: "0x...",
};

Using programmatically

To call the verification task from within a Hardhat task or script, use the "verify:verify" subtask. Assuming the same contract as above, you can run the subtask like this:

await hre.run("verify:verify", {
  address: contractAddress,
  constructorArguments: [
    50,
    "a string argument",
    {
      x: 10,
      y: 5,
    },
    "0xabcdef",
  ],
});

If the verification is not successful, an error will be thrown.

Providing libraries from a script or task

If your contract has libraries with undetectable addresses, you may pass the libraries parameter with a dictionary specifying them:

hre.run("verify:verify", {
  // other args
  libraries: {
    SomeLibrary: "0x...",
  }
}

How it works

The plugin works by fetching the bytecode in the given address and using it to check which contract in your project corresponds to it. Besides that, some sanity checks are performed locally to make sure that the verification won't fail.

Known limitations

  • Adding, removing, moving or renaming new contracts to the hardhat project or reorganizing the directory structure of contracts after deployment may alter the resulting bytecode in some solc versions. See this Solidity issue for further information.

Keywords

FAQs

Package last updated on 24 Nov 2021

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc