From 67641fbb8493a1b65f9f4278be615cdec7214e49 Mon Sep 17 00:00:00 2001 From: Jakub Nowakowski Date: Wed, 5 Jul 2023 12:34:05 +0200 Subject: [PATCH] Deployment script for WalletCoordinator upgrade We add a script for WalletCoordinator contract upgrade. The current WalletCoordinator contract deployed to mainnet is owned by Threshold Council, so it cannot be upgraded right away by the deployer. The deployer will deploy a fresh WalletCoordinator contract implementation, then Threshold Council need to execute transactions to upgrade the WalletCoordinator proxy to the new implementation and set the initial values for newely added parameters. --- .../81_upgrade_wallet_coordinator_v2.ts | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 solidity/deploy/81_upgrade_wallet_coordinator_v2.ts diff --git a/solidity/deploy/81_upgrade_wallet_coordinator_v2.ts b/solidity/deploy/81_upgrade_wallet_coordinator_v2.ts new file mode 100644 index 000000000..5428dbb5b --- /dev/null +++ b/solidity/deploy/81_upgrade_wallet_coordinator_v2.ts @@ -0,0 +1,98 @@ +import { Artifact, HardhatRuntimeEnvironment } from "hardhat/types" +import { DeployFunction, Deployment } from "hardhat-deploy/types" +import { ContractFactory } from "ethers" +import { ProxyAdmin, WalletCoordinator } from "../typechain" + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const { ethers, helpers, deployments } = hre + + const { deployer } = await helpers.signers.getNamedSigners() + + const proxyDeployment: Deployment = await deployments.get("WalletCoordinator") + const implementationContractFactory: ContractFactory = + await ethers.getContractFactory("WalletCoordinator", { + signer: deployer, + }) + + // Deploy new implementation contract + const newImplementationAddress: string = (await hre.upgrades.prepareUpgrade( + proxyDeployment, + implementationContractFactory, + { + kind: "transparent", + } + )) as string + + deployments.log( + `new implementation contract deployed at: ${newImplementationAddress}` + ) + + // Assemble proxy upgrade transaction. + const proxyAdmin: ProxyAdmin = await hre.upgrades.admin.getInstance() + const proxyAdminOwner = await proxyAdmin.owner() + + const upgradeTxData = await proxyAdmin.interface.encodeFunctionData( + "upgrade", + [proxyDeployment.address, newImplementationAddress] + ) + + deployments.log( + `proxy admin owner ${proxyAdminOwner} is required to upgrade proxy implementation with transaction:\n` + + `\t\tfrom: ${proxyAdminOwner}\n` + + `\t\tto: ${proxyAdmin.address}\n` + + `\t\tdata: ${upgradeTxData}` + ) + + // Assemble parameters upgrade transaction. + const walletCoordinator: WalletCoordinator = + await helpers.contracts.getContract("WalletCoordinator") + + const walletCoordinatorOwner = await walletCoordinator.owner() + + const updateRedemptionProposalParametersTxData = + walletCoordinator.interface.encodeFunctionData( + "updateRedemptionProposalParameters", + [7200, 600, 7200, 20, 20000] + ) + + deployments.log( + `WalletCoordinator owner ${walletCoordinatorOwner} is required to update redemption proposal parameters with transaction:\n` + + `\t\tfrom: ${walletCoordinatorOwner}\n` + + `\t\tto: ${walletCoordinator.address}\n` + + `\t\tdata: ${updateRedemptionProposalParametersTxData}` + ) + + // Update Deployment Artifact + const walletCoordinatorArtifact: Artifact = + hre.artifacts.readArtifactSync("WalletCoordinator") + + await deployments.save("WalletCoordinator", { + ...proxyDeployment, + abi: walletCoordinatorArtifact.abi, + implementation: newImplementationAddress, + }) + + if (hre.network.tags.etherscan) { + // We use `verify` instead of `verify:verify` as the `verify` task is defined + // in "@openzeppelin/hardhat-upgrades" to perform Etherscan verification + // of Proxy and Implementation contracts. + await hre.run("verify", { + address: proxyDeployment.address, + constructorArgsParams: proxyDeployment.args, + }) + } + + if (hre.network.tags.tenderly) { + await hre.tenderly.verify({ + name: "WalletCoordinator", + address: newImplementationAddress, + }) + } +} + +export default func + +func.tags = ["UpgradeWalletCoordinator"] +// When running an upgrade uncomment the skip below and run the command: +// yarn deploy --tags UpgradeWalletCoordinator --network +func.skip = async () => true