diff --git a/src/DssSpell.t.base.sol b/src/DssSpell.t.base.sol index 60bfc0eb..f6d6cb22 100644 --- a/src/DssSpell.t.base.sol +++ b/src/DssSpell.t.base.sol @@ -233,6 +233,36 @@ interface StakingRewardsLike { function rewardsDuration() external view returns (uint256); } +interface LockstakeEngineLike { + function voteDelegateFactory() external view returns (address); + function vat() external view returns (address); + function usdsJoin() external view returns (address); + function usds() external view returns (address); + function ilk() external view returns (bytes32); + function mkr() external view returns (address); + function lsmkr() external view returns (address); + function fee() external view returns (uint256); + function mkrSky() external view returns (address); + function sky() external view returns (address); + function rely(address) external; + function file(bytes32, address) external; + function file(bytes32, uint256) external; + function addFarm(address) external; + function farms(address farm) external view returns (uint8); +} + +interface LockstakeClipperLike { + function vat() external view returns (address); + function dog() external view returns (address); + function spotter() external view returns (address); + function engine() external view returns (address); + function ilk() external view returns (bytes32); + function rely(address) external; + function file(bytes32, address) external; + function file(bytes32, uint256) external; + function upchost() external; +} + contract DssSpellTestBase is Config, DssTest { using stdStorage for StdStorage; @@ -809,6 +839,17 @@ contract DssSpellTestBase is Config, DssTest { uint256 _chost = (values.collaterals[ilk].dust * RAD) * normalizedTestChop / WAD; assertEq(clip.chost(), _chost, _concat("TestError/calc-chost-incorrect-", ilk)); // Ensure clip.upchost() is called when dust changes } + if (reg.class(ilk) == 7) { + address engine = LockstakeClipperLike(address(clip)).engine(); + assertNotEq(engine, address(0), _concat("TestError/engine-is-not-set-", ilk)); + uint256 normalisedFee = values.collaterals[ilk].engine_fee * WAD / 10_000; + assertEq(normalisedFee, LockstakeEngineLike(engine).fee(), _concat("TestError/engine-fee-", ilk)); + for (uint256 j = 0; j < values.collaterals[ilk].engine_farms.length; j++) { + address farm = addr.addr(values.collaterals[ilk].engine_farms[j]); + assertNotEq(farm, address(0), _concat("TestError/farm-is-empty-", ilk)); + assertEq(LockstakeEngineLike(engine).farms(farm), 1, _concat("TestError/engine-farms-", ilk)); + } + } } if (reg.class(ilk) < 3) { { diff --git a/src/test/config.sol b/src/test/config.sol index 889ffb8d..5a2f697e 100644 --- a/src/test/config.sol +++ b/src/test/config.sol @@ -83,6 +83,8 @@ contract Config { uint256 calc_tau; uint256 calc_step; uint256 calc_cut; + uint256 engine_fee; + bytes32[] engine_farms; bool offboarding; } @@ -172,6 +174,8 @@ contract Config { calc_tau: 0, // In seconds calc_step: 90, // In seconds calc_cut: 9900, // In basis points + engine_fee: 0, // In basis points + engine_farms: new bytes32[](0), // Array of chainlog keys of added farms offboarding: false // If mat is being offboarded }); afterSpell.collaterals["ETH-B"] = CollateralValues({ @@ -197,6 +201,8 @@ contract Config { calc_tau: 0, calc_step: 60, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["ETH-C"] = CollateralValues({ @@ -222,6 +228,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["BAT-A"] = CollateralValues({ @@ -247,6 +255,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["USDC-A"] = CollateralValues({ @@ -272,6 +282,8 @@ contract Config { calc_tau: 4_320_000, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["USDC-B"] = CollateralValues({ @@ -297,6 +309,8 @@ contract Config { calc_tau: 0, calc_step: 120, calc_cut: 9990, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["WBTC-A"] = CollateralValues({ @@ -322,6 +336,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["WBTC-B"] = CollateralValues({ @@ -347,6 +363,8 @@ contract Config { calc_tau: 0, calc_step: 60, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["WBTC-C"] = CollateralValues({ @@ -372,6 +390,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["TUSD-A"] = CollateralValues({ @@ -397,6 +417,8 @@ contract Config { calc_tau: 250 days, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["KNC-A"] = CollateralValues({ @@ -422,6 +444,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["ZRX-A"] = CollateralValues({ @@ -447,6 +471,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["MANA-A"] = CollateralValues({ @@ -472,6 +498,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["USDT-A"] = CollateralValues({ @@ -497,6 +525,8 @@ contract Config { calc_tau: 0, calc_step: 120, calc_cut: 9990, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["PAXUSD-A"] = CollateralValues({ @@ -522,6 +552,8 @@ contract Config { calc_tau: 4_320_000, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["COMP-A"] = CollateralValues({ @@ -547,6 +579,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["LRC-A"] = CollateralValues({ @@ -572,6 +606,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["LINK-A"] = CollateralValues({ @@ -597,6 +633,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["BAL-A"] = CollateralValues({ @@ -622,6 +660,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["YFI-A"] = CollateralValues({ @@ -647,6 +687,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["GUSD-A"] = CollateralValues({ @@ -672,6 +714,8 @@ contract Config { calc_tau: 4_320_000, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["UNI-A"] = CollateralValues({ @@ -697,6 +741,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["RENBTC-A"] = CollateralValues({ @@ -722,6 +768,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["AAVE-A"] = CollateralValues({ @@ -747,6 +795,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["UNIV2DAIETH-A"] = CollateralValues({ @@ -772,6 +822,8 @@ contract Config { calc_tau: 0, calc_step: 125, calc_cut: 9950, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["PSM-USDC-A"] = CollateralValues({ @@ -797,6 +849,8 @@ contract Config { calc_tau: 0, calc_step: 120, calc_cut: 9990, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["LITE-PSM-USDC-A"] = CollateralValues({ @@ -822,6 +876,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["UNIV2WBTCETH-A"] = CollateralValues({ @@ -847,6 +903,8 @@ contract Config { calc_tau: 0, calc_step: 130, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["UNIV2USDCETH-A"] = CollateralValues({ @@ -872,6 +930,8 @@ contract Config { calc_tau: 0, calc_step: 125, calc_cut: 9950, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["UNIV2DAIUSDC-A"] = CollateralValues({ @@ -897,6 +957,8 @@ contract Config { calc_tau: 0, calc_step: 120, calc_cut: 9990, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["UNIV2ETHUSDT-A"] = CollateralValues({ @@ -922,6 +984,8 @@ contract Config { calc_tau: 0, calc_step: 125, calc_cut: 9950, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["UNIV2LINKETH-A"] = CollateralValues({ @@ -947,6 +1011,8 @@ contract Config { calc_tau: 0, calc_step: 130, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["UNIV2UNIETH-A"] = CollateralValues({ @@ -972,6 +1038,8 @@ contract Config { calc_tau: 0, calc_step: 130, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["UNIV2WBTCDAI-A"] = CollateralValues({ @@ -997,6 +1065,8 @@ contract Config { calc_tau: 0, calc_step: 125, calc_cut: 9950, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["UNIV2AAVEETH-A"] = CollateralValues({ @@ -1022,6 +1092,8 @@ contract Config { calc_tau: 0, calc_step: 130, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["UNIV2DAIUSDT-A"] = CollateralValues({ @@ -1047,6 +1119,8 @@ contract Config { calc_tau: 0, calc_step: 120, calc_cut: 9990, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA001-A"] = CollateralValues({ @@ -1072,6 +1146,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA002-A"] = CollateralValues({ @@ -1097,6 +1173,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA003-A"] = CollateralValues({ @@ -1122,6 +1200,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA004-A"] = CollateralValues({ @@ -1147,6 +1227,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA005-A"] = CollateralValues({ @@ -1172,6 +1254,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA006-A"] = CollateralValues({ @@ -1197,6 +1281,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA007-A"] = CollateralValues({ @@ -1222,6 +1308,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA008-A"] = CollateralValues({ @@ -1247,6 +1335,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA009-A"] = CollateralValues({ @@ -1272,6 +1362,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA010-A"] = CollateralValues({ @@ -1297,6 +1389,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA011-A"] = CollateralValues({ @@ -1322,6 +1416,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA012-A"] = CollateralValues({ @@ -1347,6 +1443,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA013-A"] = CollateralValues({ @@ -1372,6 +1470,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA014-A"] = CollateralValues({ @@ -1397,6 +1497,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RWA015-A"] = CollateralValues({ @@ -1422,6 +1524,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["MATIC-A"] = CollateralValues({ @@ -1447,6 +1551,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["PSM-PAX-A"] = CollateralValues({ @@ -1472,6 +1578,8 @@ contract Config { calc_tau: 0, calc_step: 120, calc_cut: 9990, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["GUNIV3DAIUSDC1-A"] = CollateralValues({ @@ -1497,6 +1605,8 @@ contract Config { calc_tau: 0, calc_step: 120, calc_cut: 9990, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["WSTETH-A"] = CollateralValues({ @@ -1522,6 +1632,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["WSTETH-B"] = CollateralValues({ @@ -1547,6 +1659,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["DIRECT-SPK-AAVE-LIDO-USDS"] = CollateralValues({ @@ -1572,6 +1686,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["DIRECT-AAVEV2-DAI"] = CollateralValues({ @@ -1597,6 +1713,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["DIRECT-COMPV2-DAI"] = CollateralValues({ @@ -1622,6 +1740,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["PSM-GUSD-A"] = CollateralValues({ @@ -1647,6 +1767,8 @@ contract Config { calc_tau: 0, calc_step: 120, calc_cut: 9990, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["GUNIV3DAIUSDC2-A"] = CollateralValues({ @@ -1672,6 +1794,8 @@ contract Config { calc_tau: 0, calc_step: 120, calc_cut: 9990, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["CRVV1ETHSTETH-A"] = CollateralValues({ @@ -1697,6 +1821,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 9900, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["TELEPORT-FW-A"] = CollateralValues({ @@ -1722,6 +1848,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["RETH-A"] = CollateralValues({ @@ -1747,6 +1875,8 @@ contract Config { calc_tau: 0, calc_step: 90, calc_cut: 99_00, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: true }); afterSpell.collaterals["GNO-A"] = CollateralValues({ @@ -1772,6 +1902,8 @@ contract Config { calc_tau: 0, calc_step: 60, calc_cut: 99_00, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["DIRECT-SPARK-DAI"] = CollateralValues({ @@ -1797,6 +1929,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["DIRECT-SPARK-MORPHO-DAI"] = CollateralValues({ @@ -1822,6 +1956,8 @@ contract Config { calc_tau: 0, calc_step: 0, calc_cut: 0, + engine_fee: 0, + engine_farms: new bytes32[](0), offboarding: false }); afterSpell.collaterals["LSE-MKR-A"] = CollateralValues({ @@ -1847,7 +1983,10 @@ contract Config { calc_tau: 0, calc_step: 60, calc_cut: 99_00, + engine_fee: 5_00, + engine_farms: new bytes32[](1), offboarding: false }); + afterSpell.collaterals["LSE-MKR-A"].engine_farms[0] = "REWARDS_LSMKR_USDS"; } }