该软件包为您的Hardhat脚本添加了功能,以便您可以为您的合同部署和升级代理。取决于ethers.js。
该软件包为您的Hardhat脚本添加了功能,以便您可以为您的合同部署和升级代理。取决于ethers.js。
提示:查看分步教程,展示从创建、测试和部署,一直到使用 Gnosis Safe 进行升级。
$ npm install --save-dev @openzeppelin/hardhat-upgrades
$ npm install --save-dev @nomiclabs/hardhat-ethers ethers # peer dependencies
并在您的 hardhat.config.js 中注册插件:
require('@openzeppelin/hardhat-upgrades');
您可以在 Hardhat脚本中使用此插件,通过 deployProxy
函数部署其中一个合约的可升级实例:
// 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.deployed();
console.log("Box deployed to:", box.address);
}
main();
这将自动检查Box
合约是否升级安全,设置代理管理员(如果需要),为Box
合约部署一个实现合约(除非之前的部署已经有一个),创建一个代理并初始化它 通过调用initialize(42)
。
然后,在另一个脚本中,您可以使用 upgradeProxy
函数将部署的实例升级到新版本。新版本可以是不同的合约(比如BoxV2
),或者你可以修改现有的Box
合约并重新编译它—插件会注意到它发生了变化。
// scripts/upgrade-box.js
const { ethers, upgrades } = require("hardhat");
async function main() {
const BoxV2 = await ethers.getContractFactory("BoxV2");
const box = await upgrades.upgradeProxy(BOX_ADDRESS, BoxV2);
console.log("Box upgraded");
}
main();
注意:虽然此插件会跟踪您在每个网络上部署的所有实现合同,但为了重用它们并验证存储兼容性,它不会跟踪您已部署的代理。这意味着您需要手动跟踪每个部署地址,以便在需要时将这些地址提供给升级功能。
该插件将负责将BoxV2
与前一个进行比较,以确保它们与升级兼容,部署新的BoxV2
实现合约(除非先前部署中已经存在),并将现有代理升级到新实现。
您还可以使用Hardhat tests中的deployProxy
和upgradeProxy
函数,以防您想添加测试以升级您的合约(您应该这样做!)。API 与脚本中的相同。
const { expect } = require("chai");
describe("Box", function() {
it('works', async () => {
const Box = await ethers.getContractFactory("Box");
const BoxV2 = await ethers.getContractFactory("BoxV2");
const instance = await upgrades.deployProxy(Box, [42]);
const upgraded = await upgrades.upgradeProxy(instance.address, BoxV2);
const value = await upgraded.value();
expect(value.toString()).to.equal('42');
});
});
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!