如何使用hardhat-deploy部署多智能合约并将首个地址传入第二个构造函数
hardhat-deploy 依赖合约部署解决方案
核心原理
hardhat-deploy本身支持按顺序执行部署脚本,且可以读取已部署合约的地址信息,你可以选择单脚本内顺序部署或者多脚本依赖式部署两种方案,以下是可直接复用的实现:
方案1:单脚本内顺序部署(适合合约关联度高的场景)
在项目deploy目录下新建部署脚本,直接按顺序执行两个合约的部署逻辑:
// deploy/00_deploy_related_contracts.js module.exports = async ({ getNamedAccounts, deployments }) => { const { deploy } = deployments; const { deployer } = await getNamedAccounts(); // 部署第一个合约 const firstContract = await deploy("FirstContract", { from: deployer, args: [], // 填入第一个合约自身的构造函数参数,无参数则留空数组 log: true, }); console.log("FirstContract 已部署,地址:", firstContract.address); // 部署第二个合约,传入第一个合约的地址 const secondContract = await deploy("SecondContract", { from: deployer, args: [firstContract.address], // 按构造函数参数顺序填入,这里直接传入第一个合约的地址 log: true, }); console.log("SecondContract 已部署,地址:", secondContract.address); }; module.exports.tags = ["all", "relatedContracts"];
方案2:多脚本拆分部署(适合合约独立度高的场景)
拆分两个合约的部署脚本,通过dependencies字段声明依赖关系,确保执行顺序正确:
第一步:编写第一个合约的部署脚本
// deploy/01_deploy_first_contract.js module.exports = async ({ getNamedAccounts, deployments }) => { const { deploy } = deployments; const { deployer } = await getNamedAccounts(); await deploy("FirstContract", { from: deployer, args: [], log: true, }); }; module.exports.tags = ["FirstContract"];
第二步:编写第二个合约的部署脚本
// deploy/02_deploy_second_contract.js module.exports = async ({ getNamedAccounts, deployments }) => { const { deploy, get } = deployments; const { deployer } = await getNamedAccounts(); // 读取已部署的FirstContract信息 const firstContract = await get("FirstContract"); await deploy("SecondContract", { from: deployer, args: [firstContract.address], log: true, }); }; module.exports.tags = ["SecondContract"]; // 声明依赖,确保FirstContract部署完成后才会执行当前脚本 module.exports.dependencies = ["FirstContract"];
前置配置要求
需要先在hardhat.config.js中完成基础配置,示例如下:
require("@nomiclabs/hardhat-ethers"); require("hardhat-deploy"); module.exports = { solidity: "0.8.19", // 替换为你使用的solidity版本 namedAccounts: { deployer: { default: 0, // 默认使用钱包第一个地址作为部署账号 } }, networks: { // 你需要部署的网络配置,比如本地测试网、Goerli、主网等 } };
执行部署
运行以下命令即可自动完成整个部署流程:npx hardhat deploy --network 你要部署的网络名称
注意事项
- 若第二个合约还有其他构造函数参数,按顺序放在
args数组内即可 - 部署完成后可以在项目
deployments文件夹下对应网络的目录中,查看两个合约的地址、ABI等部署信息 - 部署过程中
log: true配置会自动打印部署进度和地址,不需要额外写console也能看到部署结果
内容的提问来源于stack exchange,提问作者jwarshack
相关产品推荐
相关产品推荐

