From ae29651c6152b960d498444516eec0b320be024f Mon Sep 17 00:00:00 2001 From: xavikh Date: Sat, 8 Feb 2025 19:11:08 +0100 Subject: [PATCH 01/15] Add build script --- .gitignore | 1 + foundry.toml | 5 +++++ package.json | 6 ++++++ script/build-reference-builds.sh | 15 +++++++++++++++ 4 files changed, 27 insertions(+) create mode 100644 script/build-reference-builds.sh diff --git a/.gitignore b/.gitignore index 09d3b94..2816bf1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ # Foundry cache/ out/ +ref_builds/ broadcast/ # JS diff --git a/foundry.toml b/foundry.toml index ee3e61a..3501401 100644 --- a/foundry.toml +++ b/foundry.toml @@ -18,6 +18,11 @@ test = "test" verbosity = 3 evm_version = "shanghai" +ffi = true +ast = true +build_info = true +extra_output = ["storageLayout"] + [profile.ci] fuzz = { runs = 10_000 } verbosity = 4 diff --git a/package.json b/package.json index 613f0ef..6bfb52c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,12 @@ { + "name": "ve-governance", + "version": "1.0.0", "devDependencies": { "prettier": "^3.3.3", "prettier-plugin-solidity": "^1.4.1" + }, + "scripts": { + "build": "forge build", + "build-refs": "bash script/build-reference-builds.sh" } } diff --git a/script/build-reference-builds.sh b/script/build-reference-builds.sh new file mode 100644 index 0000000..58beb2b --- /dev/null +++ b/script/build-reference-builds.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +set -euo pipefail + +rm -rf ref_builds +mkdir -p ref_builds/build-info-v1 + +for file in lib/ve-governance/*; +do + echo "Processing $file" + filename=$(echo $file | sed 's/\//-/g') + mkdir -p ref_builds/build-info-$filename + forge build --force --root=$file + mv $file/out/build-info/*.json ref_builds/build-info-$filename +done From f883436778d8168bada9a0094506c8811661d2a0 Mon Sep 17 00:00:00 2001 From: xavikh Date: Sat, 8 Feb 2025 19:11:26 +0100 Subject: [PATCH 02/15] forge install: openzeppelin-foundry-upgrades v0.4.0 --- .gitmodules | 3 +++ lib/openzeppelin-foundry-upgrades | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/openzeppelin-foundry-upgrades diff --git a/.gitmodules b/.gitmodules index 8b58daf..dca0244 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,3 +22,6 @@ branch = v4.9.2 [submodule "lib/ens-contracts"] path = lib/ens-contracts url = https://github.com/ensdomains/ens-contracts +[submodule "lib/openzeppelin-foundry-upgrades"] + path = lib/openzeppelin-foundry-upgrades + url = https://github.com/OpenZeppelin/openzeppelin-foundry-upgrades diff --git a/lib/openzeppelin-foundry-upgrades b/lib/openzeppelin-foundry-upgrades new file mode 160000 index 0000000..cbce1e0 --- /dev/null +++ b/lib/openzeppelin-foundry-upgrades @@ -0,0 +1 @@ +Subproject commit cbce1e00305e943aa1661d43f41e5ac72c662b07 From 6065ced97c711fc44af9587e5c636225967901a8 Mon Sep 17 00:00:00 2001 From: xavikh Date: Sat, 8 Feb 2025 19:14:22 +0100 Subject: [PATCH 03/15] Add remapping --- remappings.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/remappings.txt b/remappings.txt index 5c24c6f..b311ae6 100644 --- a/remappings.txt +++ b/remappings.txt @@ -25,5 +25,6 @@ ens-contracts/=lib/ens-contracts/contracts/ openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/ openzeppelin-contracts/=lib/openzeppelin-contracts/ erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/ +openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src @solmate/=lib/solmate/src/ \ No newline at end of file From 7d9e84df7e831d98c6e4c1b3e2e7093587368d95 Mon Sep 17 00:00:00 2001 From: xavikh Date: Sat, 8 Feb 2025 19:31:49 +0100 Subject: [PATCH 04/15] Upgrade forge-std --- lib/forge-std | 2 +- test/integration/GaugesDaoFactory.sol | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/forge-std b/lib/forge-std index 1714bee..3b20d60 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 1714bee72e286e73f76e320d110e0eaf5c4e649d +Subproject commit 3b20d60d14b343ee4f908cb8079495c07f5e8981 diff --git a/test/integration/GaugesDaoFactory.sol b/test/integration/GaugesDaoFactory.sol index 328ba72..8b5e958 100644 --- a/test/integration/GaugesDaoFactory.sol +++ b/test/integration/GaugesDaoFactory.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.17; import "forge-std/Test.sol"; +import {MockERC20} from "@solmate/test/utils/mocks/MockERC20.sol"; import {GaugesDaoFactory, Deployment, DeploymentParameters, TokenParameters} from "../../src/factory/GaugesDaoFactory.sol"; import {MockPluginSetupProcessor} from "@mocks/osx/MockPSP.sol"; import {MockPluginSetupProcessorMulti} from "@mocks/osx/MockPSPMulti.sol"; @@ -382,12 +383,12 @@ contract GaugesDaoFactoryTest is Test { TokenParameters[] memory tokenParameters = new TokenParameters[](2); tokenParameters[0] = TokenParameters({ - token: address(deployMockERC20("T1", "T1", 18)), + token: address(new MockERC20("T1", "T1", 18)), veTokenName: "Name 1", veTokenSymbol: "TK1" }); tokenParameters[1] = TokenParameters({ - token: address(deployMockERC20("T2", "T2", 18)), + token: address(new MockERC20("T2", "T2", 18)), veTokenName: "Name 2", veTokenSymbol: "TK2" }); @@ -767,17 +768,17 @@ contract GaugesDaoFactoryTest is Test { TokenParameters[] memory tokenParameters = new TokenParameters[](3); tokenParameters[0] = TokenParameters({ - token: address(deployMockERC20("T3", "T3", 18)), + token: address(new MockERC20("T3", "T3", 18)), veTokenName: "Name 3", veTokenSymbol: "TK3" }); tokenParameters[1] = TokenParameters({ - token: address(deployMockERC20("T4", "T4", 18)), + token: address(new MockERC20("T4", "T4", 18)), veTokenName: "Name 4", veTokenSymbol: "TK4" }); tokenParameters[2] = TokenParameters({ - token: address(deployMockERC20("T5", "T5", 18)), + token: address(new MockERC20("T5", "T5", 18)), veTokenName: "Name 5", veTokenSymbol: "TK5" }); @@ -1261,17 +1262,17 @@ contract GaugesDaoFactoryTest is Test { TokenParameters[] memory tokenParameters = new TokenParameters[](3); tokenParameters[0] = TokenParameters({ - token: address(deployMockERC20("T3", "T3", 18)), + token: address(new MockERC20("T3", "T3", 18)), veTokenName: "Name 3", veTokenSymbol: "TK3" }); tokenParameters[1] = TokenParameters({ - token: address(deployMockERC20("T4", "T4", 18)), + token: address(new MockERC20("T4", "T4", 18)), veTokenName: "Name 4", veTokenSymbol: "TK4" }); tokenParameters[2] = TokenParameters({ - token: address(deployMockERC20("T5", "T5", 18)), + token: address(new MockERC20("T5", "T5", 18)), veTokenName: "Name 5", veTokenSymbol: "TK5" }); From f4e49ea49c95476529339d21c99cce22d7f0de23 Mon Sep 17 00:00:00 2001 From: xavikh Date: Sat, 8 Feb 2025 20:27:04 +0100 Subject: [PATCH 05/15] forge install: ve-governance/v100 v100 --- .gitmodules | 3 +++ lib/ve-governance/v100 | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/ve-governance/v100 diff --git a/.gitmodules b/.gitmodules index dca0244..6a96aff 100644 --- a/.gitmodules +++ b/.gitmodules @@ -25,3 +25,6 @@ branch = v4.9.2 [submodule "lib/openzeppelin-foundry-upgrades"] path = lib/openzeppelin-foundry-upgrades url = https://github.com/OpenZeppelin/openzeppelin-foundry-upgrades +[submodule "lib/ve-governance/v100"] + path = lib/ve-governance/v100 + url = https://github.com/aragon/ve-governance diff --git a/lib/ve-governance/v100 b/lib/ve-governance/v100 new file mode 160000 index 0000000..b13fff5 --- /dev/null +++ b/lib/ve-governance/v100 @@ -0,0 +1 @@ +Subproject commit b13fff5d207bfd57019ba028ad2e536b8c0edef7 From c7b85baba8f8e50cce0e8af44abf38a1f164522c Mon Sep 17 00:00:00 2001 From: xavikh Date: Sat, 8 Feb 2025 20:57:19 +0100 Subject: [PATCH 06/15] Add Upgrade test --- package.json | 4 +++- remappings.txt | 1 + script/build-reference-builds.sh | 3 ++- src/clock/Clock.sol | 1 + test/upgrades/TestUpgrades.t.sol | 21 +++++++++++++++++++++ 5 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 test/upgrades/TestUpgrades.t.sol diff --git a/package.json b/package.json index 6bfb52c..4f1cb40 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,8 @@ }, "scripts": { "build": "forge build", - "build-refs": "bash script/build-reference-builds.sh" + "build-clean": "forge build --force", + "build-refs": "bash script/build-reference-builds.sh", + "build-all": "bun run build-refs && bun run build-clean" } } diff --git a/remappings.txt b/remappings.txt index b311ae6..7eac302 100644 --- a/remappings.txt +++ b/remappings.txt @@ -5,6 +5,7 @@ utils/=test/utils/ @aragon/osx/=lib/osx/packages/contracts/src/ @aragon/admin/=lib/osx/packages/contracts/src/plugins/governance/admin/ @aragon/multisig/=lib/osx/packages/contracts/src/plugins/governance/multisig/ +@aragon/ve-governance-v100=lib/ve-governance/v100/src/ @interfaces/=src/interfaces/ @mocks/=test/mocks/ diff --git a/script/build-reference-builds.sh b/script/build-reference-builds.sh index 58beb2b..98f6806 100644 --- a/script/build-reference-builds.sh +++ b/script/build-reference-builds.sh @@ -3,12 +3,13 @@ set -euo pipefail rm -rf ref_builds -mkdir -p ref_builds/build-info-v1 +mkdir -p ref_builds for file in lib/ve-governance/*; do echo "Processing $file" filename=$(echo $file | sed 's/\//-/g') + filename=$(echo $filename | sed 's/lib-ve-governance-//g') mkdir -p ref_builds/build-info-$filename forge build --force --root=$file mv $file/out/build-info/*.json ref_builds/build-info-$filename diff --git a/src/clock/Clock.sol b/src/clock/Clock.sol index 100bef2..5c793f1 100644 --- a/src/clock/Clock.sol +++ b/src/clock/Clock.sol @@ -29,6 +29,7 @@ contract Clock is IClock, DaoAuthorizable, UUPSUpgradeable { Initialization //////////////////////////////////////////////////////////////*/ + /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } diff --git a/test/upgrades/TestUpgrades.t.sol b/test/upgrades/TestUpgrades.t.sol new file mode 100644 index 0000000..3763889 --- /dev/null +++ b/test/upgrades/TestUpgrades.t.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity ^0.8.17; + +import {Upgrades} from "openzeppelin-foundry-upgrades/LegacyUpgrades.sol"; +import {Test} from "forge-std/Test.sol"; +//import {Clock} from '@aragon/ve-governance-v100/clock/Clock.sol'; +//import {Clock as ClockV2} from '@clock/Clock.sol'; + +import { Options } from "openzeppelin-foundry-upgrades/Options.sol"; + +contract AragonTest is Test { + function testUpgrades() public { + //Clock clock = new Clock(); + + Options memory options; + options.referenceBuildInfoDir = "ref_builds/build-info-v100"; + options.referenceContract = "build-info-v100:Clock"; + + Upgrades.validateUpgrade("Clock.sol", options); + } +} From e5e832c27ab63a56ab416a71ba402123658f7eff Mon Sep 17 00:00:00 2001 From: xavikh Date: Mon, 10 Feb 2025 10:56:08 +0100 Subject: [PATCH 07/15] forge install: ve-governance/v101 v101 --- .gitmodules | 3 +++ lib/ve-governance/v101 | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/ve-governance/v101 diff --git a/.gitmodules b/.gitmodules index 6a96aff..82236db 100644 --- a/.gitmodules +++ b/.gitmodules @@ -28,3 +28,6 @@ branch = v4.9.2 [submodule "lib/ve-governance/v100"] path = lib/ve-governance/v100 url = https://github.com/aragon/ve-governance +[submodule "lib/ve-governance/v101"] + path = lib/ve-governance/v101 + url = https://github.com/aragon/ve-governance diff --git a/lib/ve-governance/v101 b/lib/ve-governance/v101 new file mode 160000 index 0000000..3aecc25 --- /dev/null +++ b/lib/ve-governance/v101 @@ -0,0 +1 @@ +Subproject commit 3aecc25a1619fd928ec62d04764f2304b8611316 From 098848840caa7b33e87438b0959e79550460cf17 Mon Sep 17 00:00:00 2001 From: xavikh Date: Mon, 10 Feb 2025 10:59:35 +0100 Subject: [PATCH 08/15] Update ve-gov libs to v101 --- .gitmodules | 3 --- lib/ve-governance/v100 | 1 - 2 files changed, 4 deletions(-) delete mode 160000 lib/ve-governance/v100 diff --git a/.gitmodules b/.gitmodules index 82236db..93307e0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -25,9 +25,6 @@ branch = v4.9.2 [submodule "lib/openzeppelin-foundry-upgrades"] path = lib/openzeppelin-foundry-upgrades url = https://github.com/OpenZeppelin/openzeppelin-foundry-upgrades -[submodule "lib/ve-governance/v100"] - path = lib/ve-governance/v100 - url = https://github.com/aragon/ve-governance [submodule "lib/ve-governance/v101"] path = lib/ve-governance/v101 url = https://github.com/aragon/ve-governance diff --git a/lib/ve-governance/v100 b/lib/ve-governance/v100 deleted file mode 160000 index b13fff5..0000000 --- a/lib/ve-governance/v100 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b13fff5d207bfd57019ba028ad2e536b8c0edef7 From ec18adae55d996d2891c4db42111e0e2fb887ce3 Mon Sep 17 00:00:00 2001 From: xavikh Date: Mon, 10 Feb 2025 13:09:31 +0100 Subject: [PATCH 09/15] Fix testUpgrades base version --- test/upgrades/TestUpgrades.t.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/upgrades/TestUpgrades.t.sol b/test/upgrades/TestUpgrades.t.sol index 3763889..0168b55 100644 --- a/test/upgrades/TestUpgrades.t.sol +++ b/test/upgrades/TestUpgrades.t.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.17; import {Upgrades} from "openzeppelin-foundry-upgrades/LegacyUpgrades.sol"; import {Test} from "forge-std/Test.sol"; -//import {Clock} from '@aragon/ve-governance-v100/clock/Clock.sol'; +//import {Clock} from '@aragon/ve-governance-v101/clock/Clock.sol'; //import {Clock as ClockV2} from '@clock/Clock.sol'; import { Options } from "openzeppelin-foundry-upgrades/Options.sol"; @@ -13,8 +13,8 @@ contract AragonTest is Test { //Clock clock = new Clock(); Options memory options; - options.referenceBuildInfoDir = "ref_builds/build-info-v100"; - options.referenceContract = "build-info-v100:Clock"; + options.referenceBuildInfoDir = "ref_builds/build-info-v101"; + options.referenceContract = "build-info-v101:Clock"; Upgrades.validateUpgrade("Clock.sol", options); } From de71bbc410f6b98690f4abfa8962b9b602cdf993 Mon Sep 17 00:00:00 2001 From: xavikh Date: Mon, 10 Feb 2025 20:18:12 +0100 Subject: [PATCH 10/15] Update actions --- .github/workflows/test.yml | 78 +++++++++++++++++++++++++++++--------- package.json | 6 ++- 2 files changed, 65 insertions(+), 19 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9a6b3c7..d0ee59d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,7 +1,11 @@ -name: CI +name: Tests on: push: + branches: + - 'main' + - 'develop' + - 'deploy/**' pull_request: workflow_dispatch: @@ -9,32 +13,70 @@ env: FOUNDRY_PROFILE: ci jobs: - check: + test-upgrades: strategy: fail-fast: true + name: Test upgrades + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: oven-sh/setup-bun@v2 + + - name: foundry-toolchain + uses: foundry-rs/foundry-toolchain@v1.3.1 - name: Foundry project + - name: Show Forge version + run: forge --version + + - name: Build + run: bun run build-all + + - name: Run tests + run: bun run test-upgrades + test-fork: + strategy: + fail-fast: true + name: Test fork runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: submodules: recursive + - uses: oven-sh/setup-bun@v2 + + - name: foundry-toolchain + uses: foundry-rs/foundry-toolchain@v1.3.1 - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 + - name: Show Forge version + run: forge --version + + - name: Build + run: bun run build + + - name: Run tests + run: bun run test-fork + test-unit: + strategy: + fail-fast: true + name: Test unit + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 with: - version: nightly + submodules: recursive + - uses: oven-sh/setup-bun@v2 + + - name: foundry-toolchain + uses: foundry-rs/foundry-toolchain@v1.3.1 - name: Show Forge version - run: | - forge --version - - - name: Run Forge build - run: | - forge build --sizes - id: build - - - name: Run Forge tests - run: | - forge test --no-match-path "test/fork/**/*.sol" -vvv - id: test + run: forge --version + + - name: Build + run: bun run build + + - name: Run tests + run: bun run test-unit + \ No newline at end of file diff --git a/package.json b/package.json index 4f1cb40..2fff3cd 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,10 @@ "build": "forge build", "build-clean": "forge build --force", "build-refs": "bash script/build-reference-builds.sh", - "build-all": "bun run build-refs && bun run build-clean" + "build-all": "bun run build-refs && bun run build-clean", + "test-unit": "forge test --no-match-path \"{test/fork/*.sol,test/upgrades/*.sol}\" -vvv", + "test-fork": "forge test --match-path \"test/fork/**/*.sol\" -vvv", + "test-upgrades": "forge test --match-path \"test/upgrades/**/*.sol\" -vvv", + "test": "forge test -vvv" } } From 836dc7862261b3df29ae48cc4f1483beddb9c413 Mon Sep 17 00:00:00 2001 From: xavikh Date: Mon, 10 Feb 2025 20:30:25 +0100 Subject: [PATCH 11/15] Fix e2e test --- package.json | 2 +- test/fork/e2eV2.t.sol | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/package.json b/package.json index 2fff3cd..a182bb9 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "build-refs": "bash script/build-reference-builds.sh", "build-all": "bun run build-refs && bun run build-clean", "test-unit": "forge test --no-match-path \"{test/fork/*.sol,test/upgrades/*.sol}\" -vvv", - "test-fork": "forge test --match-path \"test/fork/**/*.sol\" -vvv", + "test-fork": "forge test --match-path \"test/fork/**/*.sol\" --rpc-url https://sepolia.drpc.org -vvv", "test-upgrades": "forge test --match-path \"test/upgrades/**/*.sol\" -vvv", "test": "forge test -vvv" } diff --git a/test/fork/e2eV2.t.sol b/test/fork/e2eV2.t.sol index 0dcc4ba..178bacc 100644 --- a/test/fork/e2eV2.t.sol +++ b/test/fork/e2eV2.t.sol @@ -987,9 +987,6 @@ contract TestE2EV2 is AragonTest, IWithdrawalQueueErrors, IGaugeVote, IEscrowCur // alice tries to exit vm.startPrank(alice); { - vm.expectRevert(VotingInactive.selector); - escrow.resetVotesAndBeginWithdrawal(1); - vm.expectRevert(CannotExit.selector); escrow.beginWithdrawal(1); } From dc6fbf8323aa7d4b46f49c53fd3d8cb2b2878f1f Mon Sep 17 00:00:00 2001 From: xavikh Date: Mon, 10 Feb 2025 21:19:58 +0100 Subject: [PATCH 12/15] Add e2e env vars --- .github/workflows/test.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d0ee59d..f1357f9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,6 +40,35 @@ jobs: fail-fast: true name: Test fork runs-on: ubuntu-latest + env: + NETWORK: "sepolia" + FORK_TEST_MODE: "new-factory" + DEPLOY_AS_PRODUCTION: false + TOKEN_TEST_WHALE: "0x" + FACTORY_ADDRESS: "0x" + MULTISIG_MEMBERS_JSON_FILE_NAME: "/script/multisig-members.json" + MIN_APPROVALS: 1 + MULTISIG_PROPOSAL_EXPIRATION_PERIOD: "864000" + MINT_TEST_TOKENS: true + TOKEN1_ADDRESS: "0x0000000000000000000000000000000000000000" + VE_TOKEN1_NAME: "Voting Escrow Token 1" + VE_TOKEN1_SYMBOL: "veTK1" + TOKEN2_ADDRESS: "0x0000000000000000000000000000000000000000" + VE_TOKEN2_NAME: "Voting Escrow Token 2" + VE_TOKEN2_SYMBOL: "veTK2" + FEE_PERCENT: "0" # 10_000 = 100% + WARMUP_PERIOD: "259200" # 3 days + COOLDOWN_PERIOD: "259200" # 3 days + MIN_LOCK_DURATION: "1" + VOTING_PAUSED: true + MIN_DEPOSIT: "10000000000000000" # 0.01 ETH + MULTISIG_PLUGIN_REPO_ADDRESS: "0x9e7956C8758470dE159481e5DD0d08F8B59217A2" + MULTISIG_PLUGIN_RELEASE: "1" + MULTISIG_PLUGIN_BUILD: "2" + SIMPLE_GAUGE_VOTER_REPO_ENS_SUBDOMAIN: "gauge-voter-${{ vars.GITHUB_RUN_ID }}" + DAO_FACTORY: "0x7a62da7B56fB3bfCdF70E900787010Bc4c9Ca42e" + PLUGIN_SETUP_PROCESSOR: "0xC24188a73dc09aA7C721f96Ad8857B469C01dC9f" + PLUGIN_REPO_FACTORY: "0x07f49c49Ce2A99CF7C28F66673d406386BDD8Ff4" steps: - uses: actions/checkout@v4 with: From cd4ef26f046e77693a4f3d944dacccacac4f5ec4 Mon Sep 17 00:00:00 2001 From: xavikh Date: Wed, 12 Feb 2025 04:06:23 +0100 Subject: [PATCH 13/15] Upgrade ve dep to v101 --- .github/workflows/test.yml | 6 +++--- lib/ve-governance/v101 | 2 +- package.json | 2 +- remappings.txt | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f1357f9..385afd2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,7 +21,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - submodules: recursive + submodules: true - uses: oven-sh/setup-bun@v2 - name: foundry-toolchain @@ -72,7 +72,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - submodules: recursive + submodules: true - uses: oven-sh/setup-bun@v2 - name: foundry-toolchain @@ -94,7 +94,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - submodules: recursive + submodules: true - uses: oven-sh/setup-bun@v2 - name: foundry-toolchain diff --git a/lib/ve-governance/v101 b/lib/ve-governance/v101 index 3aecc25..76a0ab5 160000 --- a/lib/ve-governance/v101 +++ b/lib/ve-governance/v101 @@ -1 +1 @@ -Subproject commit 3aecc25a1619fd928ec62d04764f2304b8611316 +Subproject commit 76a0ab525ac4254123ebc7d018aea9e3edc06caa diff --git a/package.json b/package.json index a182bb9..03161f3 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "build-all": "bun run build-refs && bun run build-clean", "test-unit": "forge test --no-match-path \"{test/fork/*.sol,test/upgrades/*.sol}\" -vvv", "test-fork": "forge test --match-path \"test/fork/**/*.sol\" --rpc-url https://sepolia.drpc.org -vvv", - "test-upgrades": "forge test --match-path \"test/upgrades/**/*.sol\" -vvv", + "test-upgrades": "forge test --build-info --match-path \"test/upgrades/**/*.sol\" -vvv", "test": "forge test -vvv" } } diff --git a/remappings.txt b/remappings.txt index 7eac302..5737b72 100644 --- a/remappings.txt +++ b/remappings.txt @@ -5,7 +5,7 @@ utils/=test/utils/ @aragon/osx/=lib/osx/packages/contracts/src/ @aragon/admin/=lib/osx/packages/contracts/src/plugins/governance/admin/ @aragon/multisig/=lib/osx/packages/contracts/src/plugins/governance/multisig/ -@aragon/ve-governance-v100=lib/ve-governance/v100/src/ +@aragon/ve-governance-v101=lib/ve-governance/v101/src/ @interfaces/=src/interfaces/ @mocks/=test/mocks/ From 70c3555aa34133726208df84bb4ba7bbfda0df24 Mon Sep 17 00:00:00 2001 From: xavikh Date: Wed, 12 Feb 2025 04:06:40 +0100 Subject: [PATCH 14/15] Add UpgradeTest --- test/upgrades/TestUpgrades.t.sol | 219 +++++++++++++++++++++++++++++-- 1 file changed, 210 insertions(+), 9 deletions(-) diff --git a/test/upgrades/TestUpgrades.t.sol b/test/upgrades/TestUpgrades.t.sol index 0168b55..ad90959 100644 --- a/test/upgrades/TestUpgrades.t.sol +++ b/test/upgrades/TestUpgrades.t.sol @@ -1,21 +1,222 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.17; +import {AragonTest} from "../base/AragonTest.sol"; +import {console2 as console} from "forge-std/console2.sol"; + +import {IDAO} from "@aragon/osx/core/dao/IDAO.sol"; +import {DAO, createTestDAO} from "@mocks/MockDAO.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {DAO} from "@aragon/osx/core/dao/DAO.sol"; +import {Multisig, MultisigSetup} from "@aragon/multisig/MultisigSetup.sol"; +import {UUPSUpgradeable as UUPS} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {MockERC20} from "@mocks/MockERC20.sol"; + +import "../helpers/OSxHelpers.sol"; + + +import { + Clock as Clock_v101, + VotingEscrow as VotingEscrow_v101, + Lock as Lock_v101, + QuadraticIncreasingEscrow as QuadraticIncreasingEscrow_v101, + ExitQueue as ExitQueue_v101, + SimpleGaugeVoter as SimpleGaugeVoter_v101, + SimpleGaugeVoterSetup as SimpleGaugeVoterSetup_v101, + ISimpleGaugeVoterSetupParams as ISimpleGaugeVoterSetupParams_v101 +} from '@aragon/ve-governance-v101/voting/SimpleGaugeVoterSetup.sol'; + + +import { + GaugesDaoFactory as GaugesDaoFactory_v101, + GaugePluginSet as GaugePluginSet_v101, + Deployment as Deployment_v101 +} from "@aragon/ve-governance-v101/factory/GaugesDaoFactory.sol"; +import {DeployGauges as DeployGauges_v101, DeploymentParameters as DeploymentParameters_v101} from "../../lib/ve-governance/v101/script/DeployGauges.s.sol"; + + + + + +import { + Clock as Clock_v110, + VotingEscrow as VotingEscrow_v110, + Lock as Lock_v110, + QuadraticIncreasingEscrow as QuadraticIncreasingEscrow_v110, + ExitQueue as ExitQueue_v110, + SimpleGaugeVoter as SimpleGaugeVoter_v110, + SimpleGaugeVoterSetup as SimpleGaugeVoterSetup_v110, + ISimpleGaugeVoterSetupParams as ISimpleGaugeVoterSetupParams_v110 + } from "src/voting/SimpleGaugeVoterSetup.sol"; + + import {Upgrades} from "openzeppelin-foundry-upgrades/LegacyUpgrades.sol"; -import {Test} from "forge-std/Test.sol"; -//import {Clock} from '@aragon/ve-governance-v101/clock/Clock.sol'; -//import {Clock as ClockV2} from '@clock/Clock.sol'; +import {Options} from "openzeppelin-foundry-upgrades/Options.sol"; -import { Options } from "openzeppelin-foundry-upgrades/Options.sol"; +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {Address} from "@openzeppelin/contracts/utils/Address.sol"; +import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; +import {ProxyLib} from "@libs/ProxyLib.sol"; -contract AragonTest is Test { - function testUpgrades() public { - //Clock clock = new Clock(); +contract UpgradeTest is AragonTest { + using Address for address; + using Clones for address; + using ERC165Checker for address; + using ProxyLib for address; + + GaugesDaoFactory_v101 factory; + SimpleGaugeVoter_v101 voter; + QuadraticIncreasingEscrow_v101 curve; + ExitQueue_v101 queue; + VotingEscrow_v101 escrow; + Clock_v101 clock; + Lock_v101 lock; + + DAO dao; + + MockERC20 token; + + function setUp() public { + token = new MockERC20(); + dao = createTestDAO(address(this)); + + address voterBase = address(new SimpleGaugeVoter_v101()); + address curveBase = address(new QuadraticIncreasingEscrow_v101()); + address queueBase = address(new ExitQueue_v101()); + address escrowBase = address(new VotingEscrow_v101()); + address clockBase = address(new Clock_v101()); + address lockBase = address(new Lock_v101()); + + // deploy the clock + clock = Clock_v101( + clockBase.deployUUPSProxy(abi.encodeWithSelector(Clock_v101.initialize.selector, dao)) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(clock), + _permissionId: clock.CLOCK_ADMIN_ROLE() + }); + + // deploy the escrow locker + escrow = VotingEscrow_v101( + escrowBase.deployUUPSProxy( + abi.encodeCall( + VotingEscrow_v101.initialize, + (address(token), address(dao), address(clock), 0x0) + ) + ) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(escrow), + _permissionId: escrow.ESCROW_ADMIN_ROLE() + }); + + // deploy the voting contract (plugin) + voter = SimpleGaugeVoter_v101( + voterBase.deployUUPSProxy( + abi.encodeCall( + SimpleGaugeVoter_v101.initialize, + (address(dao), address(escrow), true, address(clock)) + ) + ) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(voter), + _permissionId: voter.GAUGE_ADMIN_ROLE() + }); + + // deploy the curve + curve = QuadraticIncreasingEscrow_v101( + curveBase.deployUUPSProxy( + abi.encodeCall( + QuadraticIncreasingEscrow_v101.initialize, + (address(escrow), address(dao), 0, address(clock)) + ) + ) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(curve), + _permissionId: curve.CURVE_ADMIN_ROLE() + }); + + // deploy the exit queue + queue = ExitQueue_v101( + queueBase.deployUUPSProxy( + abi.encodeCall( + ExitQueue_v101.initialize, + (address(escrow), 0, address(dao), 0, address(clock), 1) + ) + ) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(queue), + _permissionId: queue.QUEUE_ADMIN_ROLE() + }); + + // deploy the escrow NFT + lock = Lock_v101( + lockBase.deployUUPSProxy( + abi.encodeCall( + Lock_v101.initialize, + (address(escrow), "Test", "tt", address(dao)) + ) + ) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(lock), + _permissionId: lock.LOCK_ADMIN_ROLE() + }); + + // increment the block by 1 to ensure we have a new block + // A new multisig requires this after changing settings + + vm.roll(block.number + 1); + } + + function _hToS(bytes32 _hash) internal pure returns (string memory) { + bytes memory hexString = new bytes(64); + bytes memory alphabet = "0123456789abcdef"; + + for (uint256 i = 0; i < 32; i++) { + hexString[i * 2] = alphabet[uint8(_hash[i] >> 4)]; + hexString[1 + i * 2] = alphabet[uint8(_hash[i] & 0x0f)]; + } + + return string(hexString); + } + + function testUpgrades() public { Options memory options; options.referenceBuildInfoDir = "ref_builds/build-info-v101"; + + options.referenceContract = "build-info-v101:Lock"; + Upgrades.upgradeProxy(address(lock), "Lock.sol", "", options); + + options.referenceContract = "build-info-v101:VotingEscrow"; + Upgrades.upgradeProxy(address(escrow), "VotingEscrow.sol", "", options); + + options.referenceContract = "build-info-v101:SimpleGaugeVoter"; + Upgrades.upgradeProxy(address(voter), "SimpleGaugeVoter.sol", "", options); + + options.referenceContract = "build-info-v101:QuadraticIncreasingEscrow"; + Upgrades.upgradeProxy(address(curve), "QuadraticIncreasingEscrow.sol", "", options); + + options.referenceContract = "build-info-v101:ExitQueue"; + Upgrades.upgradeProxy(address(queue), "ExitQueue.sol", "", options); + options.referenceContract = "build-info-v101:Clock"; - - Upgrades.validateUpgrade("Clock.sol", options); + Upgrades.upgradeProxy(address(clock), "Clock.sol", "", options); } } From 050b895731e0d7e95301c0f9209f1e03f362a826 Mon Sep 17 00:00:00 2001 From: xavikh Date: Wed, 12 Feb 2025 11:24:49 +0100 Subject: [PATCH 15/15] Add new upgrade test --- test/upgrades/E2EUpgrades.t.sol | 207 +++++++++++++++++++++++++++++++ test/upgrades/TestUpgrades.t.sol | 206 ++---------------------------- 2 files changed, 215 insertions(+), 198 deletions(-) create mode 100644 test/upgrades/E2EUpgrades.t.sol diff --git a/test/upgrades/E2EUpgrades.t.sol b/test/upgrades/E2EUpgrades.t.sol new file mode 100644 index 0000000..fa195d8 --- /dev/null +++ b/test/upgrades/E2EUpgrades.t.sol @@ -0,0 +1,207 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity ^0.8.17; + +import {AragonTest} from "../base/AragonTest.sol"; +import {console2 as console} from "forge-std/console2.sol"; + +import {IDAO} from "@aragon/osx/core/dao/IDAO.sol"; +import {DAO, createTestDAO} from "@mocks/MockDAO.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {DAO} from "@aragon/osx/core/dao/DAO.sol"; +import {Multisig, MultisigSetup} from "@aragon/multisig/MultisigSetup.sol"; +import {UUPSUpgradeable as UUPS} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {MockERC20} from "@mocks/MockERC20.sol"; + +import "../helpers/OSxHelpers.sol"; + +import { + GaugesDaoFactory as GaugesDaoFactory_v101, + GaugePluginSet as GaugePluginSet_v101, + Deployment as Deployment_v101 +} from "@aragon/ve-governance-v101/factory/GaugesDaoFactory.sol"; +import { + DeployGauges as DeployGauges_v101, + DeploymentParameters as DeploymentParameters_v101 +} from "../../lib/ve-governance/v101/script/DeployGauges.s.sol"; + +import { + Clock as Clock_v101, + VotingEscrow as VotingEscrow_v101, + Lock as Lock_v101, + QuadraticIncreasingEscrow as QuadraticIncreasingEscrow_v101, + ExitQueue as ExitQueue_v101, + SimpleGaugeVoter as SimpleGaugeVoter_v101, + SimpleGaugeVoterSetup as SimpleGaugeVoterSetup_v101, + ISimpleGaugeVoterSetupParams as ISimpleGaugeVoterSetupParams_v101 +} from '@aragon/ve-governance-v101/voting/SimpleGaugeVoterSetup.sol'; + +import { + Clock as Clock_v110, + VotingEscrow as VotingEscrow_v110, + Lock as Lock_v110, + QuadraticIncreasingEscrow as QuadraticIncreasingEscrow_v110, + ExitQueue as ExitQueue_v110, + SimpleGaugeVoter as SimpleGaugeVoter_v110, + SimpleGaugeVoterSetup as SimpleGaugeVoterSetup_v110, + ISimpleGaugeVoterSetupParams as ISimpleGaugeVoterSetupParams_v110 + } from "src/voting/SimpleGaugeVoterSetup.sol"; + + +import {Upgrades} from "openzeppelin-foundry-upgrades/LegacyUpgrades.sol"; +import {Options} from "openzeppelin-foundry-upgrades/Options.sol"; + +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {Address} from "@openzeppelin/contracts/utils/Address.sol"; +import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; +import {ProxyLib} from "@libs/ProxyLib.sol"; + + +contract E2EUpgrades is AragonTest { + using Address for address; + using Clones for address; + using ERC165Checker for address; + using ProxyLib for address; + + GaugesDaoFactory_v101 factory; + SimpleGaugeVoter_v101 voter; + QuadraticIncreasingEscrow_v101 curve; + ExitQueue_v101 queue; + VotingEscrow_v101 escrow; + Clock_v101 clock; + Lock_v101 lock; + + DAO dao; + + MockERC20 token; + + function setUp() public { + token = new MockERC20(); + dao = createTestDAO(address(this)); + + address voterBase = address(new SimpleGaugeVoter_v101()); + address curveBase = address(new QuadraticIncreasingEscrow_v101()); + address queueBase = address(new ExitQueue_v101()); + address escrowBase = address(new VotingEscrow_v101()); + address clockBase = address(new Clock_v101()); + address lockBase = address(new Lock_v101()); + + // deploy the clock + clock = Clock_v101( + clockBase.deployUUPSProxy(abi.encodeWithSelector(Clock_v101.initialize.selector, dao)) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(clock), + _permissionId: clock.CLOCK_ADMIN_ROLE() + }); + + // deploy the escrow locker + escrow = VotingEscrow_v101( + escrowBase.deployUUPSProxy( + abi.encodeCall( + VotingEscrow_v101.initialize, + (address(token), address(dao), address(clock), 0x0) + ) + ) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(escrow), + _permissionId: escrow.ESCROW_ADMIN_ROLE() + }); + + // deploy the voting contract (plugin) + voter = SimpleGaugeVoter_v101( + voterBase.deployUUPSProxy( + abi.encodeCall( + SimpleGaugeVoter_v101.initialize, + (address(dao), address(escrow), true, address(clock)) + ) + ) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(voter), + _permissionId: voter.GAUGE_ADMIN_ROLE() + }); + + // deploy the curve + curve = QuadraticIncreasingEscrow_v101( + curveBase.deployUUPSProxy( + abi.encodeCall( + QuadraticIncreasingEscrow_v101.initialize, + (address(escrow), address(dao), 0, address(clock)) + ) + ) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(curve), + _permissionId: curve.CURVE_ADMIN_ROLE() + }); + + // deploy the exit queue + queue = ExitQueue_v101( + queueBase.deployUUPSProxy( + abi.encodeCall( + ExitQueue_v101.initialize, + (address(escrow), 0, address(dao), 0, address(clock), 1) + ) + ) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(queue), + _permissionId: queue.QUEUE_ADMIN_ROLE() + }); + + // deploy the escrow NFT + lock = Lock_v101( + lockBase.deployUUPSProxy( + abi.encodeCall( + Lock_v101.initialize, + (address(escrow), "Test", "tt", address(dao)) + ) + ) + ); + + DAO(payable(address(dao))).grant({ + _who: address(this), + _where: address(lock), + _permissionId: lock.LOCK_ADMIN_ROLE() + }); + + // increment the block by 1 to ensure we have a new block + // A new multisig requires this after changing settings + + vm.roll(block.number + 1); + } + + function testSimulateUpgrades() public { + Options memory options; + options.referenceBuildInfoDir = "ref_builds/build-info-v101"; + + options.referenceContract = "build-info-v101:Lock"; + Upgrades.upgradeProxy(address(lock), "Lock.sol", "", options); + + options.referenceContract = "build-info-v101:VotingEscrow"; + Upgrades.upgradeProxy(address(escrow), "VotingEscrow.sol", "", options); + + options.referenceContract = "build-info-v101:SimpleGaugeVoter"; + Upgrades.upgradeProxy(address(voter), "SimpleGaugeVoter.sol", "", options); + + options.referenceContract = "build-info-v101:QuadraticIncreasingEscrow"; + Upgrades.upgradeProxy(address(curve), "QuadraticIncreasingEscrow.sol", "", options); + + options.referenceContract = "build-info-v101:ExitQueue"; + Upgrades.upgradeProxy(address(queue), "ExitQueue.sol", "", options); + + options.referenceContract = "build-info-v101:Clock"; + Upgrades.upgradeProxy(address(clock), "Clock.sol", "", options); + } +} diff --git a/test/upgrades/TestUpgrades.t.sol b/test/upgrades/TestUpgrades.t.sol index ad90959..7aa7ad3 100644 --- a/test/upgrades/TestUpgrades.t.sol +++ b/test/upgrades/TestUpgrades.t.sol @@ -2,221 +2,31 @@ pragma solidity ^0.8.17; import {AragonTest} from "../base/AragonTest.sol"; -import {console2 as console} from "forge-std/console2.sol"; - -import {IDAO} from "@aragon/osx/core/dao/IDAO.sol"; -import {DAO, createTestDAO} from "@mocks/MockDAO.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {DAO} from "@aragon/osx/core/dao/DAO.sol"; -import {Multisig, MultisigSetup} from "@aragon/multisig/MultisigSetup.sol"; -import {UUPSUpgradeable as UUPS} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import {MockERC20} from "@mocks/MockERC20.sol"; - -import "../helpers/OSxHelpers.sol"; - - -import { - Clock as Clock_v101, - VotingEscrow as VotingEscrow_v101, - Lock as Lock_v101, - QuadraticIncreasingEscrow as QuadraticIncreasingEscrow_v101, - ExitQueue as ExitQueue_v101, - SimpleGaugeVoter as SimpleGaugeVoter_v101, - SimpleGaugeVoterSetup as SimpleGaugeVoterSetup_v101, - ISimpleGaugeVoterSetupParams as ISimpleGaugeVoterSetupParams_v101 -} from '@aragon/ve-governance-v101/voting/SimpleGaugeVoterSetup.sol'; - - -import { - GaugesDaoFactory as GaugesDaoFactory_v101, - GaugePluginSet as GaugePluginSet_v101, - Deployment as Deployment_v101 -} from "@aragon/ve-governance-v101/factory/GaugesDaoFactory.sol"; -import {DeployGauges as DeployGauges_v101, DeploymentParameters as DeploymentParameters_v101} from "../../lib/ve-governance/v101/script/DeployGauges.s.sol"; - - - - - -import { - Clock as Clock_v110, - VotingEscrow as VotingEscrow_v110, - Lock as Lock_v110, - QuadraticIncreasingEscrow as QuadraticIncreasingEscrow_v110, - ExitQueue as ExitQueue_v110, - SimpleGaugeVoter as SimpleGaugeVoter_v110, - SimpleGaugeVoterSetup as SimpleGaugeVoterSetup_v110, - ISimpleGaugeVoterSetupParams as ISimpleGaugeVoterSetupParams_v110 - } from "src/voting/SimpleGaugeVoterSetup.sol"; - import {Upgrades} from "openzeppelin-foundry-upgrades/LegacyUpgrades.sol"; import {Options} from "openzeppelin-foundry-upgrades/Options.sol"; -import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; -import {Address} from "@openzeppelin/contracts/utils/Address.sol"; -import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; -import {ProxyLib} from "@libs/ProxyLib.sol"; - - -contract UpgradeTest is AragonTest { - using Address for address; - using Clones for address; - using ERC165Checker for address; - using ProxyLib for address; - - GaugesDaoFactory_v101 factory; - SimpleGaugeVoter_v101 voter; - QuadraticIncreasingEscrow_v101 curve; - ExitQueue_v101 queue; - VotingEscrow_v101 escrow; - Clock_v101 clock; - Lock_v101 lock; - - DAO dao; - - MockERC20 token; - - function setUp() public { - token = new MockERC20(); - dao = createTestDAO(address(this)); - - address voterBase = address(new SimpleGaugeVoter_v101()); - address curveBase = address(new QuadraticIncreasingEscrow_v101()); - address queueBase = address(new ExitQueue_v101()); - address escrowBase = address(new VotingEscrow_v101()); - address clockBase = address(new Clock_v101()); - address lockBase = address(new Lock_v101()); - - // deploy the clock - clock = Clock_v101( - clockBase.deployUUPSProxy(abi.encodeWithSelector(Clock_v101.initialize.selector, dao)) - ); - - DAO(payable(address(dao))).grant({ - _who: address(this), - _where: address(clock), - _permissionId: clock.CLOCK_ADMIN_ROLE() - }); - - // deploy the escrow locker - escrow = VotingEscrow_v101( - escrowBase.deployUUPSProxy( - abi.encodeCall( - VotingEscrow_v101.initialize, - (address(token), address(dao), address(clock), 0x0) - ) - ) - ); - - DAO(payable(address(dao))).grant({ - _who: address(this), - _where: address(escrow), - _permissionId: escrow.ESCROW_ADMIN_ROLE() - }); - - // deploy the voting contract (plugin) - voter = SimpleGaugeVoter_v101( - voterBase.deployUUPSProxy( - abi.encodeCall( - SimpleGaugeVoter_v101.initialize, - (address(dao), address(escrow), true, address(clock)) - ) - ) - ); - - DAO(payable(address(dao))).grant({ - _who: address(this), - _where: address(voter), - _permissionId: voter.GAUGE_ADMIN_ROLE() - }); - - // deploy the curve - curve = QuadraticIncreasingEscrow_v101( - curveBase.deployUUPSProxy( - abi.encodeCall( - QuadraticIncreasingEscrow_v101.initialize, - (address(escrow), address(dao), 0, address(clock)) - ) - ) - ); - - DAO(payable(address(dao))).grant({ - _who: address(this), - _where: address(curve), - _permissionId: curve.CURVE_ADMIN_ROLE() - }); - - // deploy the exit queue - queue = ExitQueue_v101( - queueBase.deployUUPSProxy( - abi.encodeCall( - ExitQueue_v101.initialize, - (address(escrow), 0, address(dao), 0, address(clock), 1) - ) - ) - ); - - DAO(payable(address(dao))).grant({ - _who: address(this), - _where: address(queue), - _permissionId: queue.QUEUE_ADMIN_ROLE() - }); - - // deploy the escrow NFT - lock = Lock_v101( - lockBase.deployUUPSProxy( - abi.encodeCall( - Lock_v101.initialize, - (address(escrow), "Test", "tt", address(dao)) - ) - ) - ); - - DAO(payable(address(dao))).grant({ - _who: address(this), - _where: address(lock), - _permissionId: lock.LOCK_ADMIN_ROLE() - }); - - // increment the block by 1 to ensure we have a new block - // A new multisig requires this after changing settings - - vm.roll(block.number + 1); - } - - function _hToS(bytes32 _hash) internal pure returns (string memory) { - bytes memory hexString = new bytes(64); - bytes memory alphabet = "0123456789abcdef"; - - for (uint256 i = 0; i < 32; i++) { - hexString[i * 2] = alphabet[uint8(_hash[i] >> 4)]; - hexString[1 + i * 2] = alphabet[uint8(_hash[i] & 0x0f)]; - } - - return string(hexString); - } - - function testUpgrades() public { +contract TestUpgrades is AragonTest { + function testValidateUpgrades() public { Options memory options; options.referenceBuildInfoDir = "ref_builds/build-info-v101"; options.referenceContract = "build-info-v101:Lock"; - Upgrades.upgradeProxy(address(lock), "Lock.sol", "", options); + Upgrades.validateUpgrade("Lock.sol", options); options.referenceContract = "build-info-v101:VotingEscrow"; - Upgrades.upgradeProxy(address(escrow), "VotingEscrow.sol", "", options); + Upgrades.validateUpgrade("VotingEscrow.sol", options); options.referenceContract = "build-info-v101:SimpleGaugeVoter"; - Upgrades.upgradeProxy(address(voter), "SimpleGaugeVoter.sol", "", options); + Upgrades.validateUpgrade("SimpleGaugeVoter.sol", options); options.referenceContract = "build-info-v101:QuadraticIncreasingEscrow"; - Upgrades.upgradeProxy(address(curve), "QuadraticIncreasingEscrow.sol", "", options); + Upgrades.validateUpgrade("QuadraticIncreasingEscrow.sol", options); options.referenceContract = "build-info-v101:ExitQueue"; - Upgrades.upgradeProxy(address(queue), "ExitQueue.sol", "", options); + Upgrades.validateUpgrade("ExitQueue.sol", options); options.referenceContract = "build-info-v101:Clock"; - Upgrades.upgradeProxy(address(clock), "Clock.sol", "", options); + Upgrades.validateUpgrade("Clock.sol", options); } }