OpenZeppelin Defender 与 Hardhat

Hardhat Upgrades 包可以使用 OpenZeppelin Defender 进行部署,而不是 ethers.js,这允许诸如 gas 价格估算、重新提交以及自动字节码和源代码验证等功能。

配置

在 OpenZeppelin Defender 上创建一个部署环境,并在 hardhat.config.jshardhat.config.ts 文件的 defender 下提供团队 API 密钥和密钥:

module.exports = {
  defender: {
    apiKey: process.env.API_KEY,
    apiSecret: process.env.API_SECRET,
  }
}
上述 API 密钥必须至少具有管理部署的权限(可选地,需要管理 Relayers 才能使用 Relayer 创建审批流程)。您可以在 https://defender.openzeppelin.com/#/settings/api-keys 配置您的 API 密钥。

网络选择

与 OpenZeppelin Defender 一起使用的网络由 Hardhat 连接到的网络决定。 如果您想确保将特定网络与 Defender 一起使用,请在 hardhat.config.jshardhat.config.ts 文件的 defender 部分中设置 network 字段:

module.exports = {
  defender: {
    apiKey: process.env.API_KEY,
    apiSecret: process.env.API_SECRET,
    network: "my-mainnet-fork",
  }
}

如果设置了此项,则它必须是 Defender 中的公共、私有或 fork 网络的名称。如果 Hardhat 在设置此项时连接到其他网络,则不会发生部署,而是会抛出错误。

如果您在 Defender 中有多个具有相同 chainId 的 fork 网络,则需要这样做,在这种情况下,将使用名称与 network 字段匹配的网络。

用法

当使用 Hardhat Upgrades API 函数时,可以使用以下任何一种方式启用 OpenZeppelin Defender 部署。

只有在其 API 参考中具有 useDefenderDeploy 选项的函数才支持通过 OpenZeppelin Defender 进行部署。如果您启用以下内容但使用不支持 useDefenderDeploy 的函数,则以下第一种方式将导致这些函数使用 ethers.js 进行部署,而后两种方式将导致这些函数给出错误。
  • 推荐:在 hardhat.config.jshardhat.config.ts 中,在 defender 下设置 useDefenderDeploy: true。例如:

module.exports = {
  defender: {
    apiKey: process.env.API_KEY,
    apiSecret: process.env.API_SECRET,
    useDefenderDeploy: true,
  }
}
// scripts/create-box.js
const { ethers, upgrades } = require("hardhat");

async function main() {
  const Box = await ethers.getContractFactory("Box");
  const box = await upgrades.deployProxy(Box, [42]);
  await box.waitForDeployment();
  console.log("Box deployed to:", await box.getAddress());
}

main();
  • 使用 Hardhat 运行时环境中的 defender 模块而不是 upgrades。如果您想确保使用 Defender 并且希望在函数不支持 Defender 时看到错误,请使用此选项。例如:

// scripts/create-box.js
const { ethers, defender } = require("hardhat");

async function main() {
  const Box = await ethers.getContractFactory("Box");
  const box = await defender.deployProxy(Box, [42]);
  await box.waitForDeployment();
  console.log("Box deployed to:", await box.getAddress());
}

main();
  • 使用 useDefenderDeploy 通用选项。设置此选项将覆盖上述特定函数。例如:

// scripts/create-box.js
const { ethers, upgrades } = require("hardhat");

async function main() {
  const Box = await ethers.getContractFactory("Box");
  const box = await upgrades.deployProxy(Box, [42], { useDefenderDeploy: true });
  await box.waitForDeployment();
  console.log("Box deployed to:", await box.getAddress());
}

main();