Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deployment script for WalletCoordinator upgrade #643

Merged
merged 1 commit into from
Jul 5, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions solidity/deploy/81_upgrade_wallet_coordinator_v2.ts
Original file line number Diff line number Diff line change
@@ -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}`
)
Comment on lines +34 to +63
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is nice to be able to double-check the data in the simulation but worth noting, this part is not strictly required.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Definitely, we will simulate with Tenderly first. But we need the new contract to be deployed for that.


// 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 <NETWORK>
func.skip = async () => true