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);
}