You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过单脚本实现Hardhat合约编译、部署、验证全流程自动化

Shell脚本确实能跑通这个流程,但不是最优解。最顺手的方案是直接把所有逻辑整合到Hardhat本身的部署流程里,不用跨进程解析命令行输出,坑少还跨平台。

方案1:Hardhat原生整合(推荐)

这个方案不需要额外维护独立的脚本文件,所有逻辑都跑在Hardhat运行时环境里,不会因为Hardhat版本迭代改了日志格式就出现解析错误,全平台通用不需要区分Bash/PowerShell环境。
核心逻辑:

  • Hardhat执行脚本时默认会自动触发增量编译,不需要手动执行compile命令,需要强制全量编译时再手动调用编译接口即可
  • 部署完成后直接拿到合约实例的地址,调用Hardhat验证插件的编程接口完成链上验证,不需要手动复制地址
  • 直接通过Node.js的文件能力读取Hardhat生成的合约产物,把ABI拷贝到目标目录,不需要自己找编译输出路径

可以直接替换你现有的scripts/deploy.js内容:

const hre = require("hardhat");
const fs = require("fs/promises");
const path = require("path");

async function main() {
  // 需要强制全量编译就放开下面这行注释
  // await hre.run("compile", { force: true });

  // 替换成你自己的合约名和构造函数参数
  const ContractFactory = await hre.ethers.getContractFactory("YourContractName");
  const contract = await ContractFactory.deploy();
  await contract.deployed();
  console.log(`合约部署成功,地址:${contract.address}`);

  // 等6个区块确认再验证,避免链上未同步导致验证失败
  console.log("等待区块确认...");
  await contract.deployTransaction.wait(6);

  // 自动执行合约验证
  await hre.run("verify:verify", {
    address: contract.address,
    constructorArguments: [], // 和部署时传入的构造函数参数保持一致
  });
  console.log("合约链上验证完成");

  // 自动拷贝ABI到目标目录,替换成你自己的目标路径
  const artifact = await hre.artifacts.readArtifact("YourContractName");
  const targetPath = path.resolve(__dirname, "../your-project/abis/YourContractName.json");
  await fs.writeFile(targetPath, JSON.stringify(artifact, null, 2));
  console.log(`ABI文件已拷贝至:${targetPath}`);
}

main().catch((err) => {
  console.error(err);
  process.exitCode = 1;
});

改完之后只需要执行npx hardhat run scripts/deploy.js --network 你的网络名这一条命令,就能自动走完编译、部署、验证、拷贝ABI的全流程。

方案2:Shell脚本实现(适合不想改动现有部署脚本的场景)

如果不想调整现有部署逻辑,用Shell/PowerShell写自动化脚本也完全可行,核心是通过正则从部署输出里匹配到合约地址,给个Bash版本的参考:

#!/bin/bash
set -e

# 编译合约
echo "开始编译合约..."
npx hardhat compile

# 部署合约并捕获输出
echo "开始部署合约..."
DEPLOY_LOG=$(npx hardhat run scripts/deploy.js --network 你的网络名)
# 正则匹配0x开头的42位标准EVM地址
CONTRACT_ADDR=$(echo "$DEPLOY_LOG" | grep -oE '0x[a-fA-F0-9]{40}' | head -n 1)
if [ -z "$CONTRACT_ADDR" ]; then
  echo "错误:未从部署日志中匹配到合约地址"
  exit 1
fi
echo "匹配到合约地址:$CONTRACT_ADDR"

# 等待区块同步,根据网络情况调整等待时长
sleep 30

# 验证合约
echo "开始验证合约..."
npx hardhat verify $CONTRACT_ADDR # 有构造函数参数追加在后面即可

# 拷贝ABI到目标目录,替换成你自己的路径
echo "开始拷贝ABI文件..."
cp artifacts/contracts/你的合约文件.sol/你的合约名.json 你的目标ABI目录/
echo "全流程执行完成"

PowerShell版本逻辑完全一致,只需要把正则匹配、文件拷贝的语法替换成PowerShell原生语法即可。
这个方案的缺点是需要保证部署脚本打印合约地址的格式固定,否则可能出现地址匹配错误的问题;另外硬编码等待时间不如链上等待区块确认可靠。

内容的提问来源于stack exchange,提问作者Maestros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:18:27