From 889f03655a18111b451eb2c331271168a628ee3a Mon Sep 17 00:00:00 2001 From: Michael Heuer Date: Wed, 20 Sep 2023 12:06:13 +0200 Subject: [PATCH] test: update scripts rework --- .../deploy/update/to_v1.4.0/10_DAOFactory.ts | 68 ++++++++++++++++ .../to_v1.4.0/11_DAOFactory_conclude.ts | 22 ++++++ .../deploy/update/to_v1.4.0/90_ManagingDAO.ts | 40 ++++++++++ packages/contracts/hardhat.config.ts | 3 +- packages/contracts/networks.json | 17 ++-- packages/contracts/package.json | 3 +- .../contracts/test/deploy/updateTo1_3_0.ts | 78 ++++++++++++------- .../contracts/test/deploy/updateTo1_4_0.ts | 66 ++++++++++++++++ packages/contracts/test/test-utils/fixture.ts | 2 +- yarn.lock | 15 +++- 10 files changed, 266 insertions(+), 48 deletions(-) create mode 100644 packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts create mode 100644 packages/contracts/deploy/update/to_v1.4.0/11_DAOFactory_conclude.ts create mode 100644 packages/contracts/deploy/update/to_v1.4.0/90_ManagingDAO.ts create mode 100644 packages/contracts/test/deploy/updateTo1_4_0.ts diff --git a/packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts b/packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts new file mode 100644 index 000000000..9505beb60 --- /dev/null +++ b/packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts @@ -0,0 +1,68 @@ +import {DeployFunction} from 'hardhat-deploy/types'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; +import {Operation} from '../../../utils/types'; +import {getActiveContractAddress} from '../../helpers'; +import {DAO__factory} from '../../../typechain'; + +import daoFactoryArtifact from '../../../artifacts/src/framework/dao/DAOFactory.sol/DAOFactory.json'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + console.log('\nUpdating DAOFactory'); + const {deployments, ethers} = hre; + const {deploy} = deployments; + const [deployer] = await ethers.getSigners(); + + const managingDAOAddress = await getActiveContractAddress('managingDAO', hre); + const pluginSetupProcessorAddress = await getActiveContractAddress( + 'PluginSetupProcessor', + hre + ); + const daoRegistryAddress = await getActiveContractAddress('DAORegistry', hre); + const previousDAOFactoryAddress = await getActiveContractAddress( + 'DAOFactory', + hre + ); + console.log(`Using managingDAO ${managingDAOAddress}`); + console.log(`Using PluginSetupProcessor ${pluginSetupProcessorAddress}`); + console.log(`Using DAORegistry ${daoRegistryAddress}`); + console.log(`Using PreviousDAOFactory ${previousDAOFactoryAddress}`); + + const deployResult = await deploy('DAOFactory', { + contract: daoFactoryArtifact, + from: deployer.address, + args: [daoRegistryAddress, pluginSetupProcessorAddress], + log: true, + }); + + const daoInterface = DAO__factory.createInterface(); + const calldata = daoInterface.encodeFunctionData( + 'applyMultiTargetPermissions', + [ + [ + { + who: previousDAOFactoryAddress, + where: daoRegistryAddress, + operation: Operation.Revoke, + permissionId: ethers.utils.id('REGISTER_DAO_PERMISSION'), + condition: ethers.constants.AddressZero, + }, + { + who: deployResult.address, + where: daoRegistryAddress, + operation: Operation.Grant, + permissionId: ethers.utils.id('REGISTER_DAO_PERMISSION'), + condition: ethers.constants.AddressZero, + }, + ], + ] + ); + // update permissions actions + hre.managingDAOActions.push({ + to: managingDAOAddress, + value: 0, + data: calldata, + description: `Moves the REGISTER_DAO_PERMISSION_ID permission on the DAORegistry (${daoRegistryAddress}) from the old to the new DAOFactory (${previousDAOFactoryAddress} -> ${deployResult.address}).`, + }); +}; +export default func; +func.tags = ['DAOFactory', 'v1.4.0']; diff --git a/packages/contracts/deploy/update/to_v1.4.0/11_DAOFactory_conclude.ts b/packages/contracts/deploy/update/to_v1.4.0/11_DAOFactory_conclude.ts new file mode 100644 index 000000000..ee26e898a --- /dev/null +++ b/packages/contracts/deploy/update/to_v1.4.0/11_DAOFactory_conclude.ts @@ -0,0 +1,22 @@ +import {DeployFunction} from 'hardhat-deploy/types'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; +import {DAOFactory__factory} from '../../../typechain'; +import {getContractAddress} from '../../helpers'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + console.log('\nConcluding DAOFactory update'); + const {deployments, ethers} = hre; + const [deployer] = await ethers.getSigners(); + + const daoFactoryAddress = await getContractAddress('DAOFactory', hre); + const daoFactory = DAOFactory__factory.connect(daoFactoryAddress, deployer); + const daoBase = await daoFactory.callStatic.daoBase(); + + hre.aragonToVerifyContracts.push(await deployments.get('DAOFactory')); + hre.aragonToVerifyContracts.push({ + address: daoBase, + args: [], + }); +}; +export default func; +func.tags = ['DAOFactory', 'Verify', 'v1.4.0']; diff --git a/packages/contracts/deploy/update/to_v1.4.0/90_ManagingDAO.ts b/packages/contracts/deploy/update/to_v1.4.0/90_ManagingDAO.ts new file mode 100644 index 000000000..3813f8a3e --- /dev/null +++ b/packages/contracts/deploy/update/to_v1.4.0/90_ManagingDAO.ts @@ -0,0 +1,40 @@ +import {DeployFunction} from 'hardhat-deploy/types'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; +import {DAOFactory__factory, DAO__factory} from '../../../typechain'; +import {getContractAddress} from '../../helpers'; +import {IMPLICIT_INITIAL_PROTOCOL_VERSION} from '../../../test/test-utils/protocol-version'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + console.log('\nUpgrade the managing DAO to new implemenation'); + + const daoFactoryAddress = await getContractAddress('DAOFactory', hre); + const newDaoImplementation = await DAOFactory__factory.connect( + daoFactoryAddress, + hre.ethers.provider + ).daoBase(); + + const managingDAOAddress = await getContractAddress('managingDAO', hre); + const managingDAO = DAO__factory.connect( + managingDAOAddress, + hre.ethers.provider + ); + const upgradeTX = await managingDAO.populateTransaction.upgradeToAndCall( + newDaoImplementation, + managingDAO.interface.encodeFunctionData('initializeFrom', [ + IMPLICIT_INITIAL_PROTOCOL_VERSION, + [], + ]) + ); + + if (!upgradeTX.to || !upgradeTX.data) { + throw new Error(`Failed to populate upgradeToAndCall transaction`); + } + hre.managingDAOActions.push({ + to: upgradeTX.to, + data: upgradeTX.data, + value: 0, + description: `Upgrade the managing DAO to the new implementation (${newDaoImplementation})`, + }); +}; +export default func; +func.tags = ['ManagingDAO', 'v1.4.0']; diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index 650d6a6eb..1aa5bb82d 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -13,6 +13,7 @@ import 'solidity-coverage'; import 'solidity-docgen'; import {AragonPluginRepos, TestingFork} from './utils/types'; +import {parseUnits} from 'ethers/lib/utils'; dotenv.config(); @@ -75,7 +76,7 @@ const config: HardhatUserConfig = { throwOnTransactionFailures: true, throwOnCallFailures: true, blockGasLimit: 3000000000, // really high to test some things that are only possible with a higher block gas limit - gasPrice: 80000000000, + gasPrice: parseUnits('400.0', 'gwei').toNumber(), deploy: ENABLE_DEPLOY_TEST ? ['./deploy'] : ['./deploy/new', './deploy/verification'], diff --git a/packages/contracts/networks.json b/packages/contracts/networks.json index d60c1b2c9..96022042e 100644 --- a/packages/contracts/networks.json +++ b/packages/contracts/networks.json @@ -3,45 +3,40 @@ "url": "https://goerli.infura.io/v3/481a4cdc7c774286b8627f21c6827f48", "isTestnet": true, "chainId": 5, - "deploy": ["./deploy/update/to_v1.3.0", "./deploy/verification"] + "deploy": ["./deploy/update/to_v1.4.0", "./deploy/verification"] }, "mainnet": { "url": "https://mainnet.infura.io/v3/481a4cdc7c774286b8627f21c6827f48", "isTestnet": false, "chainId": 1, - "deploy": ["./deploy/update/to_v1.3.0", "./deploy/verification"] - }, - "arbitrum": { - "url": "https://arbitrum-mainnet.infura.io/v3/481a4cdc7c774286b8627f21c6827f48", - "isTestnet": false, - "chainId": 42161 + "deploy": ["./deploy/update/to_v1.4.0", "./deploy/verification"] }, "polygon": { "url": "https://polygon-mainnet.infura.io/v3/481a4cdc7c774286b8627f21c6827f48", "isTestnet": false, "chainId": 137, "feesUrl": "https://gasstation-mainnet.matic.network/v2", - "deploy": ["./deploy/update/to_v1.3.0", "./deploy/verification"] + "deploy": ["./deploy/update/to_v1.4.0", "./deploy/verification"] }, "mumbai": { "url": "https://polygon-mumbai.infura.io/v3/481a4cdc7c774286b8627f21c6827f48", "isTestnet": true, "chainId": 80001, "feesUrl": "https://gasstation-mumbai.matic.today/v2", - "deploy": ["./deploy/update/to_v1.3.0", "./deploy/verification"] + "deploy": ["./deploy/update/to_v1.4.0", "./deploy/verification"] }, "baseMainnet": { "url": "https://developer-access-mainnet.base.org", "isTestnet": false, "chainId": 8453, - "deploy": ["./deploy/new", "./deploy/verification"], + "deploy": ["./deploy/update/to_v1.4.0", "./deploy/verification"], "gasPrice": 1000 }, "baseGoerli": { "url": "https://goerli.base.org", "isTestnet": true, "chainId": 84531, - "deploy": ["./deploy/new", "./deploy/verification"], + "deploy": ["./deploy/update/to_v1.4.0", "./deploy/verification"], "gasPrice": 1000000 } } diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 0af486dba..6ccb159e5 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -40,7 +40,8 @@ }, "homepage": "https://github.com/aragon/osx#readme", "devDependencies": { - "@aragon/osx-ethers-v1.2.0": "npm:@aragon/osx-ethers@1.2.0", + "@aragon/osx-ethers-v1.2.1": "npm:@aragon/osx-ethers@1.2.1", + "@aragon/osx-ethers-v1.3.0-rc0.2": "npm:@aragon/osx-ethers@v1.3.0-rc0.2", "@aragon/osx-v1.0.1": "npm:@aragon/osx@1.0.1", "@aragon/osx-v1.3.0-rc0.2": "npm:@aragon/osx@1.3.0-rc0.2", "@defi-wonderland/smock": "^2.3.4", diff --git a/packages/contracts/test/deploy/updateTo1_3_0.ts b/packages/contracts/test/deploy/updateTo1_3_0.ts index a2ebadcf0..26859d317 100644 --- a/packages/contracts/test/deploy/updateTo1_3_0.ts +++ b/packages/contracts/test/deploy/updateTo1_3_0.ts @@ -6,44 +6,62 @@ import { initForkForOsxVersion, initializeDeploymentFixture, } from '../test-utils/fixture'; -import {activeContractsList as v1_2_0_activeContracts} from '@aragon/osx-ethers-v1.2.0'; +import {activeContractsList as v1_2_1_activeContracts} from '@aragon/osx-ethers-v1.2.1'; const enableTest = process.env.TEST_UPDATE_DEPLOY_SCRIPT !== undefined; -const network = 'mainnet'; + +export type NetworkForkData = { + networkName: string; + forkBlockNumber: number; +}; if (enableTest) { - describe('update/to_v1.3.0', function () { - before(async () => { - const previousOsxVersion: ForkOsxVersion = { - version: 'v1.0.1', - activeContracts: v1_2_0_activeContracts, - forkBlockNumber: 16722881, - }; - - await initForkForOsxVersion(network, previousOsxVersion); - - const updateDeployTags = ['v1.3.0']; - await initializeDeploymentFixture(updateDeployTags); - }); + [ + // TODO: check if those are correct forkBlockNumbers + {networkName: 'mainnet', forkBlockNumber: 16722881}, + {networkName: 'goerli', forkBlockNumber: 9225868}, + {networkName: 'polygon', forkBlockNumber: 42000000}, + {networkName: 'mumbai', forkBlockNumber: 33960187}, + ].forEach(function (networkData: NetworkForkData) { + describe(`${networkData.networkName} update/to_v1.3.0`, function () { + before(async () => { + const previousOsxVersion: ForkOsxVersion = { + version: 'v1.0.1', // TODO: Write explaining comment why v1.0.1 + activeContracts: v1_2_1_activeContracts, // TODO: Write explaining comment why v1.2.1 + forkBlockNumber: networkData.forkBlockNumber, + }; + + await initForkForOsxVersion( + networkData.networkName, + previousOsxVersion + ); + + const updateDeployTags = ['v1.3.0']; + await initializeDeploymentFixture(updateDeployTags); + }); - it('deploys new contracts with new addresses', async function () { - const changedContracts = [ - 'DAOFactory', - 'PluginRepoFactory', - 'MultisigSetup', - 'TokenVotingSetup', - 'AddresslistVotingSetup', - ]; + it('deploys new contracts with new addresses', async function () { + const changedContracts = [ + 'DAOFactory', + 'PluginRepoFactory', + 'MultisigSetup', + 'TokenVotingSetup', + 'AddresslistVotingSetup', + // TODO: what about `managingDAOImplemenation` (note the typo in "Implemenation" ) + ]; - const allDeployments = await deployments.all(); + const allDeployments = await deployments.all(); - changedContracts.forEach((contractName: string) => { - const previous = (v1_2_0_activeContracts as any)[network][contractName]; - const current = allDeployments[contractName].address; + changedContracts.forEach((contractName: string) => { + const previous = (v1_2_1_activeContracts as any)[ + networkData.networkName + ][contractName]; + const current = allDeployments[contractName].address; - expect(previous).to.not.be.empty; - expect(current).to.not.be.empty; - expect(current).to.not.eq(previous); + expect(previous).to.not.be.empty; + expect(current).to.not.be.empty; + expect(current).to.not.eq(previous); + }); }); }); }); diff --git a/packages/contracts/test/deploy/updateTo1_4_0.ts b/packages/contracts/test/deploy/updateTo1_4_0.ts new file mode 100644 index 000000000..e91b736a9 --- /dev/null +++ b/packages/contracts/test/deploy/updateTo1_4_0.ts @@ -0,0 +1,66 @@ +import {expect} from 'chai'; + +import {deployments} from 'hardhat'; +import { + ForkOsxVersion, + initForkForOsxVersion, + initializeDeploymentFixture, +} from '../test-utils/fixture'; +import {activeContractsList as v1_3_0_rc0_2_activeContracts} from '@aragon/osx-ethers-v1.3.0-rc0.2'; + +const enableTest = process.env.TEST_UPDATE_DEPLOY_SCRIPT !== undefined; + +export type NetworkForkData = { + networkName: string; + forkBlockNumber: number; +}; + +if (enableTest) { + [ + // TODO: check if those are correct forkBlockNumbers + {networkName: 'mainnet', forkBlockNumber: 16722881}, + {networkName: 'goerli', forkBlockNumber: 9225868}, + {networkName: 'polygon', forkBlockNumber: 42000000}, + {networkName: 'mumbai', forkBlockNumber: 33960187}, + {networkName: 'baseMainnet', forkBlockNumber: 2094661}, + {networkName: 'baseGoerli', forkBlockNumber: 7890908}, + ].forEach(function (networkData: NetworkForkData) { + describe(`${networkData.networkName} update/to_v1.4.0`, function () { + before(async () => { + const previousOsxVersion: ForkOsxVersion = { + version: 'v1.3.0', + activeContracts: v1_3_0_rc0_2_activeContracts, + forkBlockNumber: networkData.forkBlockNumber, + }; + + await initForkForOsxVersion( + networkData.networkName, + previousOsxVersion + ); + + const updateDeployTags = ['v1.4.0']; + await initializeDeploymentFixture(updateDeployTags); + }); + + it('deploys new contracts with new addresses', async function () { + const changedContracts = [ + 'DAOFactory', + // TODO: what about `managingDAOImplemenation` (note the typo in "Implemenation" ) + ]; + + const allDeployments = await deployments.all(); + + changedContracts.forEach((contractName: string) => { + const previous = (v1_3_0_rc0_2_activeContracts as any)[ + networkData.networkName + ][contractName]; + const current = allDeployments[contractName].address; + + expect(previous).to.not.be.empty; + expect(current).to.not.be.empty; + expect(current).to.not.eq(previous); + }); + }); + }); + }); +} diff --git a/packages/contracts/test/test-utils/fixture.ts b/packages/contracts/test/test-utils/fixture.ts index 153bf1442..ac6fecf15 100644 --- a/packages/contracts/test/test-utils/fixture.ts +++ b/packages/contracts/test/test-utils/fixture.ts @@ -44,7 +44,7 @@ export async function initForkForOsxVersion( // Aggregate necessary information to HardhatEnvironment. hre.testingFork = { network: forkNetwork, - osxVersion: osxVersion.version, + osxVersion: osxVersion.version, // TODO: What is the `osxVersion` used for? activeContracts: osxVersion.activeContracts, }; diff --git a/yarn.lock b/yarn.lock index 5250a5dde..9cb0d38ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,17 @@ # yarn lockfile v1 -"@aragon/osx-ethers-v1.2.0@npm:@aragon/osx-ethers@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@aragon/osx-ethers/-/osx-ethers-1.2.0.tgz#b7e58714394183372ddf25d97cfe326f18ce6f1d" - integrity sha512-XI/tJo5NSjOwtcRRXvlfDFRh6YTTSVLYwlbd+4QlBxbTB2WDwS/4lq7rFwnO1bPufCQ4pSqGsTXFR5pwDLS4Ig== +"@aragon/osx-ethers-v1.2.1@npm:@aragon/osx-ethers@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@aragon/osx-ethers/-/osx-ethers-1.2.1.tgz#a442048137153ed5a3ca4eff3f3927b45a5134b5" + integrity sha512-3Fscq8C9elIktiI6OT7fR5iaAvim+ghU6IUvZF3P/phvWm9roNp/GXAROhA/Vx41NQxeqmfXokgFo6KOWt4drA== + dependencies: + ethers "^5.6.2" + +"@aragon/osx-ethers-v1.3.0-rc0.2@npm:@aragon/osx-ethers@v1.3.0-rc0.2": + version "1.3.0-rc0.2" + resolved "https://registry.yarnpkg.com/@aragon/osx-ethers/-/osx-ethers-1.3.0-rc0.2.tgz#820f325ee8514bc6e598135bba2501f124d92d31" + integrity sha512-PpsmyZOBRQPElEsiLNkoGg/4j+oJn8SJC6S0oN837k5JofkleLbOdZgUmB0SHmL98hvcE157MoRZ4YM+IXbhhA== dependencies: ethers "^5.6.2"