@dedge_security/hardhat3-deployment-notifier
v0.2.0
Published
Hardhat 3 plugin to notify endpoints on contract deployment
Readme
@dedge_security/hardhat3-deployment-notifier
A Hardhat plugin that automatically sends deployment information to a configurable endpoint whenever a smart contract is deployed.
Requirements
- Node.js 22.10+
- Hardhat 3.x
Features
- Automatically captures deployment information
- Sends data to configurable HTTP endpoint
- Includes git commit ID, contract address, ABI, constructor arguments, file path, and contract name
- Configurable timeout and error handling
- Works with any EVM network supported by Hardhat
Install
npm install --save-dev @dedge_security/hardhat3-deployment-notifierConfig
import { defineConfig } from "hardhat/config";
import deploymentNotifierPlugin from "@dedge_security/hardhat3-deployment-notifier";
export default defineConfig({
plugins: [deploymentNotifierPlugin],
deploymentNotifier: {
endpoint: "http://localhost:3000/api/deployments", // Required: endpoint URL
timeout: 10000, // Optional: request timeout in ms (default: 10000)
failOnError: false, // Optional: throw error if notification fails (default: false)
},
// ... networks, solidity, etc.
});Usage
Deploy task (CLI)
npx hardhat deploy --contract SimpleStorage 42 "MyStorage" --network localhostIn scripts or tests (programmatic)
In Hardhat 3, get ethers from the network connection. Use the notifier’s async getters and notifyDeployment after deploying:
import hre from "hardhat";
async function main() {
const connection = await hre.network.connect();
const { ethers } = connection;
const contractName = "SimpleStorage";
const Contract = await ethers.getContractFactory(contractName);
const contract = await Contract.deploy(42, "MyStorage");
await contract.waitForDeployment();
const address = await contract.getAddress();
const filePath = await hre.deploymentNotifier.getContractFilePath(contractName);
const abi = await hre.deploymentNotifier.getContractABI(contractName);
const bytecode = await hre.deploymentNotifier.getContractBytecode(contractName);
await hre.deploymentNotifier.notifyDeployment({
address,
contractName,
constructorArgs: [42, "MyStorage"],
abi,
bytecode,
filePath,
transactionHash: hre.deploymentNotifier.getDeploymentTransactionHash(contract),
deployerAddress: hre.deploymentNotifier.getDeployerAddress(contract),
});
}Data Sent to Endpoint
The plugin sends a POST request with the following JSON payload:
{
"gitCommitId": "abc123...",
"gitRepositoryUrl": "https://github.com/org/repo.git",
"contractName": "MyContract",
"contractAddress": "0x...",
"filePath": "contracts/MyContract.sol",
"network": "localhost",
"chainId": "31337",
"timestamp": "2024-01-01T00:00:00.000Z",
"transactionHash": "0x...",
"deployerAddress": "0x...",
"constructorArguments": [...],
"abi": [...],
"bytecode": "0x6080604052..."
}API (all artifact getters are async):
getContractFilePath(contractName)→Promise<string | null>getContractABI(contractName)→Promise<object[] | null>getContractBytecode(contractName)→Promise<string | null>getDeploymentTransactionHash(contract)→string | null— from deployed contract instancegetDeployerAddress(contract)→string | null— from deployed contract instancenotifyDeployment(payload)→Promise<void>getGitCommitId()/getGitRepositoryUrl()→ sync, returnstring | null
Build and Test
npm run clean
npm run build
npm run testOutput: dist/index.js (ESM, minified).
License
MIT
