From 794411b5aeb991a7babda0c09309dcc491f0763f Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Mon, 16 Oct 2023 12:00:20 -0300 Subject: [PATCH 01/16] fix: add sanity checks for staking token and dss-vest --- script/02-StakingRewardsInit.s.sol | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/script/02-StakingRewardsInit.s.sol b/script/02-StakingRewardsInit.s.sol index 6ac23a6..e714f88 100644 --- a/script/02-StakingRewardsInit.s.sol +++ b/script/02-StakingRewardsInit.s.sol @@ -31,12 +31,22 @@ interface RelyLike { function rely(address who) external; } -interface WithGemLike { +interface DssVestWithGemLike { function gem() external view returns (address); } interface StakingRewardsLike { function rewardsToken() external view returns (address); + + function stakingToken() external view returns (address); +} + +interface VestedRewardsDistributionLike { + function dssVest() external view returns (address); + + function gem() external view returns (address); + + function stakingRewards() external view returns (address); } contract Phase0StakingRewardsInitScript is Script { @@ -49,6 +59,7 @@ contract Phase0StakingRewardsInitScript is Script { Reader deps = new Reader(ScriptTools.loadDependencies()); address ngt = deps.envOrReadAddress(".ngt", "FOUNDRY_NGT"); + address nst = deps.envOrReadAddress(".nst", "FOUNDRY_NST"); address dist = deps.envOrReadAddress(".dist", "FOUNDRY_DIST"); address farm = deps.envOrReadAddress(".farm", "FOUNDRY_FARM"); address vest = deps.envOrReadAddress(".vest", "FOUNDRY_VEST"); @@ -60,11 +71,19 @@ contract Phase0StakingRewardsInitScript is Script { uint256 vestBgn = config.readUint(".vestBgn"); uint256 vestTau = config.readUint(".vestTau"); - require(WithGemLike(dist).gem() == ngt, "VestedRewardsDistribution/invalid-gem"); - require(WithGemLike(vest).gem() == ngt, "DssVest/invalid-gem"); + vm.startBroadcast(); + + require(DssVestWithGemLike(vest).gem() == ngt, "DssVest/invalid-gem"); + require(StakingRewardsLike(farm).rewardsToken() == ngt, "StakingRewards/invalid-rewards-token"); + require(StakingRewardsLike(farm).stakingToken() == nst, "StakingRewards/invalid-staking-token"); - vm.startBroadcast(); + require(VestedRewardsDistributionLike(dist).gem() == ngt, "VestedRewardsDistribution/invalid-gem"); + require(VestedRewardsDistributionLike(dist).dssVest() == vest, "VestedRewardsDistribution/invalid-dss-vest"); + require( + VestedRewardsDistributionLike(dist).stakingRewards() == farm, + "VestedRewardsDistribution/invalid-staking-rewards" + ); // Grant minting rights on `ngt` to `vest`. RelyLike(ngt).rely(vest); From 9c6d4da6c4c1ef786ca8c512c4ac928b66492b19 Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Mon, 16 Oct 2023 12:06:19 -0300 Subject: [PATCH 02/16] fix: add check for `StakingRewards` being updated before --- script/02-StakingRewardsInit.s.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/script/02-StakingRewardsInit.s.sol b/script/02-StakingRewardsInit.s.sol index e714f88..f7ef5cc 100644 --- a/script/02-StakingRewardsInit.s.sol +++ b/script/02-StakingRewardsInit.s.sol @@ -36,6 +36,8 @@ interface DssVestWithGemLike { } interface StakingRewardsLike { + function lastUpdateTime() external view returns (uint256); + function rewardsToken() external view returns (address); function stakingToken() external view returns (address); @@ -77,6 +79,7 @@ contract Phase0StakingRewardsInitScript is Script { require(StakingRewardsLike(farm).rewardsToken() == ngt, "StakingRewards/invalid-rewards-token"); require(StakingRewardsLike(farm).stakingToken() == nst, "StakingRewards/invalid-staking-token"); + require(StakingRewardsLike(farm).lastUpdateTime() == 0, "StakingRewards/invalid-last-update-time"); require(VestedRewardsDistributionLike(dist).gem() == ngt, "VestedRewardsDistribution/invalid-gem"); require(VestedRewardsDistributionLike(dist).dssVest() == vest, "VestedRewardsDistribution/invalid-dss-vest"); From 6bb1d068a71009a1c5272f76503ed59b2bc844ba Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Mon, 16 Oct 2023 18:54:34 -0300 Subject: [PATCH 03/16] refactor: seggregate scripts for different phases --- .gitignore | 6 +++--- script/input/5/phase-0-alpha/README.md | 1 + .../template-check-staking-rewards.json | 0 .../template-staking-rewards-deploy.json | 0 .../template-staking-rewards-init.json | 0 script/output/5/phase-0-alpha/README.md | 1 + .../01-StakingRewardsDeploy.s.sol | 14 +++++--------- .../02-StakingRewardsInit.s.sol | 16 ++++++---------- .../09-CheckStakingRewardsDeployment.s.sol | 9 ++------- 9 files changed, 18 insertions(+), 29 deletions(-) create mode 100644 script/input/5/phase-0-alpha/README.md rename script/input/5/{ => phase-0-alpha}/template-check-staking-rewards.json (100%) rename script/input/5/{ => phase-0-alpha}/template-staking-rewards-deploy.json (100%) rename script/input/5/{ => phase-0-alpha}/template-staking-rewards-init.json (100%) create mode 100644 script/output/5/phase-0-alpha/README.md rename script/{ => phase-0-alpha}/01-StakingRewardsDeploy.s.sol (87%) rename script/{ => phase-0-alpha}/02-StakingRewardsInit.s.sol (89%) rename script/{ => phase-0-alpha}/09-CheckStakingRewardsDeployment.s.sol (94%) diff --git a/.gitignore b/.gitignore index 8d64507..b48895d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,9 +6,9 @@ out/ /broadcast # Ignores script config -/script/input/*/*.json -!/script/input/*/template-*.json -/script/output/*/*.json +/script/input/**/*.json +!/script/input/**/template-*.json +/script/output/**/*.json # Docs docs/ diff --git a/script/input/5/phase-0-alpha/README.md b/script/input/5/phase-0-alpha/README.md new file mode 100644 index 0000000..e18baf5 --- /dev/null +++ b/script/input/5/phase-0-alpha/README.md @@ -0,0 +1 @@ +Script inputs for Goerli for `phase-0-alpha`. diff --git a/script/input/5/template-check-staking-rewards.json b/script/input/5/phase-0-alpha/template-check-staking-rewards.json similarity index 100% rename from script/input/5/template-check-staking-rewards.json rename to script/input/5/phase-0-alpha/template-check-staking-rewards.json diff --git a/script/input/5/template-staking-rewards-deploy.json b/script/input/5/phase-0-alpha/template-staking-rewards-deploy.json similarity index 100% rename from script/input/5/template-staking-rewards-deploy.json rename to script/input/5/phase-0-alpha/template-staking-rewards-deploy.json diff --git a/script/input/5/template-staking-rewards-init.json b/script/input/5/phase-0-alpha/template-staking-rewards-init.json similarity index 100% rename from script/input/5/template-staking-rewards-init.json rename to script/input/5/phase-0-alpha/template-staking-rewards-init.json diff --git a/script/output/5/phase-0-alpha/README.md b/script/output/5/phase-0-alpha/README.md new file mode 100644 index 0000000..bc96443 --- /dev/null +++ b/script/output/5/phase-0-alpha/README.md @@ -0,0 +1 @@ +Script outputs for Goerli for `phase-0-alpha`. diff --git a/script/01-StakingRewardsDeploy.s.sol b/script/phase-0-alpha/01-StakingRewardsDeploy.s.sol similarity index 87% rename from script/01-StakingRewardsDeploy.s.sol rename to script/phase-0-alpha/01-StakingRewardsDeploy.s.sol index bfdbb77..46699bb 100644 --- a/script/01-StakingRewardsDeploy.s.sol +++ b/script/phase-0-alpha/01-StakingRewardsDeploy.s.sol @@ -16,21 +16,17 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; -import {stdJson} from "forge-std/StdJson.sol"; import {ScriptTools} from "dss-test/ScriptTools.sol"; -import {Reader} from "./helpers/Reader.sol"; -import {StakingRewardsDeploy, StakingRewardsDeployParams} from "./dependencies/StakingRewardsDeploy.sol"; +import {Reader} from "../helpers/Reader.sol"; +import {StakingRewardsDeploy, StakingRewardsDeployParams} from "../dependencies/StakingRewardsDeploy.sol"; import { VestedRewardsDistributionDeploy, VestedRewardsDistributionDeployParams -} from "./dependencies/VestedRewardsDistributionDeploy.sol"; +} from "../dependencies/VestedRewardsDistributionDeploy.sol"; -contract Phase0StakingRewardsDeployScript is Script { - using stdJson for string; - using ScriptTools for string; - - string internal constant NAME = "Phase0StakingRewardsDeploy"; +contract Phase0Alpha_StakingRewardsDeployScript is Script { + string internal constant NAME = "phase-0-alpha/staking-rewards-deploy"; function run() external { Reader reader = new Reader(ScriptTools.loadConfig()); diff --git a/script/02-StakingRewardsInit.s.sol b/script/phase-0-alpha/02-StakingRewardsInit.s.sol similarity index 89% rename from script/02-StakingRewardsInit.s.sol rename to script/phase-0-alpha/02-StakingRewardsInit.s.sol index f7ef5cc..b1017f1 100644 --- a/script/02-StakingRewardsInit.s.sol +++ b/script/phase-0-alpha/02-StakingRewardsInit.s.sol @@ -16,16 +16,15 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; -import {stdJson} from "forge-std/StdJson.sol"; import {ScriptTools} from "dss-test/ScriptTools.sol"; -import {Reader} from "./helpers/Reader.sol"; -import {StakingRewardsInit, StakingRewardsInitParams} from "./dependencies/StakingRewardsInit.sol"; +import {Reader} from "../helpers/Reader.sol"; +import {StakingRewardsInit, StakingRewardsInitParams} from "../dependencies/StakingRewardsInit.sol"; import { VestedRewardsDistributionInit, VestedRewardsDistributionInitParams -} from "./dependencies/VestedRewardsDistributionInit.sol"; -import {VestInit, VestInitParams, VestCreateParams} from "./dependencies/VestInit.sol"; +} from "../dependencies/VestedRewardsDistributionInit.sol"; +import {VestInit, VestInitParams, VestCreateParams} from "../dependencies/VestInit.sol"; interface RelyLike { function rely(address who) external; @@ -51,11 +50,8 @@ interface VestedRewardsDistributionLike { function stakingRewards() external view returns (address); } -contract Phase0StakingRewardsInitScript is Script { - using stdJson for string; - using ScriptTools for string; - - string internal constant NAME = "Phase0StakingRewardsInit"; +contract Phase0Alpha_StakingRewardsInitScript is Script { + string internal constant NAME = "phase-0-alpha/staking-rewards-init"; function run() external { Reader deps = new Reader(ScriptTools.loadDependencies()); diff --git a/script/09-CheckStakingRewardsDeployment.s.sol b/script/phase-0-alpha/09-CheckStakingRewardsDeployment.s.sol similarity index 94% rename from script/09-CheckStakingRewardsDeployment.s.sol rename to script/phase-0-alpha/09-CheckStakingRewardsDeployment.s.sol index 7f567f6..ccd0300 100644 --- a/script/09-CheckStakingRewardsDeployment.s.sol +++ b/script/phase-0-alpha/09-CheckStakingRewardsDeployment.s.sol @@ -16,10 +16,8 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; -import {stdJson} from "forge-std/StdJson.sol"; -import {ScriptTools} from "dss-test/ScriptTools.sol"; -import {Reader} from "./helpers/Reader.sol"; +import {Reader} from "../helpers/Reader.sol"; interface WardsLike { function wards(address who) external view returns (uint256); @@ -65,10 +63,7 @@ interface DssVestWithGemLike { function valid(uint256 _id) external view returns (bool); } -contract Phase0CheckStakingRewardsDeploymentScript is Script { - using stdJson for string; - using ScriptTools for string; - +contract Phase0Alpha_CheckStakingRewardsDeploymentScript is Script { function run() external returns (bool) { Reader deps = new Reader(""); deps.loadDependenciesOrConfig(); From 1c388c0cc2fdc88280a7f037d4d2abd6ed9e149f Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Tue, 17 Oct 2023 13:56:53 -0300 Subject: [PATCH 04/16] refactor: fully segregate scripts for different phases --- script/dependencies/StakingRewardsInit.sol | 16 +-- script/dependencies/SubProxyInit.sol | 8 +- script/dependencies/VestInit.sol | 30 +++--- .../VestedRewardsDistributionInit.sol | 8 +- .../phase-0-alpha/FarmingInit.sol | 97 +++++++++++++++++++ script/dependencies/phase-0/FarmingInit.sol | 93 ++++++++++++++++++ script/input/1/phase-0/README.md | 1 + .../template-staking-rewards-deploy.json | 8 ++ script/input/5/phase-0/README.md | 1 + .../template-staking-rewards-deploy.json | 8 ++ script/output/1/phase-0/README.md | 1 + script/output/5/phase-0/README.md | 1 + .../phase-0-alpha/02-StakingRewardsInit.s.sol | 76 +++------------ script/phase-0/01-StakingRewardsDeploy.s.sol | 75 ++++++++++++++ 14 files changed, 332 insertions(+), 91 deletions(-) create mode 100644 script/dependencies/phase-0-alpha/FarmingInit.sol create mode 100644 script/dependencies/phase-0/FarmingInit.sol create mode 100644 script/input/1/phase-0/README.md create mode 100644 script/input/1/phase-0/template-staking-rewards-deploy.json create mode 100644 script/input/5/phase-0/README.md create mode 100644 script/input/5/phase-0/template-staking-rewards-deploy.json create mode 100644 script/output/1/phase-0/README.md create mode 100644 script/output/5/phase-0/README.md create mode 100644 script/phase-0/01-StakingRewardsDeploy.s.sol diff --git a/script/dependencies/StakingRewardsInit.sol b/script/dependencies/StakingRewardsInit.sol index fc457b3..b68ccda 100644 --- a/script/dependencies/StakingRewardsInit.sol +++ b/script/dependencies/StakingRewardsInit.sol @@ -15,14 +15,6 @@ pragma solidity ^0.8.0; -interface StakingRewardsLike { - function setRewardsDistribution(address _rewardsDistribution) external; - - function acceptOwnership() external; - - function nominateNewOwner(address _owner) external; -} - struct StakingRewardsInitParams { address dist; } @@ -46,3 +38,11 @@ library StakingRewardsInit { StakingRewardsLike(farm).acceptOwnership(); } } + +interface StakingRewardsLike { + function setRewardsDistribution(address _rewardsDistribution) external; + + function acceptOwnership() external; + + function nominateNewOwner(address _owner) external; +} diff --git a/script/dependencies/SubProxyInit.sol b/script/dependencies/SubProxyInit.sol index 4505484..3f45d3a 100644 --- a/script/dependencies/SubProxyInit.sol +++ b/script/dependencies/SubProxyInit.sol @@ -18,10 +18,6 @@ pragma solidity ^0.8.0; import {ScriptTools} from "dss-test/ScriptTools.sol"; import {DssInstance, MCD} from "dss-test/MCD.sol"; -interface SubProxyLike { - function rely(address who) external; -} - struct SubProxyInitParams { address chainlog; string name; @@ -42,3 +38,7 @@ library SubProxyInit { mcd.chainlog.setAddress(string.concat("SUBPROXY_", name).stringToBytes32(), subProxy); } } + +interface SubProxyLike { + function rely(address who) external; +} diff --git a/script/dependencies/VestInit.sol b/script/dependencies/VestInit.sol index c09dd5e..d479aa4 100644 --- a/script/dependencies/VestInit.sol +++ b/script/dependencies/VestInit.sol @@ -17,21 +17,6 @@ pragma solidity ^0.8.0; import {ScriptTools} from "dss-test/ScriptTools.sol"; -interface DssVestLike { - function file(bytes32 _what, uint256 _data) external; - - function create( - address _usr, - uint256 _tot, - uint256 _bgn, - uint256 _tau, - uint256 _eta, - address _mgr - ) external returns (uint256 id); - - function restrict(uint256 _id) external; -} - struct VestInitParams { uint256 cap; } @@ -64,3 +49,18 @@ library VestInit { DssVestLike(vest).restrict(vestId); } } + +interface DssVestLike { + function file(bytes32 _what, uint256 _data) external; + + function create( + address _usr, + uint256 _tot, + uint256 _bgn, + uint256 _tau, + uint256 _eta, + address _mgr + ) external returns (uint256 id); + + function restrict(uint256 _id) external; +} diff --git a/script/dependencies/VestedRewardsDistributionInit.sol b/script/dependencies/VestedRewardsDistributionInit.sol index 8f45797..fbfcb46 100644 --- a/script/dependencies/VestedRewardsDistributionInit.sol +++ b/script/dependencies/VestedRewardsDistributionInit.sol @@ -15,10 +15,6 @@ pragma solidity ^0.8.0; -interface VestedRewardsDistributionLike { - function file(bytes32 what, uint256 data) external; -} - struct VestedRewardsDistributionInitParams { uint256 vestId; } @@ -28,3 +24,7 @@ library VestedRewardsDistributionInit { VestedRewardsDistributionLike(dist).file("vestId", p.vestId); } } + +interface VestedRewardsDistributionLike { + function file(bytes32 what, uint256 data) external; +} diff --git a/script/dependencies/phase-0-alpha/FarmingInit.sol b/script/dependencies/phase-0-alpha/FarmingInit.sol new file mode 100644 index 0000000..252f27e --- /dev/null +++ b/script/dependencies/phase-0-alpha/FarmingInit.sol @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +pragma solidity ^0.8.0; + +import {StakingRewardsInit, StakingRewardsInitParams} from "../StakingRewardsInit.sol"; +import {VestedRewardsDistributionInit, VestedRewardsDistributionInitParams} from "../VestedRewardsDistributionInit.sol"; +import {VestInit, VestInitParams, VestCreateParams} from "../VestInit.sol"; + +struct FarmingInitParams { + address nst; + address ngt; + address farm; + address dist; + address vest; + uint256 vestCap; + uint256 vestTot; + uint256 vestBgn; + uint256 vestTau; +} + +struct FarmingInitResult { + uint256 vestId; +} + +library FarmingInit { + function init(FarmingInitParams memory p) internal returns (FarmingInitResult memory r) { + require(DssVestWithGemLike(p.vest).gem() == p.ngt, "FarmingInit/vest-gem-mismatch"); + + require(StakingRewardsLike(p.farm).rewardsToken() == p.ngt, "FarmingInit/farm-rewards-token-mismatch"); + require(StakingRewardsLike(p.farm).stakingToken() == p.nst, "FarmingInit/farm-staking-token-mismatch"); + require(StakingRewardsLike(p.farm).lastUpdateTime() == 0, "FarmingInit/farm-last-update-time-invalid"); + + require(VestedRewardsDistributionLike(p.dist).gem() == p.ngt, "FarmingInit/dist-gem-mismatch"); + require(VestedRewardsDistributionLike(p.dist).dssVest() == p.vest, "FarmingInit/dist-dss-vest-mismatch"); + require( + VestedRewardsDistributionLike(p.dist).stakingRewards() == p.farm, + "FarmingInit/dist-staking-rewards-mismatch" + ); + + // Grant minting rights on `ngt` to `vest`. + RelyLike(p.ngt).rely(p.vest); + + // Define global max vesting ratio on `vest`. + VestInit.init(p.vest, VestInitParams({cap: p.vestCap})); + + // Set `dist` with `rewardsDistribution` role in `farm`. + StakingRewardsInit.init(p.farm, StakingRewardsInitParams({dist: p.dist})); + + // Create the proper vesting stream for rewards distribution. + uint256 vestId = VestInit.create( + p.vest, + VestCreateParams({usr: p.dist, tot: p.vestTot, bgn: p.vestBgn, tau: p.vestTau, eta: 0}) + ); + + // Set the `vestId` in `dist` + VestedRewardsDistributionInit.init(p.dist, VestedRewardsDistributionInitParams({vestId: vestId})); + + r.vestId = vestId; + } +} + +interface RelyLike { + function rely(address who) external; +} + +interface DssVestWithGemLike { + function gem() external view returns (address); +} + +interface StakingRewardsLike { + function lastUpdateTime() external view returns (uint256); + + function rewardsToken() external view returns (address); + + function stakingToken() external view returns (address); +} + +interface VestedRewardsDistributionLike { + function dssVest() external view returns (address); + + function gem() external view returns (address); + + function stakingRewards() external view returns (address); +} diff --git a/script/dependencies/phase-0/FarmingInit.sol b/script/dependencies/phase-0/FarmingInit.sol new file mode 100644 index 0000000..0561aaa --- /dev/null +++ b/script/dependencies/phase-0/FarmingInit.sol @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +pragma solidity ^0.8.0; + +import {StakingRewardsInit, StakingRewardsInitParams} from "../StakingRewardsInit.sol"; +import {VestedRewardsDistributionInit, VestedRewardsDistributionInitParams} from "../VestedRewardsDistributionInit.sol"; +import {VestInit, VestCreateParams} from "../VestInit.sol"; + +struct FarmingInitParams { + address nst; + address ngt; + address farm; + address dist; + address vest; + uint256 vestTot; + uint256 vestBgn; + uint256 vestTau; +} + +struct FarmingInitResult { + uint256 vestId; +} + +library FarmingInit { + function init(FarmingInitParams memory p) internal returns (FarmingInitResult memory r) { + require(DssVestWithGemLike(p.vest).gem() == p.ngt, "FarmingInit/vest-gem-mismatch"); + + require(StakingRewardsLike(p.farm).rewardsToken() == p.ngt, "FarmingInit/farm-rewards-token-mismatch"); + require(StakingRewardsLike(p.farm).stakingToken() == p.nst, "FarmingInit/farm-staking-token-mismatch"); + require(StakingRewardsLike(p.farm).lastUpdateTime() == 0, "FarmingInit/farm-last-update-time-invalid"); + + require(VestedRewardsDistributionLike(p.dist).gem() == p.ngt, "FarmingInit/dist-gem-mismatch"); + require(VestedRewardsDistributionLike(p.dist).dssVest() == p.vest, "FarmingInit/dist-dss-vest-mismatch"); + require( + VestedRewardsDistributionLike(p.dist).stakingRewards() == p.farm, + "FarmingInit/dist-staking-rewards-mismatch" + ); + + // Check if minting rights on `ngt` were granted to `vest`. + require(WardsLike(p.ngt).wards(p.vest), "FarmingInit/missing-ngt-rely-vest"); + + // Set `dist` with `rewardsDistribution` role in `farm`. + StakingRewardsInit.init(p.farm, StakingRewardsInitParams({dist: p.dist})); + + // Create the proper vesting stream for rewards distribution. + uint256 vestId = VestInit.create( + p.vest, + VestCreateParams({usr: p.dist, tot: p.vestTot, bgn: p.vestBgn, tau: p.vestTau, eta: 0}) + ); + + // Set the `vestId` in `dist` + VestedRewardsDistributionInit.init(p.dist, VestedRewardsDistributionInitParams({vestId: vestId})); + + r.vestId = vestId; + } +} + +interface WardsLike { + function wards(address who) external view returns (uint256); +} + +interface DssVestWithGemLike { + function gem() external view returns (address); +} + +interface StakingRewardsLike { + function lastUpdateTime() external view returns (uint256); + + function rewardsToken() external view returns (address); + + function stakingToken() external view returns (address); +} + +interface VestedRewardsDistributionLike { + function dssVest() external view returns (address); + + function gem() external view returns (address); + + function stakingRewards() external view returns (address); +} diff --git a/script/input/1/phase-0/README.md b/script/input/1/phase-0/README.md new file mode 100644 index 0000000..fe6baf3 --- /dev/null +++ b/script/input/1/phase-0/README.md @@ -0,0 +1 @@ +Script inputs for Mainnet for `phase-0`. diff --git a/script/input/1/phase-0/template-staking-rewards-deploy.json b/script/input/1/phase-0/template-staking-rewards-deploy.json new file mode 100644 index 0000000..e542009 --- /dev/null +++ b/script/input/1/phase-0/template-staking-rewards-deploy.json @@ -0,0 +1,8 @@ +{ + "changelog": "address", + "ngt": "address", + "nst": "address", + "dist": "address", + "farm": "address", + "vest": "address" +} diff --git a/script/input/5/phase-0/README.md b/script/input/5/phase-0/README.md new file mode 100644 index 0000000..2f1dfa5 --- /dev/null +++ b/script/input/5/phase-0/README.md @@ -0,0 +1 @@ +Script inputs for Goerli for `phase-0`. diff --git a/script/input/5/phase-0/template-staking-rewards-deploy.json b/script/input/5/phase-0/template-staking-rewards-deploy.json new file mode 100644 index 0000000..e542009 --- /dev/null +++ b/script/input/5/phase-0/template-staking-rewards-deploy.json @@ -0,0 +1,8 @@ +{ + "changelog": "address", + "ngt": "address", + "nst": "address", + "dist": "address", + "farm": "address", + "vest": "address" +} diff --git a/script/output/1/phase-0/README.md b/script/output/1/phase-0/README.md new file mode 100644 index 0000000..c5f9fc3 --- /dev/null +++ b/script/output/1/phase-0/README.md @@ -0,0 +1 @@ +Script outputs for Mainnet for `phase-0`. diff --git a/script/output/5/phase-0/README.md b/script/output/5/phase-0/README.md new file mode 100644 index 0000000..0253251 --- /dev/null +++ b/script/output/5/phase-0/README.md @@ -0,0 +1 @@ +Script outputs for Goerli for `phase-0`. diff --git a/script/phase-0-alpha/02-StakingRewardsInit.s.sol b/script/phase-0-alpha/02-StakingRewardsInit.s.sol index b1017f1..7ff7911 100644 --- a/script/phase-0-alpha/02-StakingRewardsInit.s.sol +++ b/script/phase-0-alpha/02-StakingRewardsInit.s.sol @@ -19,36 +19,7 @@ import {Script} from "forge-std/Script.sol"; import {ScriptTools} from "dss-test/ScriptTools.sol"; import {Reader} from "../helpers/Reader.sol"; -import {StakingRewardsInit, StakingRewardsInitParams} from "../dependencies/StakingRewardsInit.sol"; -import { - VestedRewardsDistributionInit, - VestedRewardsDistributionInitParams -} from "../dependencies/VestedRewardsDistributionInit.sol"; -import {VestInit, VestInitParams, VestCreateParams} from "../dependencies/VestInit.sol"; - -interface RelyLike { - function rely(address who) external; -} - -interface DssVestWithGemLike { - function gem() external view returns (address); -} - -interface StakingRewardsLike { - function lastUpdateTime() external view returns (uint256); - - function rewardsToken() external view returns (address); - - function stakingToken() external view returns (address); -} - -interface VestedRewardsDistributionLike { - function dssVest() external view returns (address); - - function gem() external view returns (address); - - function stakingRewards() external view returns (address); -} +import {FarmingInit, FarmingInitParams} from "../dependencies/phase-0-alpha/FarmingInit.sol"; contract Phase0Alpha_StakingRewardsInitScript is Script { string internal constant NAME = "phase-0-alpha/staking-rewards-init"; @@ -71,36 +42,21 @@ contract Phase0Alpha_StakingRewardsInitScript is Script { vm.startBroadcast(); - require(DssVestWithGemLike(vest).gem() == ngt, "DssVest/invalid-gem"); - - require(StakingRewardsLike(farm).rewardsToken() == ngt, "StakingRewards/invalid-rewards-token"); - require(StakingRewardsLike(farm).stakingToken() == nst, "StakingRewards/invalid-staking-token"); - require(StakingRewardsLike(farm).lastUpdateTime() == 0, "StakingRewards/invalid-last-update-time"); - - require(VestedRewardsDistributionLike(dist).gem() == ngt, "VestedRewardsDistribution/invalid-gem"); - require(VestedRewardsDistributionLike(dist).dssVest() == vest, "VestedRewardsDistribution/invalid-dss-vest"); - require( - VestedRewardsDistributionLike(dist).stakingRewards() == farm, - "VestedRewardsDistribution/invalid-staking-rewards" - ); - - // Grant minting rights on `ngt` to `vest`. - RelyLike(ngt).rely(vest); - - // Define global max vesting ratio on `vest`. - VestInit.init(vest, VestInitParams({cap: vestCap})); - - // Set `dist` with `rewardsDistribution` role in `farm`. - StakingRewardsInit.init(farm, StakingRewardsInitParams({dist: dist})); - - // Create the proper vesting stream for rewards distribution. - uint256 vestId = VestInit.create( - vest, - VestCreateParams({usr: dist, tot: vestTot, bgn: vestBgn, tau: vestTau, eta: 0}) - ); - - // Set the `vestId` in `dist` - VestedRewardsDistributionInit.init(dist, VestedRewardsDistributionInitParams({vestId: vestId})); + uint256 vestId = FarmingInit + .init( + FarmingInitParams({ + ngt: ngt, + nst: nst, + dist: dist, + farm: farm, + vest: vest, + vestCap: vestCap, + vestTot: vestTot, + vestBgn: vestBgn, + vestTau: vestTau + }) + ) + .vestId; vm.stopBroadcast(); diff --git a/script/phase-0/01-StakingRewardsDeploy.s.sol b/script/phase-0/01-StakingRewardsDeploy.s.sol new file mode 100644 index 0000000..1c7b4c0 --- /dev/null +++ b/script/phase-0/01-StakingRewardsDeploy.s.sol @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: © 2023 Dai Foundation +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +pragma solidity ^0.8.0; + +import {Script} from "forge-std/Script.sol"; +import {ScriptTools} from "dss-test/ScriptTools.sol"; + +import {Reader} from "../helpers/Reader.sol"; +import {StakingRewardsDeploy, StakingRewardsDeployParams} from "../dependencies/StakingRewardsDeploy.sol"; +import { + VestedRewardsDistributionDeploy, + VestedRewardsDistributionDeployParams +} from "../dependencies/VestedRewardsDistributionDeploy.sol"; + +interface ChangelogLike { + function getAddress(bytes32 _key) external view returns (address addr); +} + +contract Phase0_StakingRewardsDeployScript is Script { + string internal constant NAME = "phase-0/staking-rewards-deploy"; + + function run() external { + Reader reader = new Reader(ScriptTools.loadConfig()); + ChangelogLike changelog = ChangelogLike(reader.envOrReadAddress(".changelog", "FOUNDRY_CHANGELOG")); + + address admin = changelog.getAddress("MCD_PAUSE_PROXY"); + + address ngt = reader.envOrReadAddress(".ngt", "FOUNDRY_NGT"); + address nst = reader.envOrReadAddress(".nst", "FOUNDRY_NST"); + address dist = reader.readAddressOptional(".dist"); + address farm = reader.readAddressOptional(".farm"); + address vest = reader.readAddressOptional(".vest"); + + vm.startBroadcast(); + + if (vest == address(0)) { + vest = deployCode("DssVest.sol:DssVestMintable", abi.encode(ngt)); + ScriptTools.switchOwner(vest, msg.sender, admin); + } + + if (farm == address(0)) { + farm = StakingRewardsDeploy.deploy( + StakingRewardsDeployParams({owner: admin, stakingToken: nst, rewardsToken: ngt}) + ); + } + + if (dist == address(0)) { + dist = VestedRewardsDistributionDeploy.deploy( + VestedRewardsDistributionDeployParams({deployer: msg.sender, owner: admin, vest: vest, farm: farm}) + ); + } + + vm.stopBroadcast(); + + ScriptTools.exportContract(NAME, "admin", admin); + ScriptTools.exportContract(NAME, "ngt", ngt); + ScriptTools.exportContract(NAME, "nst", nst); + ScriptTools.exportContract(NAME, "dist", dist); + ScriptTools.exportContract(NAME, "farm", farm); + ScriptTools.exportContract(NAME, "vest", vest); + } +} From 0a8a57b9faa1915659e45faeacfe042c791f8ace Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:21:11 -0300 Subject: [PATCH 05/16] refactor: rename scripts and template inputs --- ...ploy.json => template-farming-deploy.json} | 0 ...wards.json => template-farming-check.json} | 0 ...ploy.json => template-farming-deploy.json} | 0 ...s-init.json => template-farming-init.json} | 0 ...ploy.json => template-farming-deploy.json} | 0 ...rdsDeploy.s.sol => 01-FarmingDeploy.s.sol} | 4 +- ...RewardsInit.s.sol => 02-FarmingInit.s.sol} | 4 +- ...Deployment.s.sol => 03-FarmingCheck.s.sol} | 91 +++++++++---------- ...rdsDeploy.s.sol => 01-FarmingDeploy.s.sol} | 11 +-- 9 files changed, 52 insertions(+), 58 deletions(-) rename script/input/1/phase-0/{template-staking-rewards-deploy.json => template-farming-deploy.json} (100%) rename script/input/5/phase-0-alpha/{template-check-staking-rewards.json => template-farming-check.json} (100%) rename script/input/5/phase-0-alpha/{template-staking-rewards-deploy.json => template-farming-deploy.json} (100%) rename script/input/5/phase-0-alpha/{template-staking-rewards-init.json => template-farming-init.json} (100%) rename script/input/5/phase-0/{template-staking-rewards-deploy.json => template-farming-deploy.json} (100%) rename script/phase-0-alpha/{01-StakingRewardsDeploy.s.sol => 01-FarmingDeploy.s.sol} (95%) rename script/phase-0-alpha/{02-StakingRewardsInit.s.sol => 02-FarmingInit.s.sol} (95%) rename script/phase-0-alpha/{09-CheckStakingRewardsDeployment.s.sol => 03-FarmingCheck.s.sol} (98%) rename script/phase-0/{01-StakingRewardsDeploy.s.sol => 01-FarmingDeploy.s.sol} (87%) diff --git a/script/input/1/phase-0/template-staking-rewards-deploy.json b/script/input/1/phase-0/template-farming-deploy.json similarity index 100% rename from script/input/1/phase-0/template-staking-rewards-deploy.json rename to script/input/1/phase-0/template-farming-deploy.json diff --git a/script/input/5/phase-0-alpha/template-check-staking-rewards.json b/script/input/5/phase-0-alpha/template-farming-check.json similarity index 100% rename from script/input/5/phase-0-alpha/template-check-staking-rewards.json rename to script/input/5/phase-0-alpha/template-farming-check.json diff --git a/script/input/5/phase-0-alpha/template-staking-rewards-deploy.json b/script/input/5/phase-0-alpha/template-farming-deploy.json similarity index 100% rename from script/input/5/phase-0-alpha/template-staking-rewards-deploy.json rename to script/input/5/phase-0-alpha/template-farming-deploy.json diff --git a/script/input/5/phase-0-alpha/template-staking-rewards-init.json b/script/input/5/phase-0-alpha/template-farming-init.json similarity index 100% rename from script/input/5/phase-0-alpha/template-staking-rewards-init.json rename to script/input/5/phase-0-alpha/template-farming-init.json diff --git a/script/input/5/phase-0/template-staking-rewards-deploy.json b/script/input/5/phase-0/template-farming-deploy.json similarity index 100% rename from script/input/5/phase-0/template-staking-rewards-deploy.json rename to script/input/5/phase-0/template-farming-deploy.json diff --git a/script/phase-0-alpha/01-StakingRewardsDeploy.s.sol b/script/phase-0-alpha/01-FarmingDeploy.s.sol similarity index 95% rename from script/phase-0-alpha/01-StakingRewardsDeploy.s.sol rename to script/phase-0-alpha/01-FarmingDeploy.s.sol index 46699bb..eecca10 100644 --- a/script/phase-0-alpha/01-StakingRewardsDeploy.s.sol +++ b/script/phase-0-alpha/01-FarmingDeploy.s.sol @@ -25,8 +25,8 @@ import { VestedRewardsDistributionDeployParams } from "../dependencies/VestedRewardsDistributionDeploy.sol"; -contract Phase0Alpha_StakingRewardsDeployScript is Script { - string internal constant NAME = "phase-0-alpha/staking-rewards-deploy"; +contract Phase0Alpha_FarmingDeployScript is Script { + string internal constant NAME = "phase-0-alpha/farming-deploy"; function run() external { Reader reader = new Reader(ScriptTools.loadConfig()); diff --git a/script/phase-0-alpha/02-StakingRewardsInit.s.sol b/script/phase-0-alpha/02-FarmingInit.s.sol similarity index 95% rename from script/phase-0-alpha/02-StakingRewardsInit.s.sol rename to script/phase-0-alpha/02-FarmingInit.s.sol index 7ff7911..83a299d 100644 --- a/script/phase-0-alpha/02-StakingRewardsInit.s.sol +++ b/script/phase-0-alpha/02-FarmingInit.s.sol @@ -21,8 +21,8 @@ import {ScriptTools} from "dss-test/ScriptTools.sol"; import {Reader} from "../helpers/Reader.sol"; import {FarmingInit, FarmingInitParams} from "../dependencies/phase-0-alpha/FarmingInit.sol"; -contract Phase0Alpha_StakingRewardsInitScript is Script { - string internal constant NAME = "phase-0-alpha/staking-rewards-init"; +contract Phase0Alpha_FarmingInitScript is Script { + string internal constant NAME = "phase-0-alpha/farming-init"; function run() external { Reader deps = new Reader(ScriptTools.loadDependencies()); diff --git a/script/phase-0-alpha/09-CheckStakingRewardsDeployment.s.sol b/script/phase-0-alpha/03-FarmingCheck.s.sol similarity index 98% rename from script/phase-0-alpha/09-CheckStakingRewardsDeployment.s.sol rename to script/phase-0-alpha/03-FarmingCheck.s.sol index ccd0300..255e78f 100644 --- a/script/phase-0-alpha/09-CheckStakingRewardsDeployment.s.sol +++ b/script/phase-0-alpha/03-FarmingCheck.s.sol @@ -16,54 +16,9 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; - import {Reader} from "../helpers/Reader.sol"; -interface WardsLike { - function wards(address who) external view returns (uint256); -} - -interface VestedRewardsDistributionLike { - function dssVest() external view returns (address); - - function vestId() external view returns (uint256); - - function stakingRewards() external view returns (address); - - function gem() external view returns (address); -} - -interface StakingRewardsLike { - function owner() external view returns (address); - - function stakingToken() external view returns (address); - - function rewardsToken() external view returns (address); - - function rewardsDistribution() external view returns (address); -} - -interface DssVestWithGemLike { - function gem() external view returns (address); - - function tot(uint256 vestId) external view returns (uint256); - - function bgn(uint256 vestId) external view returns (uint256); - - function clf(uint256 vestId) external view returns (uint256); - - function fin(uint256 vestId) external view returns (uint256); - - function mgr(uint256 vestId) external view returns (address); - - function res(uint256 vestId) external view returns (uint256); - - function usr(uint256 vestId) external view returns (address); - - function valid(uint256 _id) external view returns (bool); -} - -contract Phase0Alpha_CheckStakingRewardsDeploymentScript is Script { +contract Phase0Alpha_FarmingCheckScript is Script { function run() external returns (bool) { Reader deps = new Reader(""); deps.loadDependenciesOrConfig(); @@ -109,3 +64,47 @@ contract Phase0Alpha_CheckStakingRewardsDeploymentScript is Script { return true; } } + +interface WardsLike { + function wards(address who) external view returns (uint256); +} + +interface VestedRewardsDistributionLike { + function dssVest() external view returns (address); + + function vestId() external view returns (uint256); + + function stakingRewards() external view returns (address); + + function gem() external view returns (address); +} + +interface StakingRewardsLike { + function owner() external view returns (address); + + function stakingToken() external view returns (address); + + function rewardsToken() external view returns (address); + + function rewardsDistribution() external view returns (address); +} + +interface DssVestWithGemLike { + function gem() external view returns (address); + + function tot(uint256 vestId) external view returns (uint256); + + function bgn(uint256 vestId) external view returns (uint256); + + function clf(uint256 vestId) external view returns (uint256); + + function fin(uint256 vestId) external view returns (uint256); + + function mgr(uint256 vestId) external view returns (address); + + function res(uint256 vestId) external view returns (uint256); + + function usr(uint256 vestId) external view returns (address); + + function valid(uint256 _id) external view returns (bool); +} diff --git a/script/phase-0/01-StakingRewardsDeploy.s.sol b/script/phase-0/01-FarmingDeploy.s.sol similarity index 87% rename from script/phase-0/01-StakingRewardsDeploy.s.sol rename to script/phase-0/01-FarmingDeploy.s.sol index 1c7b4c0..6f4cd50 100644 --- a/script/phase-0/01-StakingRewardsDeploy.s.sol +++ b/script/phase-0/01-FarmingDeploy.s.sol @@ -29,8 +29,8 @@ interface ChangelogLike { function getAddress(bytes32 _key) external view returns (address addr); } -contract Phase0_StakingRewardsDeployScript is Script { - string internal constant NAME = "phase-0/staking-rewards-deploy"; +contract Phase0_FarmingDeployScript is Script { + string internal constant NAME = "phase-0/farming-deploy"; function run() external { Reader reader = new Reader(ScriptTools.loadConfig()); @@ -40,17 +40,12 @@ contract Phase0_StakingRewardsDeployScript is Script { address ngt = reader.envOrReadAddress(".ngt", "FOUNDRY_NGT"); address nst = reader.envOrReadAddress(".nst", "FOUNDRY_NST"); + address vest = reader.envOrReadAddress(".vest", "FOUNDRY_VEST"); address dist = reader.readAddressOptional(".dist"); address farm = reader.readAddressOptional(".farm"); - address vest = reader.readAddressOptional(".vest"); vm.startBroadcast(); - if (vest == address(0)) { - vest = deployCode("DssVest.sol:DssVestMintable", abi.encode(ngt)); - ScriptTools.switchOwner(vest, msg.sender, admin); - } - if (farm == address(0)) { farm = StakingRewardsDeploy.deploy( StakingRewardsDeployParams({owner: admin, stakingToken: nst, rewardsToken: ngt}) From 1dc0f963a3169e8a842d099a640ff4edff70a562 Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:37:07 -0300 Subject: [PATCH 06/16] fix: bad sanity check on phase-0/FarmingInit library --- script/dependencies/phase-0/FarmingInit.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/dependencies/phase-0/FarmingInit.sol b/script/dependencies/phase-0/FarmingInit.sol index 0561aaa..58645a6 100644 --- a/script/dependencies/phase-0/FarmingInit.sol +++ b/script/dependencies/phase-0/FarmingInit.sol @@ -50,7 +50,7 @@ library FarmingInit { ); // Check if minting rights on `ngt` were granted to `vest`. - require(WardsLike(p.ngt).wards(p.vest), "FarmingInit/missing-ngt-rely-vest"); + require(WardsLike(p.ngt).wards(p.vest) == 1, "FarmingInit/missing-ngt-rely-vest"); // Set `dist` with `rewardsDistribution` role in `farm`. StakingRewardsInit.init(p.farm, StakingRewardsInitParams({dist: p.dist})); From 8963b19944fedb6c15ab56eb76b548129a163961 Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:43:41 -0300 Subject: [PATCH 07/16] refactor: change internal name for `StakingRewards` instances --- script/dependencies/StakingRewardsDeploy.sol | 4 +- script/dependencies/StakingRewardsInit.sol | 12 +- .../VestedRewardsDistributionDeploy.sol | 4 +- .../phase-0-alpha/FarmingInit.sol | 14 +- script/dependencies/phase-0/FarmingInit.sol | 14 +- .../1/phase-0/template-farming-deploy.json | 2 +- .../phase-0-alpha/template-farming-check.json | 2 +- .../template-farming-deploy.json | 2 +- .../5/phase-0/template-farming-deploy.json | 2 +- script/phase-0-alpha/01-FarmingDeploy.s.sol | 15 +- script/phase-0-alpha/02-FarmingInit.s.sol | 6 +- script/phase-0-alpha/03-FarmingCheck.s.sol | 15 +- script/phase-0/01-FarmingDeploy.s.sol | 15 +- src/VestedRewardsDistribution.t.sol | 40 ++-- src/synthetix/StakingRewards.t.sol | 188 +++++++++--------- 15 files changed, 176 insertions(+), 159 deletions(-) diff --git a/script/dependencies/StakingRewardsDeploy.sol b/script/dependencies/StakingRewardsDeploy.sol index 9e8c605..9317b62 100644 --- a/script/dependencies/StakingRewardsDeploy.sol +++ b/script/dependencies/StakingRewardsDeploy.sol @@ -24,7 +24,7 @@ struct StakingRewardsDeployParams { } library StakingRewardsDeploy { - function deploy(StakingRewardsDeployParams memory p) internal returns (address farm) { - farm = address(new StakingRewards(p.owner, address(0), p.rewardsToken, p.stakingToken)); + function deploy(StakingRewardsDeployParams memory p) internal returns (address rewards) { + rewards = address(new StakingRewards(p.owner, address(0), p.rewardsToken, p.stakingToken)); } } diff --git a/script/dependencies/StakingRewardsInit.sol b/script/dependencies/StakingRewardsInit.sol index b68ccda..290c8d1 100644 --- a/script/dependencies/StakingRewardsInit.sol +++ b/script/dependencies/StakingRewardsInit.sol @@ -24,18 +24,18 @@ struct StakingRewardsNominateNewOwnerParams { } library StakingRewardsInit { - function init(address farm, StakingRewardsInitParams memory p) internal { - StakingRewardsLike(farm).setRewardsDistribution(p.dist); + function init(address rewards, StakingRewardsInitParams memory p) internal { + StakingRewardsLike(rewards).setRewardsDistribution(p.dist); } /// @dev `StakingRewards` ownership transfer is a 2-step process: nominate + acceptance. - function nominateNewOwner(address farm, StakingRewardsNominateNewOwnerParams memory p) internal { - StakingRewardsLike(farm).nominateNewOwner(p.newOwner); + function nominateNewOwner(address rewards, StakingRewardsNominateNewOwnerParams memory p) internal { + StakingRewardsLike(rewards).nominateNewOwner(p.newOwner); } /// @dev `StakingRewards` ownership transfer requires the new owner to explicitly accept it. - function acceptOwnership(address farm) internal { - StakingRewardsLike(farm).acceptOwnership(); + function acceptOwnership(address rewards) internal { + StakingRewardsLike(rewards).acceptOwnership(); } } diff --git a/script/dependencies/VestedRewardsDistributionDeploy.sol b/script/dependencies/VestedRewardsDistributionDeploy.sol index 8a69ba4..e62267b 100644 --- a/script/dependencies/VestedRewardsDistributionDeploy.sol +++ b/script/dependencies/VestedRewardsDistributionDeploy.sol @@ -22,12 +22,12 @@ struct VestedRewardsDistributionDeployParams { address deployer; address owner; address vest; - address farm; + address rewards; } library VestedRewardsDistributionDeploy { function deploy(VestedRewardsDistributionDeployParams memory p) internal returns (address dist) { - dist = address(new VestedRewardsDistribution(p.vest, p.farm)); + dist = address(new VestedRewardsDistribution(p.vest, p.rewards)); ScriptTools.switchOwner(dist, p.deployer, p.owner); } diff --git a/script/dependencies/phase-0-alpha/FarmingInit.sol b/script/dependencies/phase-0-alpha/FarmingInit.sol index 252f27e..f515752 100644 --- a/script/dependencies/phase-0-alpha/FarmingInit.sol +++ b/script/dependencies/phase-0-alpha/FarmingInit.sol @@ -22,7 +22,7 @@ import {VestInit, VestInitParams, VestCreateParams} from "../VestInit.sol"; struct FarmingInitParams { address nst; address ngt; - address farm; + address rewards; address dist; address vest; uint256 vestCap; @@ -39,14 +39,14 @@ library FarmingInit { function init(FarmingInitParams memory p) internal returns (FarmingInitResult memory r) { require(DssVestWithGemLike(p.vest).gem() == p.ngt, "FarmingInit/vest-gem-mismatch"); - require(StakingRewardsLike(p.farm).rewardsToken() == p.ngt, "FarmingInit/farm-rewards-token-mismatch"); - require(StakingRewardsLike(p.farm).stakingToken() == p.nst, "FarmingInit/farm-staking-token-mismatch"); - require(StakingRewardsLike(p.farm).lastUpdateTime() == 0, "FarmingInit/farm-last-update-time-invalid"); + require(StakingRewardsLike(p.rewards).rewardsToken() == p.ngt, "FarmingInit/rewards-rewards-token-mismatch"); + require(StakingRewardsLike(p.rewards).stakingToken() == p.nst, "FarmingInit/rewards-staking-token-mismatch"); + require(StakingRewardsLike(p.rewards).lastUpdateTime() == 0, "FarmingInit/rewards-last-update-time-invalid"); require(VestedRewardsDistributionLike(p.dist).gem() == p.ngt, "FarmingInit/dist-gem-mismatch"); require(VestedRewardsDistributionLike(p.dist).dssVest() == p.vest, "FarmingInit/dist-dss-vest-mismatch"); require( - VestedRewardsDistributionLike(p.dist).stakingRewards() == p.farm, + VestedRewardsDistributionLike(p.dist).stakingRewards() == p.rewards, "FarmingInit/dist-staking-rewards-mismatch" ); @@ -56,8 +56,8 @@ library FarmingInit { // Define global max vesting ratio on `vest`. VestInit.init(p.vest, VestInitParams({cap: p.vestCap})); - // Set `dist` with `rewardsDistribution` role in `farm`. - StakingRewardsInit.init(p.farm, StakingRewardsInitParams({dist: p.dist})); + // Set `dist` with `rewardsDistribution` role in `rewards`. + StakingRewardsInit.init(p.rewards, StakingRewardsInitParams({dist: p.dist})); // Create the proper vesting stream for rewards distribution. uint256 vestId = VestInit.create( diff --git a/script/dependencies/phase-0/FarmingInit.sol b/script/dependencies/phase-0/FarmingInit.sol index 58645a6..2482397 100644 --- a/script/dependencies/phase-0/FarmingInit.sol +++ b/script/dependencies/phase-0/FarmingInit.sol @@ -22,7 +22,7 @@ import {VestInit, VestCreateParams} from "../VestInit.sol"; struct FarmingInitParams { address nst; address ngt; - address farm; + address rewards; address dist; address vest; uint256 vestTot; @@ -38,22 +38,22 @@ library FarmingInit { function init(FarmingInitParams memory p) internal returns (FarmingInitResult memory r) { require(DssVestWithGemLike(p.vest).gem() == p.ngt, "FarmingInit/vest-gem-mismatch"); - require(StakingRewardsLike(p.farm).rewardsToken() == p.ngt, "FarmingInit/farm-rewards-token-mismatch"); - require(StakingRewardsLike(p.farm).stakingToken() == p.nst, "FarmingInit/farm-staking-token-mismatch"); - require(StakingRewardsLike(p.farm).lastUpdateTime() == 0, "FarmingInit/farm-last-update-time-invalid"); + require(StakingRewardsLike(p.rewards).rewardsToken() == p.ngt, "FarmingInit/rewards-rewards-token-mismatch"); + require(StakingRewardsLike(p.rewards).stakingToken() == p.nst, "FarmingInit/rewards-staking-token-mismatch"); + require(StakingRewardsLike(p.rewards).lastUpdateTime() == 0, "FarmingInit/rewards-last-update-time-invalid"); require(VestedRewardsDistributionLike(p.dist).gem() == p.ngt, "FarmingInit/dist-gem-mismatch"); require(VestedRewardsDistributionLike(p.dist).dssVest() == p.vest, "FarmingInit/dist-dss-vest-mismatch"); require( - VestedRewardsDistributionLike(p.dist).stakingRewards() == p.farm, + VestedRewardsDistributionLike(p.dist).stakingRewards() == p.rewards, "FarmingInit/dist-staking-rewards-mismatch" ); // Check if minting rights on `ngt` were granted to `vest`. require(WardsLike(p.ngt).wards(p.vest) == 1, "FarmingInit/missing-ngt-rely-vest"); - // Set `dist` with `rewardsDistribution` role in `farm`. - StakingRewardsInit.init(p.farm, StakingRewardsInitParams({dist: p.dist})); + // Set `dist` with `rewardsDistribution` role in `rewards`. + StakingRewardsInit.init(p.rewards, StakingRewardsInitParams({dist: p.dist})); // Create the proper vesting stream for rewards distribution. uint256 vestId = VestInit.create( diff --git a/script/input/1/phase-0/template-farming-deploy.json b/script/input/1/phase-0/template-farming-deploy.json index e542009..292e86f 100644 --- a/script/input/1/phase-0/template-farming-deploy.json +++ b/script/input/1/phase-0/template-farming-deploy.json @@ -3,6 +3,6 @@ "ngt": "address", "nst": "address", "dist": "address", - "farm": "address", + "rewards": "address", "vest": "address" } diff --git a/script/input/5/phase-0-alpha/template-farming-check.json b/script/input/5/phase-0-alpha/template-farming-check.json index 1ccda8e..bc76afd 100644 --- a/script/input/5/phase-0-alpha/template-farming-check.json +++ b/script/input/5/phase-0-alpha/template-farming-check.json @@ -3,7 +3,7 @@ "ngt": "address", "nst": "address", "dist": "address", - "farm": "address", + "rewards": "address", "vest": "address", "vestId": "uint256", "vestTot": "uint256: total amount of the vesting stream", diff --git a/script/input/5/phase-0-alpha/template-farming-deploy.json b/script/input/5/phase-0-alpha/template-farming-deploy.json index df73510..47cc195 100644 --- a/script/input/5/phase-0-alpha/template-farming-deploy.json +++ b/script/input/5/phase-0-alpha/template-farming-deploy.json @@ -3,6 +3,6 @@ "ngt": "address", "nst": "address", "dist": "address", - "farm": "address", + "rewards": "address", "vest": "address" } diff --git a/script/input/5/phase-0/template-farming-deploy.json b/script/input/5/phase-0/template-farming-deploy.json index e542009..292e86f 100644 --- a/script/input/5/phase-0/template-farming-deploy.json +++ b/script/input/5/phase-0/template-farming-deploy.json @@ -3,6 +3,6 @@ "ngt": "address", "nst": "address", "dist": "address", - "farm": "address", + "rewards": "address", "vest": "address" } diff --git a/script/phase-0-alpha/01-FarmingDeploy.s.sol b/script/phase-0-alpha/01-FarmingDeploy.s.sol index eecca10..4b0267c 100644 --- a/script/phase-0-alpha/01-FarmingDeploy.s.sol +++ b/script/phase-0-alpha/01-FarmingDeploy.s.sol @@ -35,7 +35,7 @@ contract Phase0Alpha_FarmingDeployScript is Script { address ngt = reader.envOrReadAddress(".ngt", "FOUNDRY_NGT"); address nst = reader.envOrReadAddress(".nst", "FOUNDRY_NST"); address dist = reader.readAddressOptional(".dist"); - address farm = reader.readAddressOptional(".farm"); + address rewards = reader.readAddressOptional(".rewards"); address vest = reader.readAddressOptional(".vest"); vm.startBroadcast(); @@ -45,15 +45,20 @@ contract Phase0Alpha_FarmingDeployScript is Script { ScriptTools.switchOwner(vest, msg.sender, admin); } - if (farm == address(0)) { - farm = StakingRewardsDeploy.deploy( + if (rewards == address(0)) { + rewards = StakingRewardsDeploy.deploy( StakingRewardsDeployParams({owner: admin, stakingToken: nst, rewardsToken: ngt}) ); } if (dist == address(0)) { dist = VestedRewardsDistributionDeploy.deploy( - VestedRewardsDistributionDeployParams({deployer: msg.sender, owner: admin, vest: vest, farm: farm}) + VestedRewardsDistributionDeployParams({ + deployer: msg.sender, + owner: admin, + vest: vest, + rewards: rewards + }) ); } @@ -63,7 +68,7 @@ contract Phase0Alpha_FarmingDeployScript is Script { ScriptTools.exportContract(NAME, "ngt", ngt); ScriptTools.exportContract(NAME, "nst", nst); ScriptTools.exportContract(NAME, "dist", dist); - ScriptTools.exportContract(NAME, "farm", farm); + ScriptTools.exportContract(NAME, "rewards", rewards); ScriptTools.exportContract(NAME, "vest", vest); } } diff --git a/script/phase-0-alpha/02-FarmingInit.s.sol b/script/phase-0-alpha/02-FarmingInit.s.sol index 83a299d..baa09bb 100644 --- a/script/phase-0-alpha/02-FarmingInit.s.sol +++ b/script/phase-0-alpha/02-FarmingInit.s.sol @@ -30,7 +30,7 @@ contract Phase0Alpha_FarmingInitScript is Script { address ngt = deps.envOrReadAddress(".ngt", "FOUNDRY_NGT"); address nst = deps.envOrReadAddress(".nst", "FOUNDRY_NST"); address dist = deps.envOrReadAddress(".dist", "FOUNDRY_DIST"); - address farm = deps.envOrReadAddress(".farm", "FOUNDRY_FARM"); + address rewards = deps.envOrReadAddress(".rewards", "FOUNDRY_FARM"); address vest = deps.envOrReadAddress(".vest", "FOUNDRY_VEST"); Reader config = new Reader(ScriptTools.loadConfig()); @@ -48,7 +48,7 @@ contract Phase0Alpha_FarmingInitScript is Script { ngt: ngt, nst: nst, dist: dist, - farm: farm, + rewards: rewards, vest: vest, vestCap: vestCap, vestTot: vestTot, @@ -62,7 +62,7 @@ contract Phase0Alpha_FarmingInitScript is Script { ScriptTools.exportContract(NAME, "ngt", ngt); ScriptTools.exportContract(NAME, "dist", dist); - ScriptTools.exportContract(NAME, "farm", farm); + ScriptTools.exportContract(NAME, "rewards", rewards); ScriptTools.exportContract(NAME, "vest", vest); ScriptTools.exportContract(NAME, "vestId", address(uint160(vestId))); ScriptTools.exportContract(NAME, "vestTot", address(uint160(vestTot))); diff --git a/script/phase-0-alpha/03-FarmingCheck.s.sol b/script/phase-0-alpha/03-FarmingCheck.s.sol index 255e78f..a033063 100644 --- a/script/phase-0-alpha/03-FarmingCheck.s.sol +++ b/script/phase-0-alpha/03-FarmingCheck.s.sol @@ -27,7 +27,7 @@ contract Phase0Alpha_FarmingCheckScript is Script { address ngt = deps.envOrReadAddress(".ngt", "FOUNDRY_NGT"); address nst = deps.envOrReadAddress(".nst", "FOUNDRY_NST"); address dist = deps.readAddress(".dist"); - address farm = deps.readAddress(".farm"); + address rewards = deps.readAddress(".rewards"); address vest = deps.readAddress(".vest"); uint256 vestId = deps.readUint(".vestId"); uint256 vestTot = deps.readUint(".vestTot"); @@ -39,14 +39,17 @@ contract Phase0Alpha_FarmingCheckScript is Script { require(VestedRewardsDistributionLike(dist).vestId() == vestId, "VestedRewardsDistribution/invalid-vest-id"); require(VestedRewardsDistributionLike(dist).gem() == ngt, "VestedRewardsDistribution/invalid-gem"); require( - VestedRewardsDistributionLike(dist).stakingRewards() == farm, + VestedRewardsDistributionLike(dist).stakingRewards() == rewards, "VestedRewardsDistribution/invalid-staking-rewards" ); - require(StakingRewardsLike(farm).owner() == admin, "StakingRewards/pause-proxy-not-owner"); - require(StakingRewardsLike(farm).rewardsToken() == ngt, "StakingRewards/invalid-rewards-token"); - require(StakingRewardsLike(farm).stakingToken() == nst, "StakingRewards/invalid-rewards-token"); - require(StakingRewardsLike(farm).rewardsDistribution() == dist, "StakingRewards/invalid-rewards-distribution"); + require(StakingRewardsLike(rewards).owner() == admin, "StakingRewards/pause-proxy-not-owner"); + require(StakingRewardsLike(rewards).rewardsToken() == ngt, "StakingRewards/invalid-rewards-token"); + require(StakingRewardsLike(rewards).stakingToken() == nst, "StakingRewards/invalid-rewards-token"); + require( + StakingRewardsLike(rewards).rewardsDistribution() == dist, + "StakingRewards/invalid-rewards-distribution" + ); require(WardsLike(ngt).wards(vest) == 1, "Ngt/dss-vest-not-ward"); diff --git a/script/phase-0/01-FarmingDeploy.s.sol b/script/phase-0/01-FarmingDeploy.s.sol index 6f4cd50..5e0ab33 100644 --- a/script/phase-0/01-FarmingDeploy.s.sol +++ b/script/phase-0/01-FarmingDeploy.s.sol @@ -42,19 +42,24 @@ contract Phase0_FarmingDeployScript is Script { address nst = reader.envOrReadAddress(".nst", "FOUNDRY_NST"); address vest = reader.envOrReadAddress(".vest", "FOUNDRY_VEST"); address dist = reader.readAddressOptional(".dist"); - address farm = reader.readAddressOptional(".farm"); + address rewards = reader.readAddressOptional(".rewards"); vm.startBroadcast(); - if (farm == address(0)) { - farm = StakingRewardsDeploy.deploy( + if (rewards == address(0)) { + rewards = StakingRewardsDeploy.deploy( StakingRewardsDeployParams({owner: admin, stakingToken: nst, rewardsToken: ngt}) ); } if (dist == address(0)) { dist = VestedRewardsDistributionDeploy.deploy( - VestedRewardsDistributionDeployParams({deployer: msg.sender, owner: admin, vest: vest, farm: farm}) + VestedRewardsDistributionDeployParams({ + deployer: msg.sender, + owner: admin, + vest: vest, + rewards: rewards + }) ); } @@ -64,7 +69,7 @@ contract Phase0_FarmingDeployScript is Script { ScriptTools.exportContract(NAME, "ngt", ngt); ScriptTools.exportContract(NAME, "nst", nst); ScriptTools.exportContract(NAME, "dist", dist); - ScriptTools.exportContract(NAME, "farm", farm); + ScriptTools.exportContract(NAME, "rewards", rewards); ScriptTools.exportContract(NAME, "vest", vest); } } diff --git a/src/VestedRewardsDistribution.t.sol b/src/VestedRewardsDistribution.t.sol index 4ba65e9..99f6c91 100644 --- a/src/VestedRewardsDistribution.t.sol +++ b/src/VestedRewardsDistribution.t.sol @@ -37,7 +37,7 @@ contract VestedRewardsDistributionTest is DssTest { struct DistributionParams { VestedRewardsDistribution dist; DssVestWithGemLike vest; - IStakingRewards farm; + IStakingRewards rewards; IERC20Mintable rewardsToken; uint256 vestId; VestParams vestParams; @@ -61,7 +61,7 @@ contract VestedRewardsDistributionTest is DssTest { DistributionParams({ dist: VestedRewardsDistribution(address(0)), vest: DssVestWithGemLike(address(0)), - farm: IStakingRewards(address(0)), + rewards: IStakingRewards(address(0)), rewardsToken: IERC20Mintable(address(new SDAO("K Token", "K"))), vestId: 0, vestParams: _makeVestParams() @@ -73,13 +73,17 @@ contract VestedRewardsDistributionTest is DssTest { // 1st distribution skip(k.vestParams.tau / 3); - assertEq(k.rewardsToken.balanceOf(address(k.farm)), 0, "Bad initial balance"); + assertEq(k.rewardsToken.balanceOf(address(k.rewards)), 0, "Bad initial balance"); vm.expectEmit(false, false, false, true, address(k.dist)); emit Distribute(k.vestParams.tot / 3); k.dist.distribute(); - assertEq(k.rewardsToken.balanceOf(address(k.farm)), k.vestParams.tot / 3, "Bad balance after 1st distribution"); + assertEq( + k.rewardsToken.balanceOf(address(k.rewards)), + k.vestParams.tot / 3, + "Bad balance after 1st distribution" + ); // 2nd distribution skip(k.vestParams.tau / 3); @@ -92,7 +96,7 @@ contract VestedRewardsDistributionTest is DssTest { uint256 tolerance = 0.0001e18; assertApproxEqRel( - k.rewardsToken.balanceOf(address(k.farm)), + k.rewardsToken.balanceOf(address(k.rewards)), (2 * k.vestParams.tot) / 3, tolerance, "Bad balance after 2nd distribution" @@ -106,7 +110,7 @@ contract VestedRewardsDistributionTest is DssTest { k.dist.distribute(); assertApproxEqRel( - k.rewardsToken.balanceOf(address(k.farm)), + k.rewardsToken.balanceOf(address(k.rewards)), k.vestParams.tot, tolerance, "Bad balance after 3rd distribution" @@ -124,7 +128,7 @@ contract VestedRewardsDistributionTest is DssTest { for (uint256 i = 0; i < totalDistributions; i++) { skip(timeSkip); k.dist.distribute(); - balances[i] = k.rewardsToken.balanceOf(address(k.farm)); + balances[i] = k.rewardsToken.balanceOf(address(k.rewards)); } uint256[] memory deltas = new uint256[](totalDistributions - 1); @@ -145,7 +149,7 @@ contract VestedRewardsDistributionTest is DssTest { ); } - assertApproxEqRel(k.rewardsToken.balanceOf(address(k.farm)), k.vestParams.tot, tolerance); + assertApproxEqRel(k.rewardsToken.balanceOf(address(k.rewards)), k.vestParams.tot, tolerance); skip(365 days); // Check if the amount undistributed is less than 0.001% of the total @@ -212,13 +216,13 @@ contract VestedRewardsDistributionTest is DssTest { // 1st vest skip(k.vestParams.tau); - assertEq(k.rewardsToken.balanceOf(address(k.farm)), 0, "Bad initial balance"); + assertEq(k.rewardsToken.balanceOf(address(k.rewards)), 0, "Bad initial balance"); vm.expectEmit(false, false, false, true, address(k.dist)); emit Distribute(k.vestParams.tot); k.dist.distribute(); - assertEq(k.rewardsToken.balanceOf(address(k.farm)), k.vestParams.tot, "Bad balance after 1st distribution"); + assertEq(k.rewardsToken.balanceOf(address(k.rewards)), k.vestParams.tot, "Bad balance after 1st distribution"); // 2nd vest @@ -241,7 +245,7 @@ contract VestedRewardsDistributionTest is DssTest { k.dist.distribute(); assertEq( - k.rewardsToken.balanceOf(address(k.farm)), + k.rewardsToken.balanceOf(address(k.rewards)), k.vestParams.tot + vestParams2.tot, "Bad balance after 2nd distribution" ); @@ -276,7 +280,7 @@ contract VestedRewardsDistributionTest is DssTest { k.dist.distribute(); assertEq( - k.rewardsToken.balanceOf(address(k.farm)), + k.rewardsToken.balanceOf(address(k.rewards)), k.vestParams.tot + vestParams2.tot + vestParams3.tot, "Bad balance after 3rd distribution" ); @@ -288,12 +292,12 @@ contract VestedRewardsDistributionTest is DssTest { skip(k.vestParams.tau / 3); - assertEq(k.rewardsToken.balanceOf(address(k.farm)), 0, "Bad initial balance"); + assertEq(k.rewardsToken.balanceOf(address(k.rewards)), 0, "Bad initial balance"); uint256 amount = k.dist.distribute(); assertLt(amount, 1_000_000_000 * WAD, "Dangling tokens distributed"); - assertEq(k.rewardsToken.balanceOf(address(k.farm)), amount, "Bad final balance"); + assertEq(k.rewardsToken.balanceOf(address(k.rewards)), amount, "Bad final balance"); } function testRevertWithReasonWhenDistributeBeforeCliffRegression() public { @@ -348,15 +352,15 @@ contract VestedRewardsDistributionTest is DssTest { result.vest.file("cap", type(uint256).max); } - if (address(result.farm) == address(0)) { - result.farm = new StakingRewards(address(this), address(0), address(result.rewardsToken), address(0)); + if (address(result.rewards) == address(0)) { + result.rewards = new StakingRewards(address(this), address(0), address(result.rewardsToken), address(0)); } if (address(result.dist) == address(0)) { - result.dist = new VestedRewardsDistribution(address(result.vest), address(result.farm)); + result.dist = new VestedRewardsDistribution(address(result.vest), address(result.rewards)); } - result.farm.setRewardsDistribution(address(result.dist)); + result.rewards.setRewardsDistribution(address(result.dist)); _distParams.vestParams.usr = address(result.dist); (result.vestId, result.vestParams) = _setUpVest(result.vest, _distParams.vestParams); diff --git a/src/synthetix/StakingRewards.t.sol b/src/synthetix/StakingRewards.t.sol index 64e877a..5e2f9ca 100644 --- a/src/synthetix/StakingRewards.t.sol +++ b/src/synthetix/StakingRewards.t.sol @@ -25,24 +25,24 @@ contract StakingRewardsTest is Test { TestToken rewardGem; TestToken gem; - StakingRewards farm; + StakingRewards rewards; function setupReward(uint256 amt) internal { rewardGem.mint(amt); - rewardGem.transfer(address(farm), amt); - farm.notifyRewardAmount(amt); + rewardGem.transfer(address(rewards), amt); + rewards.notifyRewardAmount(amt); } function setupStakingToken(uint256 amt) internal { gem.mint(amt); - gem.approve(address(farm), amt); + gem.approve(address(rewards), amt); } function setUp() public { rewardGem = new TestToken("SubDaoT", 18); gem = new TestToken("MKR", 18); - farm = new StakingRewards(address(this), address(this), address(rewardGem), address(gem)); + rewards = new StakingRewards(address(this), address(this), address(rewardGem), address(gem)); } function testConstructor() public { @@ -54,105 +54,105 @@ contract StakingRewardsTest is Test { } function testSetRewardsDistribution() public { - farm.setRewardsDistribution(address(0)); - assertEq(farm.rewardsDistribution(), address(0)); + rewards.setRewardsDistribution(address(0)); + assertEq(rewards.rewardsDistribution(), address(0)); } function testSetRewardsDistributionEvent() public { - vm.expectEmit(false, false, false, true, address(farm)); + vm.expectEmit(false, false, false, true, address(rewards)); emit RewardsDistributionUpdated(address(0)); - farm.setRewardsDistribution(address(0)); + rewards.setRewardsDistribution(address(0)); } function testRevertOnUnauthorizedMethods() public { vm.startPrank(address(0)); vm.expectRevert("Only the contract owner may perform this action"); - farm.setRewardsDistribution(address(0)); + rewards.setRewardsDistribution(address(0)); vm.expectRevert("Only the contract owner may perform this action"); - farm.setRewardsDuration(1 days); + rewards.setRewardsDuration(1 days); vm.expectRevert("Only the contract owner may perform this action"); - farm.setPaused(true); + rewards.setPaused(true); vm.expectRevert("Only the contract owner may perform this action"); - farm.recoverERC20(address(0), 1); + rewards.recoverERC20(address(0), 1); vm.expectRevert("Caller is not RewardsDistribution contract"); - farm.notifyRewardAmount(1); + rewards.notifyRewardAmount(1); } function testRevertStakeWhenPaused() public { - farm.setPaused(true); + rewards.setPaused(true); vm.expectRevert("This action cannot be performed while the contract is paused"); - farm.stake(1); + rewards.stake(1); } function testPauseUnpause() public { - farm.setPaused(true); + rewards.setPaused(true); vm.expectRevert("This action cannot be performed while the contract is paused"); - farm.stake(1); + rewards.stake(1); - farm.setPaused(false); + rewards.setPaused(false); setupStakingToken(1); - farm.stake(1); + rewards.stake(1); } function testRevertOnRecoverStakingToken() public { vm.expectRevert("Cannot withdraw the staking token"); - farm.recoverERC20(address(gem), 1); + rewards.recoverERC20(address(gem), 1); } function testRecoverERC20() public { TestToken t = new TestToken("TT", 18); t.mint(10); - t.transfer(address(farm), 10); + t.transfer(address(rewards), 10); - assertEq(t.balanceOf(address(farm)), 10); + assertEq(t.balanceOf(address(rewards)), 10); vm.expectEmit(true, true, true, true); emit Recovered(address(t), 10); - farm.recoverERC20(address(t), 10); + rewards.recoverERC20(address(t), 10); - assertEq(t.balanceOf(address(farm)), 0); + assertEq(t.balanceOf(address(rewards)), 0); assertEq(t.balanceOf(address(this)), 10); } function testLastTimeRewardApplicable() public { - assertEq(farm.lastTimeRewardApplicable(), 0); + assertEq(rewards.lastTimeRewardApplicable(), 0); setupReward(10 * WAD); - assertEq(farm.lastTimeRewardApplicable(), block.timestamp); + assertEq(rewards.lastTimeRewardApplicable(), block.timestamp); } function testRewardPerToken() public { - assertEq(farm.rewardPerToken(), 0); + assertEq(rewards.rewardPerToken(), 0); setupStakingToken(100 * WAD); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); - assertEq(farm.totalSupply(), 100 * WAD); + assertEq(rewards.totalSupply(), 100 * WAD); setupReward(5000 * WAD); skip(1 days); - assert(farm.rewardPerToken() > 0); + assert(rewards.rewardPerToken() > 0); } function testStakeEmitEvent() public { setupStakingToken(100 * WAD); - vm.expectEmit(false, false, false, true, address(farm)); + vm.expectEmit(false, false, false, true, address(rewards)); emit Staked(address(this), 100 * WAD); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); } function testStakeWithReferralEmitEvent() public { @@ -165,7 +165,7 @@ contract StakingRewardsTest is Test { vm.expectEmit(true, false, false, false); emit Referral(1, address(this), 100 * WAD); - farm.stake(100 * WAD, referralCode); + rewards.stake(100 * WAD, referralCode); } function testStaking() public { @@ -173,133 +173,133 @@ contract StakingRewardsTest is Test { uint256 gemBalance = gem.balanceOf(address(this)); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); - assertEq(farm.balanceOf(address(this)), 100 * WAD); + assertEq(rewards.balanceOf(address(this)), 100 * WAD); assertEq(gem.balanceOf(address(this)), gemBalance - 100 * WAD); - assertEq(gem.balanceOf(address(farm)), 100 * WAD); + assertEq(gem.balanceOf(address(rewards)), 100 * WAD); } function testRevertOnZeroStake() public { vm.expectRevert("Cannot stake 0"); - farm.stake(0); + rewards.stake(0); } function testEarned() public { - assertEq(farm.earned(address(this)), 0); + assertEq(rewards.earned(address(this)), 0); setupStakingToken(100 * WAD); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); setupReward(5000 * WAD); skip(1 days); - assert(farm.earned(address(this)) > 0); + assert(rewards.earned(address(this)) > 0); } function testRewardRateIncreaseOnNewRewardBeforeDurationEnd() public { setupReward(5000 * WAD); - uint256 rewardRate = farm.rewardRate(); + uint256 rewardRate = rewards.rewardRate(); setupReward(5000 * WAD); assert(rewardRate > 0); - assert(farm.rewardRate() > rewardRate); + assert(rewards.rewardRate() > rewardRate); } function earnedShouldIncreaseAfterDuration() public { setupStakingToken(100 * WAD); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); setupStakingToken(5000 * WAD); skip(7 days); - uint256 earned = farm.earned(address(this)); + uint256 earned = rewards.earned(address(this)); setupStakingToken(5000 * WAD); skip(7 days); - assertEq(farm.earned(address(this)), earned + earned); + assertEq(rewards.earned(address(this)), earned + earned); } function testGetRewardEvent() public { setupStakingToken(100 * WAD); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); setupReward(5000 * WAD); skip(1 days); vm.expectEmit(true, true, true, true); - emit RewardPaid(address(this), farm.rewardRate() * 1 days); - farm.getReward(); + emit RewardPaid(address(this), rewards.rewardRate() * 1 days); + rewards.getReward(); } function testGetReward() public { setupStakingToken(100 * WAD); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); setupReward(5000 * WAD); skip(1 days); uint256 rewardBalance = rewardGem.balanceOf(address(this)); - uint256 earned = farm.earned(address(this)); + uint256 earned = rewards.earned(address(this)); - farm.getReward(); + rewards.getReward(); - assert(farm.earned(address(this)) < earned); + assert(rewards.earned(address(this)) < earned); assert(rewardGem.balanceOf(address(this)) > rewardBalance); } function testsetRewardsDurationEvent() public { vm.expectEmit(true, true, true, true); emit RewardsDurationUpdated(70 days); - farm.setRewardsDuration(70 days); + rewards.setRewardsDuration(70 days); } function testSetRewardsDurationBeforeDistribution() public { - assertEq(farm.rewardsDuration(), 7 days); + assertEq(rewards.rewardsDuration(), 7 days); - farm.setRewardsDuration(70 days); + rewards.setRewardsDuration(70 days); - assertEq(farm.rewardsDuration(), 70 days); + assertEq(rewards.rewardsDuration(), 70 days); } function testRevertSetRewardsDurationOnActiveDistribution() public { setupStakingToken(100 * WAD); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); setupReward(100 * WAD); skip(1 days); vm.expectRevert("Previous rewards period must be complete before changing the duration for the new period"); - farm.setRewardsDuration(70 days); + rewards.setRewardsDuration(70 days); } function testSetRewardsDurationAfterDistributionPeriod() public { setupStakingToken(100 * WAD); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); setupReward(100 * WAD); skip(8 days); - farm.setRewardsDuration(70 days); - assertEq(farm.rewardsDuration(), 70 days); + rewards.setRewardsDuration(70 days); + assertEq(rewards.rewardsDuration(), 70 days); } function testGetRewardForDuration() public { setupReward(5000 * WAD); - uint256 rewardForDuration = farm.getRewardForDuration(); - uint256 rewardDuration = farm.rewardsDuration(); - uint256 rewardRate = farm.rewardRate(); + uint256 rewardForDuration = rewards.getRewardForDuration(); + uint256 rewardDuration = rewards.rewardsDuration(); + uint256 rewardRate = rewards.rewardRate(); assert(rewardForDuration > 0); assertEq(rewardForDuration, rewardRate * rewardDuration); @@ -307,115 +307,115 @@ contract StakingRewardsTest is Test { function testWithdrawalEvent() public { setupStakingToken(100 * WAD); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); vm.expectEmit(true, true, true, true); emit Withdrawn(address(this), 1 * WAD); - farm.withdraw(1 * WAD); + rewards.withdraw(1 * WAD); } function testFailtIfNothingToWithdraw() public { - farm.withdraw(1); + rewards.withdraw(1); } function testRevertOnZeroWithdraw() public { vm.expectRevert("Cannot withdraw 0"); - farm.withdraw(0); + rewards.withdraw(0); } function testWithdrwal() public { setupStakingToken(100 * WAD); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); - uint256 initialStakeBalance = farm.balanceOf(address(this)); + uint256 initialStakeBalance = rewards.balanceOf(address(this)); - farm.withdraw(100 * WAD); + rewards.withdraw(100 * WAD); - assertEq(initialStakeBalance, farm.balanceOf(address(this)) + 100 * WAD); + assertEq(initialStakeBalance, rewards.balanceOf(address(this)) + 100 * WAD); assertEq(gem.balanceOf(address(this)), 100 * WAD); } function testExit() public { setupStakingToken(100 * WAD); - farm.stake(100 * WAD); + rewards.stake(100 * WAD); setupReward(500 * WAD); skip(1 days); - farm.exit(); + rewards.exit(); - assertEq(farm.earned(address(this)), 0); + assertEq(rewards.earned(address(this)), 0); assertEq(gem.balanceOf(address(this)), 100 * WAD); - assertEq(rewardGem.balanceOf(address(this)), farm.rewardRate() * 1 days); + assertEq(rewardGem.balanceOf(address(this)), rewards.rewardRate() * 1 days); } function testNotifyRewardEvent() public { uint256 amt = 1 * WAD; rewardGem.mint(amt); - rewardGem.transfer(address(farm), amt); + rewardGem.transfer(address(rewards), amt); - vm.expectEmit(false, false, false, true, address(farm)); + vm.expectEmit(false, false, false, true, address(rewards)); emit RewardAdded(amt); - farm.notifyRewardAmount(amt); + rewards.notifyRewardAmount(amt); } function testRevertOnNotBeingRewardDistributor() public { vm.prank(address(0)); vm.expectRevert("Caller is not RewardsDistribution contract"); - farm.notifyRewardAmount(1); + rewards.notifyRewardAmount(1); } function testRevertOnRewardGreaterThenBalance() public { rewardGem.mint(100 * WAD); - rewardGem.transfer(address(farm), 100 * WAD); + rewardGem.transfer(address(rewards), 100 * WAD); vm.expectRevert("Provided reward too high"); - farm.notifyRewardAmount(101 * WAD); + rewards.notifyRewardAmount(101 * WAD); } function testRevertOnRewardGreaterThenBalancePlusRollOverBalance() public { setupReward(100 * WAD); rewardGem.mint(100 * WAD); - rewardGem.transfer(address(farm), 100 * WAD); + rewardGem.transfer(address(rewards), 100 * WAD); vm.expectRevert("Provided reward too high"); - farm.notifyRewardAmount(101 * WAD); + rewards.notifyRewardAmount(101 * WAD); } function testFarm() public { uint256 staked = 100 * WAD; setupStakingToken(staked); - farm.stake(staked); + rewards.stake(staked); setupReward(5000 * WAD); // Period finish should be 7 days from now - assertEq(farm.periodFinish(), block.timestamp + 7 days); + assertEq(rewards.periodFinish(), block.timestamp + 7 days); // Reward duration is 7 days, so we'll // skip by 6 days to prevent expiration skip(6 days); // Make sure we earned in proportion to reward per token - assertEq(farm.earned(address(this)), (farm.rewardPerToken() * staked) / WAD); + assertEq(rewards.earned(address(this)), (rewards.rewardPerToken() * staked) / WAD); // Make sure we get staking token after withdrawal and we still have the same amount earned - farm.withdraw(20 * WAD); + rewards.withdraw(20 * WAD); assertEq(gem.balanceOf(address(this)), 20 * WAD); - assertEq(farm.earned(address(this)), (farm.rewardPerToken() * staked) / WAD); + assertEq(rewards.earned(address(this)), (rewards.rewardPerToken() * staked) / WAD); // Get rewards - farm.getReward(); - assertEq(rewardGem.balanceOf(address(this)), (farm.rewardPerToken() * staked) / WAD); - assertEq(farm.earned(address(this)), 0); + rewards.getReward(); + assertEq(rewardGem.balanceOf(address(this)), (rewards.rewardPerToken() * staked) / WAD); + assertEq(rewards.earned(address(this)), 0); // exit - farm.exit(); + rewards.exit(); assertEq(gem.balanceOf(address(this)), staked); } From d8c0d62bd11003bdf90bfe1d8bcbd49cfaff5cdd Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:12:20 -0300 Subject: [PATCH 08/16] refactor(phase-0-alpha): remove creation of vesting stream `vestId` is expected as an input parameter instead. This makes it easier, since another team deployed the `DssVest` contract for NGT tokens. --- .../phase-0-alpha/FarmingInit.sol | 50 +++++++++---------- .../phase-0-alpha/template-farming-init.json | 5 +- script/phase-0-alpha/01-FarmingDeploy.s.sol | 7 +-- script/phase-0-alpha/02-FarmingInit.s.sol | 26 ++-------- 4 files changed, 31 insertions(+), 57 deletions(-) diff --git a/script/dependencies/phase-0-alpha/FarmingInit.sol b/script/dependencies/phase-0-alpha/FarmingInit.sol index f515752..a9a74fa 100644 --- a/script/dependencies/phase-0-alpha/FarmingInit.sol +++ b/script/dependencies/phase-0-alpha/FarmingInit.sol @@ -17,7 +17,6 @@ pragma solidity ^0.8.0; import {StakingRewardsInit, StakingRewardsInitParams} from "../StakingRewardsInit.sol"; import {VestedRewardsDistributionInit, VestedRewardsDistributionInitParams} from "../VestedRewardsDistributionInit.sol"; -import {VestInit, VestInitParams, VestCreateParams} from "../VestInit.sol"; struct FarmingInitParams { address nst; @@ -25,19 +24,20 @@ struct FarmingInitParams { address rewards; address dist; address vest; - uint256 vestCap; - uint256 vestTot; - uint256 vestBgn; - uint256 vestTau; -} - -struct FarmingInitResult { uint256 vestId; } library FarmingInit { - function init(FarmingInitParams memory p) internal returns (FarmingInitResult memory r) { + function init(FarmingInitParams memory p) internal { require(DssVestWithGemLike(p.vest).gem() == p.ngt, "FarmingInit/vest-gem-mismatch"); + require(DssVestWithGemLike(p.vest).valid(p.vestId), "FarmingInit/vest-invalid-id"); + require(DssVestWithGemLike(p.vest).usr(p.vestId) == p.dist, "FarmingInit/vest-invalid-usr"); + require(DssVestWithGemLike(p.vest).res(p.vestId) == 1, "FarmingInit/vest-not-restricted"); + require(DssVestWithGemLike(p.vest).mgr(p.vestId) == address(0), "FarmingInit/vest-invalid-mgr"); + require( + DssVestWithGemLike(p.vest).bgn(p.vestId) == DssVestWithGemLike(p.vest).clf(p.vestId), + "FarmingInit/vest-bgn-clf-mismatch" + ); require(StakingRewardsLike(p.rewards).rewardsToken() == p.ngt, "FarmingInit/rewards-rewards-token-mismatch"); require(StakingRewardsLike(p.rewards).stakingToken() == p.nst, "FarmingInit/rewards-staking-token-mismatch"); @@ -50,34 +50,34 @@ library FarmingInit { "FarmingInit/dist-staking-rewards-mismatch" ); - // Grant minting rights on `ngt` to `vest`. - RelyLike(p.ngt).rely(p.vest); - - // Define global max vesting ratio on `vest`. - VestInit.init(p.vest, VestInitParams({cap: p.vestCap})); + require(WardsLike(p.ngt).wards(p.vest) == 1, "FarmingInit/missing-ngt-rely-vest"); // Set `dist` with `rewardsDistribution` role in `rewards`. StakingRewardsInit.init(p.rewards, StakingRewardsInitParams({dist: p.dist})); - // Create the proper vesting stream for rewards distribution. - uint256 vestId = VestInit.create( - p.vest, - VestCreateParams({usr: p.dist, tot: p.vestTot, bgn: p.vestBgn, tau: p.vestTau, eta: 0}) - ); - // Set the `vestId` in `dist` - VestedRewardsDistributionInit.init(p.dist, VestedRewardsDistributionInitParams({vestId: vestId})); - - r.vestId = vestId; + VestedRewardsDistributionInit.init(p.dist, VestedRewardsDistributionInitParams({vestId: p.vestId})); } } -interface RelyLike { - function rely(address who) external; +interface WardsLike { + function wards(address usr) external view returns (uint256); } interface DssVestWithGemLike { function gem() external view returns (address); + + function bgn(uint256 vestId) external view returns (uint256); + + function clf(uint256 vestId) external view returns (uint256); + + function mgr(uint256 vestId) external view returns (address); + + function res(uint256 vestId) external view returns (uint256); + + function usr(uint256 vestId) external view returns (address); + + function valid(uint256 vestId) external view returns (bool); } interface StakingRewardsLike { diff --git a/script/input/5/phase-0-alpha/template-farming-init.json b/script/input/5/phase-0-alpha/template-farming-init.json index daaf29b..8fa9acf 100644 --- a/script/input/5/phase-0-alpha/template-farming-init.json +++ b/script/input/5/phase-0-alpha/template-farming-init.json @@ -1,6 +1,3 @@ { - "vestCap": "uint256: global max issuance rate per token", - "vestTot": "uint256: total amount of the vesting stream", - "vestBgn": "uint256: timestamp of the beginning of the vesting stream", - "vestTau": "uint256: duration of the vesting stream in seconds" + "vestId": "uint256: the ID of the vesting stream" } diff --git a/script/phase-0-alpha/01-FarmingDeploy.s.sol b/script/phase-0-alpha/01-FarmingDeploy.s.sol index 4b0267c..02c4c70 100644 --- a/script/phase-0-alpha/01-FarmingDeploy.s.sol +++ b/script/phase-0-alpha/01-FarmingDeploy.s.sol @@ -34,17 +34,12 @@ contract Phase0Alpha_FarmingDeployScript is Script { address admin = reader.envOrReadAddress(".admin", "FOUNDRY_ADMIN"); address ngt = reader.envOrReadAddress(".ngt", "FOUNDRY_NGT"); address nst = reader.envOrReadAddress(".nst", "FOUNDRY_NST"); + address vest = reader.envOrReadAddress(".vest", "FOUNDRY_VEST"); address dist = reader.readAddressOptional(".dist"); address rewards = reader.readAddressOptional(".rewards"); - address vest = reader.readAddressOptional(".vest"); vm.startBroadcast(); - if (vest == address(0)) { - vest = deployCode("DssVest.sol:DssVestMintable", abi.encode(ngt)); - ScriptTools.switchOwner(vest, msg.sender, admin); - } - if (rewards == address(0)) { rewards = StakingRewardsDeploy.deploy( StakingRewardsDeployParams({owner: admin, stakingToken: nst, rewardsToken: ngt}) diff --git a/script/phase-0-alpha/02-FarmingInit.s.sol b/script/phase-0-alpha/02-FarmingInit.s.sol index baa09bb..1a1bf88 100644 --- a/script/phase-0-alpha/02-FarmingInit.s.sol +++ b/script/phase-0-alpha/02-FarmingInit.s.sol @@ -35,28 +35,13 @@ contract Phase0Alpha_FarmingInitScript is Script { Reader config = new Reader(ScriptTools.loadConfig()); - uint256 vestCap = config.readUint(".vestCap"); - uint256 vestTot = config.readUint(".vestTot"); - uint256 vestBgn = config.readUint(".vestBgn"); - uint256 vestTau = config.readUint(".vestTau"); + uint256 vestId = config.readUint(".vestId"); vm.startBroadcast(); - uint256 vestId = FarmingInit - .init( - FarmingInitParams({ - ngt: ngt, - nst: nst, - dist: dist, - rewards: rewards, - vest: vest, - vestCap: vestCap, - vestTot: vestTot, - vestBgn: vestBgn, - vestTau: vestTau - }) - ) - .vestId; + FarmingInit.init( + FarmingInitParams({ngt: ngt, nst: nst, dist: dist, rewards: rewards, vest: vest, vestId: vestId}) + ); vm.stopBroadcast(); @@ -65,8 +50,5 @@ contract Phase0Alpha_FarmingInitScript is Script { ScriptTools.exportContract(NAME, "rewards", rewards); ScriptTools.exportContract(NAME, "vest", vest); ScriptTools.exportContract(NAME, "vestId", address(uint160(vestId))); - ScriptTools.exportContract(NAME, "vestTot", address(uint160(vestTot))); - ScriptTools.exportContract(NAME, "vestBgn", address(uint160(vestBgn))); - ScriptTools.exportContract(NAME, "vestTau", address(uint160(vestTau))); } } From 6a915170df8a6c957e35bdbb865cddcc24a61f66 Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:14:55 -0300 Subject: [PATCH 09/16] chore: update `lib/dss-test` --- lib/dss-test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dss-test b/lib/dss-test index 9d75578..c8dba04 160000 --- a/lib/dss-test +++ b/lib/dss-test @@ -1 +1 @@ -Subproject commit 9d7557817af849273ec1d952cc953b212f19025f +Subproject commit c8dba04d1f2863e989b6fdf3710b266bd583634e From f799377876827436c0410a0d59169af363459a3b Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:45:21 -0300 Subject: [PATCH 10/16] fix(phase-0-alpha): adjust init and check script after deloy refactor --- script/phase-0-alpha/02-FarmingInit.s.sol | 2 +- script/phase-0-alpha/03-FarmingCheck.s.sol | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/script/phase-0-alpha/02-FarmingInit.s.sol b/script/phase-0-alpha/02-FarmingInit.s.sol index 1a1bf88..6e6a64d 100644 --- a/script/phase-0-alpha/02-FarmingInit.s.sol +++ b/script/phase-0-alpha/02-FarmingInit.s.sol @@ -49,6 +49,6 @@ contract Phase0Alpha_FarmingInitScript is Script { ScriptTools.exportContract(NAME, "dist", dist); ScriptTools.exportContract(NAME, "rewards", rewards); ScriptTools.exportContract(NAME, "vest", vest); - ScriptTools.exportContract(NAME, "vestId", address(uint160(vestId))); + ScriptTools.exportValue(NAME, "vestId", vestId); } } diff --git a/script/phase-0-alpha/03-FarmingCheck.s.sol b/script/phase-0-alpha/03-FarmingCheck.s.sol index a033063..e97f7ba 100644 --- a/script/phase-0-alpha/03-FarmingCheck.s.sol +++ b/script/phase-0-alpha/03-FarmingCheck.s.sol @@ -30,11 +30,7 @@ contract Phase0Alpha_FarmingCheckScript is Script { address rewards = deps.readAddress(".rewards"); address vest = deps.readAddress(".vest"); uint256 vestId = deps.readUint(".vestId"); - uint256 vestTot = deps.readUint(".vestTot"); - uint256 vestBgn = deps.readUint(".vestBgn"); - uint256 vestTau = deps.readUint(".vestTau"); - require(WardsLike(dist).wards(admin) == 1, "VestedRewardsDistribution/pause-proxy-not-relied"); require(VestedRewardsDistributionLike(dist).dssVest() == vest, "VestedRewardsDistribution/invalid-vest"); require(VestedRewardsDistributionLike(dist).vestId() == vestId, "VestedRewardsDistribution/invalid-vest-id"); require(VestedRewardsDistributionLike(dist).gem() == ngt, "VestedRewardsDistribution/invalid-gem"); @@ -43,7 +39,7 @@ contract Phase0Alpha_FarmingCheckScript is Script { "VestedRewardsDistribution/invalid-staking-rewards" ); - require(StakingRewardsLike(rewards).owner() == admin, "StakingRewards/pause-proxy-not-owner"); + require(StakingRewardsLike(rewards).owner() == admin, "StakingRewards/admin-not-owner"); require(StakingRewardsLike(rewards).rewardsToken() == ngt, "StakingRewards/invalid-rewards-token"); require(StakingRewardsLike(rewards).stakingToken() == nst, "StakingRewards/invalid-rewards-token"); require( @@ -53,15 +49,10 @@ contract Phase0Alpha_FarmingCheckScript is Script { require(WardsLike(ngt).wards(vest) == 1, "Ngt/dss-vest-not-ward"); - require(WardsLike(vest).wards(admin) == 1, "DssVest/pause-proxy-not-relied"); require(DssVestWithGemLike(vest).gem() == ngt, "DssVest/invalid-gem"); require(DssVestWithGemLike(vest).valid(vestId), "DssVest/invalid-vest-id"); require(DssVestWithGemLike(vest).res(vestId) == 1, "DssVest/invalid-vest-res"); require(DssVestWithGemLike(vest).usr(vestId) == dist, "DssVest/wrong-dist"); - require(DssVestWithGemLike(vest).tot(vestId) == vestTot, "DssVest/invalid-tot"); - require(DssVestWithGemLike(vest).bgn(vestId) == vestBgn, "DssVest/invalid-bgn"); - require(DssVestWithGemLike(vest).clf(vestId) == vestBgn, "DssVest/eta-not-zero"); - require(DssVestWithGemLike(vest).fin(vestId) == vestBgn + vestTau, "DssVest/invalid-tau"); require(DssVestWithGemLike(vest).mgr(vestId) == address(0), "DssVest/mgr-should-not-be-set"); return true; From eeb1771a9c026c44761c18883166c656d2fa7803 Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:49:22 -0300 Subject: [PATCH 11/16] refactor(ConfigReader): swap envOrRead* parameters Since env vars take priority, `envKey` should be the 1st parameter. --- script/helpers/Reader.sol | 4 ++-- script/phase-0-alpha/01-FarmingDeploy.s.sol | 8 ++++---- script/phase-0-alpha/02-FarmingInit.s.sol | 10 +++++----- script/phase-0-alpha/03-FarmingCheck.s.sol | 6 +++--- script/phase-0/01-FarmingDeploy.s.sol | 8 ++++---- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/script/helpers/Reader.sol b/script/helpers/Reader.sol index 6ccd0ae..2e8fb53 100644 --- a/script/helpers/Reader.sol +++ b/script/helpers/Reader.sol @@ -79,7 +79,7 @@ contract Reader { } } - function envOrReadAddress(string memory key, string memory envKey) external returns (address) { + function envOrReadAddress(string memory envKey, string memory key) external returns (address) { try vm.envAddress(envKey) returns (address addr) { return addr; } catch { @@ -87,7 +87,7 @@ contract Reader { } } - function envOrReadUint(string memory key, string memory envKey) external returns (uint256) { + function envOrReadUint(string memory envKey, string memory key) external returns (uint256) { try vm.envUint(envKey) returns (uint256 n) { return n; } catch { diff --git a/script/phase-0-alpha/01-FarmingDeploy.s.sol b/script/phase-0-alpha/01-FarmingDeploy.s.sol index 02c4c70..314bf48 100644 --- a/script/phase-0-alpha/01-FarmingDeploy.s.sol +++ b/script/phase-0-alpha/01-FarmingDeploy.s.sol @@ -31,10 +31,10 @@ contract Phase0Alpha_FarmingDeployScript is Script { function run() external { Reader reader = new Reader(ScriptTools.loadConfig()); - address admin = reader.envOrReadAddress(".admin", "FOUNDRY_ADMIN"); - address ngt = reader.envOrReadAddress(".ngt", "FOUNDRY_NGT"); - address nst = reader.envOrReadAddress(".nst", "FOUNDRY_NST"); - address vest = reader.envOrReadAddress(".vest", "FOUNDRY_VEST"); + address admin = reader.envOrReadAddress("FOUNDRY_ADMIN", ".admin"); + address ngt = reader.envOrReadAddress("FOUNDRY_NGT", ".ngt"); + address nst = reader.envOrReadAddress("FOUNDRY_NST", ".nst"); + address vest = reader.envOrReadAddress("FOUNDRY_VEST", ".vest"); address dist = reader.readAddressOptional(".dist"); address rewards = reader.readAddressOptional(".rewards"); diff --git a/script/phase-0-alpha/02-FarmingInit.s.sol b/script/phase-0-alpha/02-FarmingInit.s.sol index 6e6a64d..2380f31 100644 --- a/script/phase-0-alpha/02-FarmingInit.s.sol +++ b/script/phase-0-alpha/02-FarmingInit.s.sol @@ -27,11 +27,11 @@ contract Phase0Alpha_FarmingInitScript is Script { function run() external { Reader deps = new Reader(ScriptTools.loadDependencies()); - address ngt = deps.envOrReadAddress(".ngt", "FOUNDRY_NGT"); - address nst = deps.envOrReadAddress(".nst", "FOUNDRY_NST"); - address dist = deps.envOrReadAddress(".dist", "FOUNDRY_DIST"); - address rewards = deps.envOrReadAddress(".rewards", "FOUNDRY_FARM"); - address vest = deps.envOrReadAddress(".vest", "FOUNDRY_VEST"); + address ngt = deps.envOrReadAddress("FOUNDRY_NGT", ".ngt"); + address nst = deps.envOrReadAddress("FOUNDRY_NST", ".nst"); + address dist = deps.envOrReadAddress("FOUNDRY_DIST", ".dist"); + address rewards = deps.envOrReadAddress("FOUNDRY_FARM", ".rewards"); + address vest = deps.envOrReadAddress("FOUNDRY_VEST", ".vest"); Reader config = new Reader(ScriptTools.loadConfig()); diff --git a/script/phase-0-alpha/03-FarmingCheck.s.sol b/script/phase-0-alpha/03-FarmingCheck.s.sol index e97f7ba..ec67c11 100644 --- a/script/phase-0-alpha/03-FarmingCheck.s.sol +++ b/script/phase-0-alpha/03-FarmingCheck.s.sol @@ -23,9 +23,9 @@ contract Phase0Alpha_FarmingCheckScript is Script { Reader deps = new Reader(""); deps.loadDependenciesOrConfig(); - address admin = deps.envOrReadAddress(".admin", "FOUNDRY_ADMIN"); - address ngt = deps.envOrReadAddress(".ngt", "FOUNDRY_NGT"); - address nst = deps.envOrReadAddress(".nst", "FOUNDRY_NST"); + address admin = deps.envOrReadAddress("FOUNDRY_ADMIN", ".admin"); + address ngt = deps.envOrReadAddress("FOUNDRY_NGT", ".ngt"); + address nst = deps.envOrReadAddress("FOUNDRY_NST", ".nst"); address dist = deps.readAddress(".dist"); address rewards = deps.readAddress(".rewards"); address vest = deps.readAddress(".vest"); diff --git a/script/phase-0/01-FarmingDeploy.s.sol b/script/phase-0/01-FarmingDeploy.s.sol index 5e0ab33..9fd15a9 100644 --- a/script/phase-0/01-FarmingDeploy.s.sol +++ b/script/phase-0/01-FarmingDeploy.s.sol @@ -34,13 +34,13 @@ contract Phase0_FarmingDeployScript is Script { function run() external { Reader reader = new Reader(ScriptTools.loadConfig()); - ChangelogLike changelog = ChangelogLike(reader.envOrReadAddress(".changelog", "FOUNDRY_CHANGELOG")); + ChangelogLike changelog = ChangelogLike(reader.envOrReadAddress("FOUNDRY_CHANGELOG", ".changelog")); address admin = changelog.getAddress("MCD_PAUSE_PROXY"); - address ngt = reader.envOrReadAddress(".ngt", "FOUNDRY_NGT"); - address nst = reader.envOrReadAddress(".nst", "FOUNDRY_NST"); - address vest = reader.envOrReadAddress(".vest", "FOUNDRY_VEST"); + address ngt = reader.envOrReadAddress("FOUNDRY_NGT", ".ngt"); + address nst = reader.envOrReadAddress("FOUNDRY_NST", ".nst"); + address vest = reader.envOrReadAddress("FOUNDRY_VEST", ".vest"); address dist = reader.readAddressOptional(".dist"); address rewards = reader.readAddressOptional(".rewards"); From 74277b927aa086d1434754e7d99c26f1060ec423 Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Thu, 19 Oct 2023 18:02:03 -0300 Subject: [PATCH 12/16] docs(phase-0): add comment for assumption on `vest` --- script/dependencies/phase-0/FarmingInit.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/script/dependencies/phase-0/FarmingInit.sol b/script/dependencies/phase-0/FarmingInit.sol index 2482397..3b96c3e 100644 --- a/script/dependencies/phase-0/FarmingInit.sol +++ b/script/dependencies/phase-0/FarmingInit.sol @@ -49,6 +49,7 @@ library FarmingInit { "FarmingInit/dist-staking-rewards-mismatch" ); + // `vest` is expected to be an instance of `DssVestMintable`. // Check if minting rights on `ngt` were granted to `vest`. require(WardsLike(p.ngt).wards(p.vest) == 1, "FarmingInit/missing-ngt-rely-vest"); From 5dc625fd6a07c7c24a97a45553c2287f38807e44 Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Fri, 20 Oct 2023 11:56:25 -0300 Subject: [PATCH 13/16] refactor(phase-0): update deploy script input template --- script/input/1/phase-0/template-farming-deploy.json | 2 -- script/phase-0/01-FarmingDeploy.s.sol | 8 ++++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/script/input/1/phase-0/template-farming-deploy.json b/script/input/1/phase-0/template-farming-deploy.json index 292e86f..a4d49b0 100644 --- a/script/input/1/phase-0/template-farming-deploy.json +++ b/script/input/1/phase-0/template-farming-deploy.json @@ -2,7 +2,5 @@ "changelog": "address", "ngt": "address", "nst": "address", - "dist": "address", - "rewards": "address", "vest": "address" } diff --git a/script/phase-0/01-FarmingDeploy.s.sol b/script/phase-0/01-FarmingDeploy.s.sol index 9fd15a9..967717b 100644 --- a/script/phase-0/01-FarmingDeploy.s.sol +++ b/script/phase-0/01-FarmingDeploy.s.sol @@ -25,10 +25,6 @@ import { VestedRewardsDistributionDeployParams } from "../dependencies/VestedRewardsDistributionDeploy.sol"; -interface ChangelogLike { - function getAddress(bytes32 _key) external view returns (address addr); -} - contract Phase0_FarmingDeployScript is Script { string internal constant NAME = "phase-0/farming-deploy"; @@ -73,3 +69,7 @@ contract Phase0_FarmingDeployScript is Script { ScriptTools.exportContract(NAME, "vest", vest); } } + +interface ChangelogLike { + function getAddress(bytes32 _key) external view returns (address addr); +} From 32e1aad2ea4d6e9cf138be0e5b7907a20270d600 Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Wed, 25 Oct 2023 17:36:49 -0300 Subject: [PATCH 14/16] chore(deps): update `dss-test` --- lib/dss-test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dss-test b/lib/dss-test index c8dba04..28000a0 160000 --- a/lib/dss-test +++ b/lib/dss-test @@ -1 +1 @@ -Subproject commit c8dba04d1f2863e989b6fdf3710b266bd583634e +Subproject commit 28000a0ea3602c887f2fdc22dea591789d1b4971 From 92670dd8da8ac69f6d8282ca2ec3a58b961c8f95 Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Mon, 30 Oct 2023 18:02:24 -0300 Subject: [PATCH 15/16] refactor(solc-version): use `0.8.16` Use `solc`@`0.8.16` to match the remaining endgame related contracts --- foundry.toml | 2 +- script/dependencies/SDAODeploy.sol | 2 +- script/dependencies/StakingRewardsDeploy.sol | 2 +- script/dependencies/StakingRewardsInit.sol | 2 +- script/dependencies/SubProxyDeploy.sol | 2 +- script/dependencies/SubProxyInit.sol | 2 +- script/dependencies/VestInit.sol | 2 +- script/dependencies/VestedRewardsDistributionDeploy.sol | 2 +- script/dependencies/VestedRewardsDistributionInit.sol | 2 +- script/dependencies/phase-0-alpha/FarmingInit.sol | 2 +- script/dependencies/phase-0/FarmingInit.sol | 2 +- script/helpers/Reader.sol | 2 +- script/phase-0-alpha/01-FarmingDeploy.s.sol | 2 +- script/phase-0-alpha/02-FarmingInit.s.sol | 2 +- script/phase-0-alpha/03-FarmingCheck.s.sol | 2 +- script/phase-0/01-FarmingDeploy.s.sol | 2 +- src/SDAO.sol | 2 +- src/SDAO.t.sol | 2 +- src/SubProxy.sol | 2 +- src/SubProxy.t.sol | 2 +- src/VestedRewardsDistribution.sol | 2 +- src/VestedRewardsDistribution.t.sol | 2 +- src/interfaces/DssVestWithGemLike.sol | 2 +- src/synthetix/StakingRewards.sol | 2 +- src/synthetix/StakingRewards.t.sol | 2 +- src/synthetix/interfaces/IStakingRewards.sol | 2 +- src/synthetix/utils/Owned.sol | 2 +- src/synthetix/utils/Pausable.sol | 2 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/foundry.toml b/foundry.toml index 7729d0e..6f4b513 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,7 +3,7 @@ src = 'src' out = 'out' script = 'script' libs = ['lib'] -solc_version = '0.8.19' +solc_version = '0.8.16' optimizer = true fs_permissions = [ { access = "read", path = "./out/" }, diff --git a/script/dependencies/SDAODeploy.sol b/script/dependencies/SDAODeploy.sol index 551e392..99ce344 100644 --- a/script/dependencies/SDAODeploy.sol +++ b/script/dependencies/SDAODeploy.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {ScriptTools} from "dss-test/ScriptTools.sol"; import {SDAO} from "../../src/SDAO.sol"; diff --git a/script/dependencies/StakingRewardsDeploy.sol b/script/dependencies/StakingRewardsDeploy.sol index 9317b62..712bfa8 100644 --- a/script/dependencies/StakingRewardsDeploy.sol +++ b/script/dependencies/StakingRewardsDeploy.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {StakingRewards} from "../../src/synthetix/StakingRewards.sol"; diff --git a/script/dependencies/StakingRewardsInit.sol b/script/dependencies/StakingRewardsInit.sol index 290c8d1..3e10a28 100644 --- a/script/dependencies/StakingRewardsInit.sol +++ b/script/dependencies/StakingRewardsInit.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; struct StakingRewardsInitParams { address dist; diff --git a/script/dependencies/SubProxyDeploy.sol b/script/dependencies/SubProxyDeploy.sol index e5ff0dd..57a089e 100644 --- a/script/dependencies/SubProxyDeploy.sol +++ b/script/dependencies/SubProxyDeploy.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {ScriptTools} from "dss-test/ScriptTools.sol"; import {SubProxy} from "../../src/SubProxy.sol"; diff --git a/script/dependencies/SubProxyInit.sol b/script/dependencies/SubProxyInit.sol index 3f45d3a..5c9b487 100644 --- a/script/dependencies/SubProxyInit.sol +++ b/script/dependencies/SubProxyInit.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {ScriptTools} from "dss-test/ScriptTools.sol"; import {DssInstance, MCD} from "dss-test/MCD.sol"; diff --git a/script/dependencies/VestInit.sol b/script/dependencies/VestInit.sol index d479aa4..2bbee9e 100644 --- a/script/dependencies/VestInit.sol +++ b/script/dependencies/VestInit.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {ScriptTools} from "dss-test/ScriptTools.sol"; diff --git a/script/dependencies/VestedRewardsDistributionDeploy.sol b/script/dependencies/VestedRewardsDistributionDeploy.sol index e62267b..2d33c1e 100644 --- a/script/dependencies/VestedRewardsDistributionDeploy.sol +++ b/script/dependencies/VestedRewardsDistributionDeploy.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {ScriptTools} from "dss-test/ScriptTools.sol"; import {VestedRewardsDistribution} from "../../src/VestedRewardsDistribution.sol"; diff --git a/script/dependencies/VestedRewardsDistributionInit.sol b/script/dependencies/VestedRewardsDistributionInit.sol index fbfcb46..2026b97 100644 --- a/script/dependencies/VestedRewardsDistributionInit.sol +++ b/script/dependencies/VestedRewardsDistributionInit.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; struct VestedRewardsDistributionInitParams { uint256 vestId; diff --git a/script/dependencies/phase-0-alpha/FarmingInit.sol b/script/dependencies/phase-0-alpha/FarmingInit.sol index a9a74fa..dc89d8f 100644 --- a/script/dependencies/phase-0-alpha/FarmingInit.sol +++ b/script/dependencies/phase-0-alpha/FarmingInit.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {StakingRewardsInit, StakingRewardsInitParams} from "../StakingRewardsInit.sol"; import {VestedRewardsDistributionInit, VestedRewardsDistributionInitParams} from "../VestedRewardsDistributionInit.sol"; diff --git a/script/dependencies/phase-0/FarmingInit.sol b/script/dependencies/phase-0/FarmingInit.sol index 3b96c3e..ccd9e3c 100644 --- a/script/dependencies/phase-0/FarmingInit.sol +++ b/script/dependencies/phase-0/FarmingInit.sol @@ -13,7 +13,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {StakingRewardsInit, StakingRewardsInitParams} from "../StakingRewardsInit.sol"; import {VestedRewardsDistributionInit, VestedRewardsDistributionInitParams} from "../VestedRewardsDistributionInit.sol"; diff --git a/script/helpers/Reader.sol b/script/helpers/Reader.sol index 2e8fb53..1d90ecc 100644 --- a/script/helpers/Reader.sol +++ b/script/helpers/Reader.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {Vm} from "forge-std/Vm.sol"; import {stdJson} from "forge-std/StdJson.sol"; diff --git a/script/phase-0-alpha/01-FarmingDeploy.s.sol b/script/phase-0-alpha/01-FarmingDeploy.s.sol index 314bf48..05b57fa 100644 --- a/script/phase-0-alpha/01-FarmingDeploy.s.sol +++ b/script/phase-0-alpha/01-FarmingDeploy.s.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {Script} from "forge-std/Script.sol"; import {ScriptTools} from "dss-test/ScriptTools.sol"; diff --git a/script/phase-0-alpha/02-FarmingInit.s.sol b/script/phase-0-alpha/02-FarmingInit.s.sol index 2380f31..6e4572d 100644 --- a/script/phase-0-alpha/02-FarmingInit.s.sol +++ b/script/phase-0-alpha/02-FarmingInit.s.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {Script} from "forge-std/Script.sol"; import {ScriptTools} from "dss-test/ScriptTools.sol"; diff --git a/script/phase-0-alpha/03-FarmingCheck.s.sol b/script/phase-0-alpha/03-FarmingCheck.s.sol index ec67c11..4b148f1 100644 --- a/script/phase-0-alpha/03-FarmingCheck.s.sol +++ b/script/phase-0-alpha/03-FarmingCheck.s.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {Script} from "forge-std/Script.sol"; import {Reader} from "../helpers/Reader.sol"; diff --git a/script/phase-0/01-FarmingDeploy.s.sol b/script/phase-0/01-FarmingDeploy.s.sol index 967717b..fe5e328 100644 --- a/script/phase-0/01-FarmingDeploy.s.sol +++ b/script/phase-0/01-FarmingDeploy.s.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity ^0.8.0; +pragma solidity ^0.8.16; import {Script} from "forge-std/Script.sol"; import {ScriptTools} from "dss-test/ScriptTools.sol"; diff --git a/src/SDAO.sol b/src/SDAO.sol index c3e1d1f..c52c52f 100644 --- a/src/SDAO.sol +++ b/src/SDAO.sol @@ -14,7 +14,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.19; +pragma solidity ^0.8.16; /// @dev Smart Contract signature validation interface. interface IERC1271 { diff --git a/src/SDAO.t.sol b/src/SDAO.t.sol index 43f2c65..85ce46a 100644 --- a/src/SDAO.t.sol +++ b/src/SDAO.t.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.19; +pragma solidity ^0.8.16; import {TokenFuzzTests} from "token-tests/TokenFuzzTests.sol"; import {DssTest} from "dss-test/DssTest.sol"; diff --git a/src/SubProxy.sol b/src/SubProxy.sol index 328afd6..6ba0c0f 100644 --- a/src/SubProxy.sol +++ b/src/SubProxy.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.19; +pragma solidity ^0.8.16; /** * @title SubProxy: the SubDAO-level `PauseProxy`. diff --git a/src/SubProxy.t.sol b/src/SubProxy.t.sol index 5ec2ffe..03441ca 100644 --- a/src/SubProxy.t.sol +++ b/src/SubProxy.t.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.19; +pragma solidity ^0.8.16; import {DssTest} from "dss-test/DssTest.sol"; import {SubProxy} from "./SubProxy.sol"; diff --git a/src/VestedRewardsDistribution.sol b/src/VestedRewardsDistribution.sol index 6305dc1..6460d74 100644 --- a/src/VestedRewardsDistribution.sol +++ b/src/VestedRewardsDistribution.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.19; +pragma solidity ^0.8.16; import {IStakingRewards} from "./synthetix/interfaces/IStakingRewards.sol"; import {DssVestWithGemLike} from "./interfaces/DssVestWithGemLike.sol"; diff --git a/src/VestedRewardsDistribution.t.sol b/src/VestedRewardsDistribution.t.sol index 99f6c91..7ea4421 100644 --- a/src/VestedRewardsDistribution.t.sol +++ b/src/VestedRewardsDistribution.t.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.19; +pragma solidity ^0.8.16; import {DssTest, stdStorage, StdStorage} from "dss-test/DssTest.sol"; import {IERC20} from "openzeppelin-contracts/token/ERC20/IERC20.sol"; diff --git a/src/interfaces/DssVestWithGemLike.sol b/src/interfaces/DssVestWithGemLike.sol index c15374a..f717489 100644 --- a/src/interfaces/DssVestWithGemLike.sol +++ b/src/interfaces/DssVestWithGemLike.sol @@ -14,7 +14,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity >=0.8.8; +pragma solidity ^0.8.16; interface DssVestWithGemLike { function valid(uint256 _id) external view returns (bool); diff --git a/src/synthetix/StakingRewards.sol b/src/synthetix/StakingRewards.sol index b1db131..e8989cb 100644 --- a/src/synthetix/StakingRewards.sol +++ b/src/synthetix/StakingRewards.sol @@ -23,7 +23,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.19; +pragma solidity ^0.8.16; import {SafeERC20, IERC20} from "openzeppelin-contracts/token/ERC20/utils/SafeERC20.sol"; import {ReentrancyGuard} from "openzeppelin-contracts/security/ReentrancyGuard.sol"; diff --git a/src/synthetix/StakingRewards.t.sol b/src/synthetix/StakingRewards.t.sol index 5e2f9ca..83f591c 100644 --- a/src/synthetix/StakingRewards.t.sol +++ b/src/synthetix/StakingRewards.t.sol @@ -14,7 +14,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.19; +pragma solidity ^0.8.16; import "forge-std/Test.sol"; import {ERC20} from "openzeppelin-contracts/token/ERC20/ERC20.sol"; diff --git a/src/synthetix/interfaces/IStakingRewards.sol b/src/synthetix/interfaces/IStakingRewards.sol index 85cc7d3..60f10ad 100644 --- a/src/synthetix/interfaces/IStakingRewards.sol +++ b/src/synthetix/interfaces/IStakingRewards.sol @@ -14,7 +14,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.19; +pragma solidity ^0.8.16; import {IERC20} from "openzeppelin-contracts/token/ERC20/utils/SafeERC20.sol"; diff --git a/src/synthetix/utils/Owned.sol b/src/synthetix/utils/Owned.sol index 365089f..455019b 100644 --- a/src/synthetix/utils/Owned.sol +++ b/src/synthetix/utils/Owned.sol @@ -22,7 +22,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.19; +pragma solidity ^0.8.16; // https://developer.synthetix.io/contracts/source/contracts/Owned/ contract Owned { diff --git a/src/synthetix/utils/Pausable.sol b/src/synthetix/utils/Pausable.sol index 1018516..a9aed4f 100644 --- a/src/synthetix/utils/Pausable.sol +++ b/src/synthetix/utils/Pausable.sol @@ -22,7 +22,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.19; +pragma solidity ^0.8.16; // Inheritance import {Owned} from "./Owned.sol"; From f95d2fae7992cc88ca2c6725e9ea284c895b6f3b Mon Sep 17 00:00:00 2001 From: amusingaxl <112016538+amusingaxl@users.noreply.github.com> Date: Wed, 15 Nov 2023 17:47:41 -0300 Subject: [PATCH 16/16] refactor(VestInit): remove unused dependency --- script/dependencies/VestInit.sol | 4 ---- 1 file changed, 4 deletions(-) diff --git a/script/dependencies/VestInit.sol b/script/dependencies/VestInit.sol index 2bbee9e..0a5b0ae 100644 --- a/script/dependencies/VestInit.sol +++ b/script/dependencies/VestInit.sol @@ -15,8 +15,6 @@ pragma solidity ^0.8.16; -import {ScriptTools} from "dss-test/ScriptTools.sol"; - struct VestInitParams { uint256 cap; } @@ -30,8 +28,6 @@ struct VestCreateParams { } library VestInit { - using ScriptTools for string; - function init(address vest, VestInitParams memory p) internal { DssVestLike(vest).file("cap", p.cap); }