如何通过单脚本实现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
相关产品推荐
相关产品推荐

