From 9f6543bd88d09a17ae7b893af62e4b3ee960432c Mon Sep 17 00:00:00 2001 From: wadealexc Date: Fri, 20 Sep 2024 15:25:05 +0000 Subject: [PATCH] wip --- script/README.md | 25 +++- script/Release.s.sol | 139 +++++++++++++--------- script/releases/v0.4.2-pepe/Script.s.sol | 24 ++++ script/releases/v0.4.2-pepe/manifest.json | 0 script/utils/Releasoor.s.sol | 3 - 5 files changed, 124 insertions(+), 67 deletions(-) create mode 100644 script/releases/v0.4.2-pepe/Script.s.sol create mode 100644 script/releases/v0.4.2-pepe/manifest.json diff --git a/script/README.md b/script/README.md index 16a792e7a..119dc2b1f 100644 --- a/script/README.md +++ b/script/README.md @@ -1,12 +1,27 @@ ## Release Scripting +Desired usecases: +* Creating a new release script from a template (e.g. `zeus new v0.4.2-pepe`) +* Being able to see whether a release script has been run for a given environment (`zeus status v0.4.2-pepe`) + * Since release scripts are split into 3 parts (`deploy`, `queue`, `execute`), being able to see + +`zeus run deploy pepe --sender "0x1234"` + +`zeus run deploy pepe --live --ledger` + +`zeus run queue pepe --live --ledger` +* https://docs.safe.global/sdk/api-kit +* For proposing txns to the Safe UI + +`zeus status pepe` + ### Creating a New Release Script ``` -make release $RELEASE_NAME +zeus new $VERSION $RELEASE_NAME ``` -This command will generate a new release script based on `Release_Template.s.sol`. The new script is placed in the `/releases` folder and named accordingly (e.g. `make release pepe` will create `releases/Release_pepe.s.sol`). +This command will generate a new release script based on `Release_Template.s.sol`. The new script is placed in the `/releases` folder and named accordingly (e.g. `zeus new v0.4.2-pepe` will create `releases/v0.4.2-pepe/script.s.sol`). Release scripts look like this: @@ -21,16 +36,16 @@ contract Release_TEMPLATE is Releasoor { using TxBuilder for *; using AddressUtils for *; - function deploy(Addresses memory addrs) public override { + function deploy(Addresses memory addrs) internal override { // If you're deploying contracts, do that here } - function queueUpgrade(Addresses memory addrs) public override { + function queueUpgrade(Addresses memory addrs) internal override { // If you're queueing an upgrade via the timelock, you can // define and encode those transactions here } - function executeUpgrade(Addresses memory addrs) public override { + function executeUpgrade(Addresses memory addrs) internal override { // Whether you are using the timelock or just making transactions // from the ops multisig, you can define/encode those transactions here } diff --git a/script/Release.s.sol b/script/Release.s.sol index d786118d3..ff9e8bd1b 100644 --- a/script/Release.s.sol +++ b/script/Release.s.sol @@ -9,6 +9,30 @@ contract Release is Releasoor { using TxBuilder for *; using AddressUtils for *; + struct ReleaseStep { + function () external step; + } + + // Public, standard release: + // - EOA deploy + // - queue/execute via ops multisig/timelock + function manifest() public returns (ReleaseStep[] memory steps) { + return _newRelease(ReleaseType.OPS_TIMELOCK) + .append(this.deploy) + .append(this.queueUpgrade) + .wait(10 days) + .append(this.executeUpgrade); + } + + // Private, emergency release: + // - EOA deploy + // - execute instantly via community msig + function manifest() public returns (ReleaseStep[] memory steps) { + return _newRelease(ReleaseType.COMMUNITY_MSIG) + .append(this.deploy) + .append(this.executeUpgrade); + } + function deploy(Addresses memory addrs) internal override { vm.startBroadcast(); @@ -30,9 +54,6 @@ contract Release is Releasoor { addrs.eigenPod.setPending(address(newEigenPodImpl)); addrs.eigenPodManager.setPending(address(newEPMImpl)); - - _log("pending pod", addrs.eigenPod.getPending()); - _log("pending podManager", addrs.eigenPodManager.getPending()); } function queueUpgrade(Addresses memory addrs) internal override { @@ -122,63 +143,63 @@ contract Release is Releasoor { addrs.eigenPodManager.updateFromPending(); } - // function queueUpgrade(Addresses memory addrs) internal override returns (Txns storage) { - // Txns storage txns = addrs.opsMultisig.queueTimelock({ - // timelock: addrs.timelock, - // eta: 0, - // _txns: addrs.executorMultisig - // .append({ - // to: addrs.strategyManager.proxy, - // data: EncStrategyManager.setStrategyWhitelister(addrs.opsMultisig) - // }) - // .append({ - // to: addrs.eigenPod.beacon, - // data: EncBeacon.upgradeTo(addrs.eigenPod.getPending()) - // }) - // .append({ - // to: addrs.proxyAdmin, - // data: EncProxyAdmin.upgrade(addrs.eigenPodManager.proxy, addrs.eigenPodManager.getPending()) - // }) - // .asSafeExecTxn(); - // }); - - // txns.printSummary(); - - // return txns; - // } + function queueUpgrade(Addresses memory addrs) internal override returns (Txns storage) { + Txns storage txns = addrs.opsMultisig.queueTimelock({ + timelock: addrs.timelock, + eta: 0, + _txns: addrs.executorMultisig + .append({ + to: addrs.strategyManager.proxy, + data: EncStrategyManager.setStrategyWhitelister(addrs.opsMultisig) + }) + .append({ + to: addrs.eigenPod.beacon, + data: EncBeacon.upgradeTo(addrs.eigenPod.getPending()) + }) + .append({ + to: addrs.proxyAdmin, + data: EncProxyAdmin.upgrade(addrs.eigenPodManager.proxy, addrs.eigenPodManager.getPending()) + }) + .asSafeExecTxn(); + }); - // function executeUpgrade(Addresses memory addrs) internal override returns (Txns storage) { - // Txns storage txns = addrs.opsMultisig.executeTimelock({ - // timelock: addrs.timelock, - // eta: 0, - // to: addrs.executorMultisig, - // data: addrs.executorMultisig - // .append({ - // to: addrs.strategyManager.proxy, - // data: EncStrategyManager.setStrategyWhitelister(addrs.opsMultisig) - // }) - // .append({ - // to: addrs.eigenPod.beacon, - // data: EncBeacon.upgradeTo(addrs.eigenPod.pendingImpl) - // }) - // .append({ - // to: addrs.proxyAdmin, - // data: EncProxyAdmin.upgrade(addrs.eigenPodManager.proxy, addrs.eigenPodManager.pendingImpl) - // }) - // }) - // .append({ - // to: addrs.strategyManager.proxy, - // data: EncStrategyManager.addStrategiesToDepositWhitelist(strats, bools) - // }); - - // txns.printSummary(); - - // // Update config - // addrs.eigenPod.updateFromPending(); - // addrs.eigenPodManager.updateFromPending(); - - // return txns; - // } + txns.printSummary(); + + return txns; + } + + function executeUpgrade(Addresses memory addrs) internal override returns (Txns storage) { + Txns storage txns = addrs.opsMultisig.executeTimelock({ + timelock: addrs.timelock, + eta: 0, + to: addrs.executorMultisig, + data: addrs.executorMultisig + .append({ + to: addrs.strategyManager.proxy, + data: EncStrategyManager.setStrategyWhitelister(addrs.opsMultisig) + }) + .append({ + to: addrs.eigenPod.beacon, + data: EncBeacon.upgradeTo(addrs.eigenPod.pendingImpl) + }) + .append({ + to: addrs.proxyAdmin, + data: EncProxyAdmin.upgrade(addrs.eigenPodManager.proxy, addrs.eigenPodManager.pendingImpl) + }) + }) + .append({ + to: addrs.strategyManager.proxy, + data: EncStrategyManager.addStrategiesToDepositWhitelist(strats, bools) + }); + + txns.printSummary(); + + // Update config + addrs.eigenPod.updateFromPending(); + addrs.eigenPodManager.updateFromPending(); + + return txns; + } // function _deployPEPE(Addresses memory addrs) internal returns (EigenPod, EigenPodManager) { // // Deploy EigenPod diff --git a/script/releases/v0.4.2-pepe/Script.s.sol b/script/releases/v0.4.2-pepe/Script.s.sol new file mode 100644 index 000000000..326c99a34 --- /dev/null +++ b/script/releases/v0.4.2-pepe/Script.s.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "./utils/Releasoor.s.sol"; + +contract v0_4_2_ is Releasoor { + + using TxBuilder for *; + using AddressUtils for *; + + function deploy(Addresses memory addrs) internal override { + // If you're deploying contracts, do that here + } + + function queueUpgrade(Addresses memory addrs) internal override returns (Tx[] memory executorTxns, uint eta) { + // If you're queueing an upgrade via the timelock, you can + // define and encode those transactions here + } + + function executeUpgrade(Addresses memory addrs) internal override { + // Whether you are using the timelock or just making transactions + // from the ops multisig, you can define/encode those transactions here + } +} \ No newline at end of file diff --git a/script/releases/v0.4.2-pepe/manifest.json b/script/releases/v0.4.2-pepe/manifest.json new file mode 100644 index 000000000..e69de29bb diff --git a/script/utils/Releasoor.s.sol b/script/utils/Releasoor.s.sol index af7af55af..bf5937a36 100644 --- a/script/utils/Releasoor.s.sol +++ b/script/utils/Releasoor.s.sol @@ -32,9 +32,6 @@ contract Releasoor is ConfigParser { string constant CONFIG_PREPROD = "script/configs/preprod.json"; string constant CONFIG_ZIPZOOP = "script/configs/zipzoop.json"; - - // https://docs.safe.global/sdk/api-kit - // For proposing txns to the Safe UI /// $ run execute mainnet /// -- requires that you have previously run deploy and queue