部署OpenZeppelin可升级合同的正确方法是什么?OpenZeppelin可升级合同具有默认的initialize()函数,由hardhat-upgrades插件自动调用。
没有来自hardhat-deploy的自动调用,只有升级后的方法,例如:
const deployResult = await deploy('ContractX', {
from: deployer,
proxyContract: 'OpenZeppelinTransparentProxy',
method: 'postUpgrade',
args: []
});我应该先通过deploy文件夹中的脚本部署契约,然后从deploy文件夹之外的某个脚本调用initialize()函数吗?或者是否有一种方法可以结合从部署文件夹本身调用initialize()函数?
发布于 2021-09-26 17:25:58
const deployResult = await deploy('ContractX', {
from: deployer,
proxy: {
proxyContract: 'OpenZeppelinTransparentProxy',
execute: {
methodName: "initialize",
args: []
}
}
});发布于 2023-01-20 09:33:09
一个更复杂的例子:
import { HardhatRuntimeEnvironment } from 'hardhat/types';
import { DeployFunction } from 'hardhat-deploy/types';
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const { deployments, getNamedAccounts } = hre;
const { deploy } = deployments;
const { deployer, proxyAdminOwner } = await getNamedAccounts();
const DataTypes = await deploy('DataTypes', {
from: deployer,
});
const Errors = await deploy('Errors', {
from: deployer,
});
const MintingLogic = await deploy('MintingLogic', {
from: deployer,
});
const ValidationLogic = await deploy('ValidationLogic', {
from: deployer,
});
await deploy('ContractName', {
from: deployer,
contract: 'ContractName',
log: true,
proxy: {
owner: proxyAdminOwner,
proxyContract: 'OptimizedTransparentProxy',
execute: {
init: {
methodName: 'initialize',
args: [],
},
onUpgrade: {
methodName: 'postUpgrade',
args: [],
},
},
},
libraries: {
Errors: Errors.address,
DataTypes: DataTypes.address,
ValidationLogic: ValidationLogic.address,
MintingLogic: MintingLogic.address,
},
});
};
export default func;
func.tags = ['ContractName'];如果你想要更多的信息,不要犹豫地问一些具体的问题。这里有太多的东西要打开来解释这一切。
https://ethereum.stackexchange.com/questions/101535
复制相似问题