OpenZeppelin Defender 与 Hardhat
Hardhat Upgrades 包可以使用 OpenZeppelin Defender 进行部署,而不是 ethers.js,这允许诸如 gas 价格估算、重新提交以及自动字节码和源代码验证等功能。
配置
在 OpenZeppelin Defender 上创建一个部署环境,并在 hardhat.config.js
或 hardhat.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.js
或 hardhat.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.js
或hardhat.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();