diff --git a/script/DeployManagers.sol b/script/DeployManagers.sol index aba4ab1..bf3e417 100644 --- a/script/DeployManagers.sol +++ b/script/DeployManagers.sol @@ -10,6 +10,7 @@ import { GuardianManager } from "src/strategies/layers/guardian/external/Guardia import { LiquidityMiningManager } from "src/strategies/layers/liquidity-mining/external/LiquidityMiningManager.sol"; import { DelayedWithdrawalManager } from "src/delayed-withdrawal-manager/DelayedWithdrawalManager.sol"; import { TOSManager } from "src/strategies/layers/creation-validation/external/TOSManager.sol"; +import { MorphoRewardsManager } from "src/strategies/layers/connector/morpho/MorphoRewardsManager.sol"; import { GlobalValidationManagersRegistry } from "src/strategies/layers/creation-validation/external/GlobalValidationManagersRegistry.sol"; import { SignatureBasedWhitelistManager } from @@ -114,7 +115,12 @@ contract DeployManagers is BaseDeployPeriphery { ); console2.log("Liquidity mining manager:", liquidityMiningManager); - GlobalEarnRegistry.InitialConfig[] memory config = new GlobalEarnRegistry.InitialConfig[](5); + address morphoRewardsManager = deployContract( + "V1_RM_MORPHO", abi.encodePacked(type(MorphoRewardsManager).creationCode, abi.encode(admin, initialAdmins)) + ); + console2.log("Rewards manager deployed: ", morphoRewardsManager); + + GlobalEarnRegistry.InitialConfig[] memory config = new GlobalEarnRegistry.InitialConfig[](6); config[0] = GlobalEarnRegistry.InitialConfig({ id: keccak256("FEE_MANAGER"), contractAddress: feeManager }); config[1] = GlobalEarnRegistry.InitialConfig({ id: keccak256("GUARDIAN_MANAGER"), contractAddress: guardianManager }); @@ -130,6 +136,11 @@ contract DeployManagers is BaseDeployPeriphery { id: keccak256("VALIDATION_MANAGERS_REGISTRY"), contractAddress: validationManagersRegistry }); + config[5] = GlobalEarnRegistry.InitialConfig({ + id: keccak256("MORPHO_REWARDS_MANAGER"), + contractAddress: morphoRewardsManager + }); + address globalRegistry = deployContract( "V1_GLOBAL_REGISTRY", abi.encodePacked(type(GlobalEarnRegistry).creationCode, abi.encode(config, admin)) ); diff --git a/script/DeployPeriphery.sol b/script/DeployPeriphery.sol index ca06988..d8fcf28 100644 --- a/script/DeployPeriphery.sol +++ b/script/DeployPeriphery.sol @@ -4,16 +4,16 @@ pragma solidity ^0.8.13; import { BaseDeployPeriphery } from "./BaseDeployPeriphery.sol"; import { DeployManagers } from "./DeployManagers.sol"; import { DeployCompanion } from "./DeployCompanion.sol"; -import { DeployStrategies } from "./strategies/aave-v3/base/DeployStrategies.sol"; -contract DeployPeriphery is BaseDeployPeriphery, DeployManagers, DeployCompanion, DeployStrategies { - function run() external override(DeployManagers, DeployCompanion, DeployStrategies) { +contract DeployPeriphery is BaseDeployPeriphery, DeployManagers, DeployCompanion { + function run() external virtual override(DeployManagers, DeployCompanion) { vm.startBroadcast(); + deployPeriphery(); + vm.stopBroadcast(); + } + function deployPeriphery() internal { deployCompanion(); deployManagers(); - deployStrategies(); - - vm.stopBroadcast(); } } diff --git a/script/strategies/aave-v3/BaseDeployStrategies.sol b/script/strategies/aave-v3/BaseDeployStrategies.sol index ba35dda..adfb093 100644 --- a/script/strategies/aave-v3/BaseDeployStrategies.sol +++ b/script/strategies/aave-v3/BaseDeployStrategies.sol @@ -29,7 +29,8 @@ contract BaseDeployStrategies is BaseDeployPeriphery { bytes32 signerGroup, address[] memory guardians, address[] memory judges, - Fees memory fees + Fees memory fees, + bytes32 guard ) internal returns (IEarnBalmyStrategy strategy, StrategyId strategyId) @@ -58,22 +59,37 @@ contract BaseDeployStrategies is BaseDeployPeriphery { bytes memory guardianData = guardians.length > 0 || judges.length > 0 ? abi.encode(guardians, judges) : bytes(""); bytes memory liquidityMiningData = ""; bytes memory feesData = fees.equals(DEFAULT_FEES) ? bytes("") : abi.encode(fees); - (strategy, strategyId) = aaveV3StrategyFactory.cloneStrategyAndRegister( - admin, - AaveV3StrategyData( - IEarnVault(vault), - IGlobalEarnRegistry(globalRegistry), - aToken, - IAaveV3Pool(aaveV3Pool), - IAaveV3Rewards(aaveV3Rewards), - creationValidationData, - guardianData, - feesData, - liquidityMiningData - ) + bytes32 salt = keccak256(abi.encode("V1_S_AAVEV3", guard)); + + address computedAddress = aaveV3StrategyFactory.addressOfClone2( + IEarnVault(vault), + IGlobalEarnRegistry(globalRegistry), + aToken, + IAaveV3Pool(aaveV3Pool), + IAaveV3Rewards(aaveV3Rewards), + salt ); + if (computedAddress.code.length > 0) { + console2.log("Strategy already deployed", computedAddress); + } else { + (strategy, strategyId) = aaveV3StrategyFactory.clone2StrategyAndRegister( + admin, + AaveV3StrategyData( + IEarnVault(vault), + IGlobalEarnRegistry(globalRegistry), + aToken, + IAaveV3Pool(aaveV3Pool), + IAaveV3Rewards(aaveV3Rewards), + creationValidationData, + guardianData, + feesData, + liquidityMiningData + ), + salt + ); - console2.log("Strategy:", address(strategy)); - console2.log("Strategy ID:", StrategyId.unwrap(strategyId)); + console2.log("Strategy:", address(strategy)); + console2.log("Strategy ID:", StrategyId.unwrap(strategyId)); + } } } diff --git a/script/strategies/aave-v3/base/DeployStrategies.sol b/script/strategies/aave-v3/base/DeployStrategies.sol index 97bba11..8824c26 100644 --- a/script/strategies/aave-v3/base/DeployStrategies.sol +++ b/script/strategies/aave-v3/base/DeployStrategies.sol @@ -1,17 +1,20 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; -import { BaseDeployStrategies, IAToken, StrategyId } from "../BaseDeployStrategies.sol"; +import { BaseDeployStrategies, IAToken, IEarnBalmyStrategy } from "../BaseDeployStrategies.sol"; +import { console2 } from "forge-std/console2.sol"; import { Fees } from "src/strategies/layers/fees/external/FeeManager.sol"; +import { DeployPeriphery } from "script/DeployPeriphery.sol"; -contract DeployStrategies is BaseDeployStrategies { - function run() external virtual { +contract DeployStrategies is DeployPeriphery, BaseDeployStrategies { + function run() external override(DeployPeriphery) { vm.startBroadcast(); - deployStrategies(); + deployPeriphery(); + deployAaveV3Strategies(); vm.stopBroadcast(); } - function deployStrategies() internal { + function deployAaveV3Strategies() internal { address aaveV3Pool = 0xA238Dd80C259a72e81d7e4664a9801593F98d1c5; address aaveV3Rewards = 0xf9cc4F0D883F1a1eb2c253bdb46c254Ca51E1F44; address[] memory guardians = new address[](1); @@ -20,10 +23,10 @@ contract DeployStrategies is BaseDeployStrategies { address[] memory judges = new address[](1); judges[0] = getMsig(); - StrategyId strategyId; + IEarnBalmyStrategy strategy; // Tier 0 = default fees // USDC - deployAaveV3Strategy({ + (strategy,) = deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x4e65fE4DbA92790696d040ac24Aa414708F5c0AB), @@ -31,9 +34,10 @@ contract DeployStrategies is BaseDeployStrategies { signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); - + console2.log("strategy tier 0 - usdc", address(strategy)); // WETH deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, @@ -43,11 +47,12 @@ contract DeployStrategies is BaseDeployStrategies { signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); - + console2.log("strategy tier 0 - weth", address(strategy)); // cbBTC - deployAaveV3Strategy({ + (strategy,) = deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0xBdb9300b7CDE636d9cD4AFF00f6F009fFBBc8EE6), @@ -55,14 +60,15 @@ contract DeployStrategies is BaseDeployStrategies { signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); - + console2.log("strategy tier 0 - cbbtc", address(strategy)); // Tier 1 = 7.5% performance fee + 3.75% rescue fee Fees memory tier1Fees = Fees({ depositFee: 0, withdrawFee: 0, performanceFee: 750, rescueFee: 375 }); // USDC - (, strategyId) = deployAaveV3Strategy({ + (strategy,) = deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x4e65fE4DbA92790696d040ac24Aa414708F5c0AB), @@ -70,11 +76,13 @@ contract DeployStrategies is BaseDeployStrategies { signerGroup: DEFAULT_SIGNER_GROUP, guardians: guardians, judges: judges, - fees: tier1Fees + fees: tier1Fees, + guard: "v1-t1" }); + console2.log("strategy tier 1 - usdc", address(strategy)); // WETH - (, strategyId) = deployAaveV3Strategy({ + (strategy,) = deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0xD4a0e0b9149BCee3C920d2E00b5dE09138fd8bb7), @@ -82,11 +90,12 @@ contract DeployStrategies is BaseDeployStrategies { signerGroup: DEFAULT_SIGNER_GROUP, guardians: guardians, judges: judges, - fees: tier1Fees + fees: tier1Fees, + guard: "v1-t1" }); - + console2.log("strategy tier 1 - weth", address(strategy)); // cbBTC - (, strategyId) = deployAaveV3Strategy({ + (strategy,) = deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0xBdb9300b7CDE636d9cD4AFF00f6F009fFBBc8EE6), @@ -94,13 +103,15 @@ contract DeployStrategies is BaseDeployStrategies { signerGroup: DEFAULT_SIGNER_GROUP, guardians: guardians, judges: judges, - fees: tier1Fees + fees: tier1Fees, + guard: "v1-t1" }); + console2.log("strategy tier 1 - cbbtc", address(strategy)); // Tier 2 = 5% performance fee + 2.5% rescue fee Fees memory tier2Fees = Fees({ depositFee: 0, withdrawFee: 0, performanceFee: 500, rescueFee: 250 }); // USDC - (, strategyId) = deployAaveV3Strategy({ + (strategy,) = deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x4e65fE4DbA92790696d040ac24Aa414708F5c0AB), @@ -108,11 +119,13 @@ contract DeployStrategies is BaseDeployStrategies { signerGroup: DEFAULT_SIGNER_GROUP, guardians: guardians, judges: judges, - fees: tier2Fees + fees: tier2Fees, + guard: "v1-t2" }); + console2.log("strategy tier 2 - usdc", address(strategy)); // WETH - (, strategyId) = deployAaveV3Strategy({ + (strategy,) = deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0xD4a0e0b9149BCee3C920d2E00b5dE09138fd8bb7), @@ -120,26 +133,15 @@ contract DeployStrategies is BaseDeployStrategies { signerGroup: DEFAULT_SIGNER_GROUP, guardians: guardians, judges: judges, - fees: tier2Fees - }); - - // cbBTC - (, strategyId) = deployAaveV3Strategy({ - aaveV3Pool: aaveV3Pool, - aaveV3Rewards: aaveV3Rewards, - aToken: IAToken(0xBdb9300b7CDE636d9cD4AFF00f6F009fFBBc8EE6), - tosGroup: BALMY_GUARDIAN_TOS_GROUP, - signerGroup: DEFAULT_SIGNER_GROUP, - guardians: guardians, - judges: judges, - fees: tier2Fees + fees: tier2Fees, + guard: "v1-t2" }); - + console2.log("strategy tier 2 - weth", address(strategy)); // Tier 3 = 2.5% performance fee + 1% rescue fee Fees memory tier3Fees = Fees({ depositFee: 0, withdrawFee: 0, performanceFee: 250, rescueFee: 100 }); // USDC - (, strategyId) = deployAaveV3Strategy({ + (strategy,) = deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x4e65fE4DbA92790696d040ac24Aa414708F5c0AB), @@ -147,11 +149,12 @@ contract DeployStrategies is BaseDeployStrategies { signerGroup: DEFAULT_SIGNER_GROUP, guardians: guardians, judges: judges, - fees: tier3Fees + fees: tier3Fees, + guard: "v1-t3" }); - + console2.log("strategy tier 3 - usdc", address(strategy)); // WETH - (, strategyId) = deployAaveV3Strategy({ + (strategy,) = deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0xD4a0e0b9149BCee3C920d2E00b5dE09138fd8bb7), @@ -159,19 +162,9 @@ contract DeployStrategies is BaseDeployStrategies { signerGroup: DEFAULT_SIGNER_GROUP, guardians: guardians, judges: judges, - fees: tier3Fees - }); - - // cbBTC - (, strategyId) = deployAaveV3Strategy({ - aaveV3Pool: aaveV3Pool, - aaveV3Rewards: aaveV3Rewards, - aToken: IAToken(0xBdb9300b7CDE636d9cD4AFF00f6F009fFBBc8EE6), - tosGroup: BALMY_GUARDIAN_TOS_GROUP, - signerGroup: DEFAULT_SIGNER_GROUP, - guardians: guardians, - judges: judges, - fees: tier3Fees + fees: tier3Fees, + guard: "v1-t3" }); + console2.log("strategy tier 3 - weth", address(strategy)); } } diff --git a/script/strategies/aave-v3/optimism/DeployStrategies.sol b/script/strategies/aave-v3/optimism/DeployStrategies.sol index 5f57809..3a1bf0c 100644 --- a/script/strategies/aave-v3/optimism/DeployStrategies.sol +++ b/script/strategies/aave-v3/optimism/DeployStrategies.sol @@ -1,16 +1,19 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; -import { BaseDeployStrategies, IAToken } from "../BaseDeployStrategies.sol"; +import { BaseDeployStrategies, IAToken, IEarnBalmyStrategy } from "../BaseDeployStrategies.sol"; +import { DeployPeriphery } from "script/DeployPeriphery.sol"; +import { console2 } from "forge-std/console2.sol"; -contract DeployStrategies is BaseDeployStrategies { - function run() external virtual { +contract DeployStrategies is DeployPeriphery, BaseDeployStrategies { + function run() external override(DeployPeriphery) { vm.startBroadcast(); - deployStrategies(); + deployPeriphery(); + deployAaveV3Strategies(); vm.stopBroadcast(); } - function deployStrategies() internal { + function deployAaveV3Strategies() internal { address aaveV3Pool = 0x794a61358D6845594F94dc1DB02A252b5b4814aD; address aaveV3Rewards = 0x929EC64c34a17401F460460D4B9390518E5B473e; @@ -20,95 +23,131 @@ contract DeployStrategies is BaseDeployStrategies { address[] memory judges = new address[](1); judges[0] = getMsig(); - deployAaveV3Strategy({ + IEarnBalmyStrategy strategy; + + // WETH + (strategy,) = deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8), tosGroup: BALMY_GUARDIAN_TOS_GROUP, - signerGroup: DEFAULT_SIGNER_GROUP, + signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); + console2.log("strategy tier 0 - weth", address(strategy)); + + // USDC deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x625E7708f30cA75bfd92586e17077590C60eb4cD), tosGroup: BALMY_GUARDIAN_TOS_GROUP, - signerGroup: DEFAULT_SIGNER_GROUP, + signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); + console2.log("strategy tier 0 - usdc", address(strategy)); + + // WBTC deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x078f358208685046a11C85e8ad32895DED33A249), tosGroup: BALMY_GUARDIAN_TOS_GROUP, - signerGroup: DEFAULT_SIGNER_GROUP, + signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); + console2.log("strategy tier 0 - wbtc", address(strategy)); + + // USDT deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x6ab707Aca953eDAeFBc4fD23bA73294241490620), tosGroup: BALMY_GUARDIAN_TOS_GROUP, - signerGroup: DEFAULT_SIGNER_GROUP, + signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); + console2.log("strategy tier 0 - usdt", address(strategy)); + + // OP deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x513c7E3a9c69cA3e22550eF58AC1C0088e918FFf), tosGroup: BALMY_GUARDIAN_TOS_GROUP, - signerGroup: DEFAULT_SIGNER_GROUP, + signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); + console2.log("strategy tier 0 - op", address(strategy)); + + // SUSD deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x6d80113e533a2C0fe82EaBD35f1875DcEA89Ea97), tosGroup: BALMY_GUARDIAN_TOS_GROUP, - signerGroup: DEFAULT_SIGNER_GROUP, + signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); + console2.log("strategy tier 0 - susd", address(strategy)); + + // USDCn deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x38d693cE1dF5AaDF7bC62595A37D667aD57922e5), tosGroup: BALMY_GUARDIAN_TOS_GROUP, - signerGroup: DEFAULT_SIGNER_GROUP, + signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); + console2.log("strategy tier 0 - usdcn", address(strategy)); + + // DAI deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x82E64f49Ed5EC1bC6e43DAD4FC8Af9bb3A2312EE), tosGroup: BALMY_GUARDIAN_TOS_GROUP, - signerGroup: DEFAULT_SIGNER_GROUP, + signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); + console2.log("strategy tier 0 - dai", address(strategy)); + + // LUSD deployAaveV3Strategy({ aaveV3Pool: aaveV3Pool, aaveV3Rewards: aaveV3Rewards, aToken: IAToken(0x8Eb270e296023E9D92081fdF967dDd7878724424), tosGroup: BALMY_GUARDIAN_TOS_GROUP, - signerGroup: DEFAULT_SIGNER_GROUP, + signerGroup: bytes32(0), guardians: guardians, judges: judges, - fees: DEFAULT_FEES + fees: DEFAULT_FEES, + guard: "v1-t0" }); } } diff --git a/script/strategies/morpho/BaseDeployStrategies.sol b/script/strategies/morpho/BaseDeployStrategies.sol new file mode 100644 index 0000000..6634379 --- /dev/null +++ b/script/strategies/morpho/BaseDeployStrategies.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import { BaseDeployPeriphery } from "../../BaseDeployPeriphery.sol"; + +import { IEarnVault } from "@balmy/earn-core/interfaces/IEarnVault.sol"; +import { IGlobalEarnRegistry } from "src/interfaces/IGlobalEarnRegistry.sol"; +import { + MorphoStrategyFactory, + MorphoStrategy, + IERC4626, + MorphoStrategyData +} from "src/strategies/instances/morpho/MorphoStrategyFactory.sol"; +import { IEarnBalmyStrategy } from "src/interfaces/IEarnBalmyStrategy.sol"; +import { StrategyId } from "@balmy/earn-core/interfaces/IEarnStrategy.sol"; + +import { console2 } from "forge-std/console2.sol"; + +import { Fees } from "src/types/Fees.sol"; + +contract BaseDeployStrategies is BaseDeployPeriphery { + function deployMorphoStrategy( + IERC4626 mToken, + bytes32 tosGroup, + bytes32 signerGroup, + address[] memory guardians, + address[] memory judges, + Fees memory fees, + bytes32 guard + ) + internal + returns (IEarnBalmyStrategy strategy, StrategyId strategyId) + { + address implementation = deployContract("V1_S_MORPHO", abi.encodePacked(type(MorphoStrategy).creationCode)); + console2.log("Implementation deployed: ", implementation); + MorphoStrategyFactory morphoStrategyFactory = MorphoStrategyFactory( + deployContract( + "V1_F_MORPHO", abi.encodePacked(type(MorphoStrategyFactory).creationCode, abi.encode(implementation)) + ) + ); + console2.log("Factory deployed: ", address(morphoStrategyFactory)); + address vault = getDeployedAddress("V1_VAULT"); + console2.log("Vault deployed: ", vault); + address globalRegistry = getDeployedAddress("V1_GLOBAL_REGISTRY"); + console2.log("Global registry deployed: ", globalRegistry); + + bytes memory registryData = ""; + bytes memory manager1Data = tosGroup != bytes32(0) ? abi.encode(tosGroup) : bytes(""); + bytes memory manager2Data = signerGroup != bytes32(0) ? abi.encode(signerGroup) : bytes(""); + + bytes[] memory validationManagersStrategyData = new bytes[](2); + validationManagersStrategyData[0] = manager1Data; + validationManagersStrategyData[1] = manager2Data; + bytes memory creationValidationData = abi.encode(registryData, validationManagersStrategyData); + bytes memory guardianData = guardians.length > 0 || judges.length > 0 ? abi.encode(guardians, judges) : bytes(""); + bytes memory liquidityMiningData = ""; + bytes memory feesData = fees.equals(DEFAULT_FEES) ? bytes("") : abi.encode(fees); + bytes32 salt = keccak256(abi.encode("V1_S_MORPHO", guard)); + + address computedAddress = + morphoStrategyFactory.addressOfClone2(IEarnVault(vault), IGlobalEarnRegistry(globalRegistry), mToken, salt); + if (computedAddress.code.length > 0) { + console2.log("Strategy already deployed", computedAddress); + } else { + (strategy, strategyId) = morphoStrategyFactory.clone2StrategyAndRegister( + admin, + MorphoStrategyData( + IEarnVault(vault), + IGlobalEarnRegistry(globalRegistry), + mToken, + creationValidationData, + guardianData, + feesData, + liquidityMiningData + ), + salt + ); + console2.log("Strategy:", address(strategy)); + console2.log("Strategy ID:", StrategyId.unwrap(strategyId)); + } + } +} diff --git a/script/strategies/morpho/base/DeployStrategies.sol b/script/strategies/morpho/base/DeployStrategies.sol new file mode 100644 index 0000000..72115ba --- /dev/null +++ b/script/strategies/morpho/base/DeployStrategies.sol @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import { BaseDeployStrategies, IERC4626, IEarnBalmyStrategy } from "../BaseDeployStrategies.sol"; +import { Fees } from "src/strategies/layers/fees/external/FeeManager.sol"; +import { DeployPeriphery } from "script/DeployPeriphery.sol"; +import { console2 } from "forge-std/console2.sol"; + +contract DeployStrategies is DeployPeriphery, BaseDeployStrategies { + function run() external override(DeployPeriphery) { + vm.startBroadcast(); + deployPeriphery(); + deployMorphoStrategies(); + vm.stopBroadcast(); + } + + function deployMorphoStrategies() internal { + address[] memory guardians = new address[](1); + guardians[0] = 0x653c69a2dE94BeC3953C76c64763A1f1438207c6; + + address[] memory judges = new address[](1); + judges[0] = getMsig(); + + IEarnBalmyStrategy strategy; + // Tier 0 = default fees + + // Moonwell Flagship ETH + (strategy,) = deployMorphoStrategy({ + mToken: IERC4626(0xa0E430870c4604CcfC7B38Ca7845B1FF653D0ff1), + tosGroup: BALMY_GUARDIAN_TOS_GROUP, + signerGroup: bytes32(0), + guardians: guardians, + judges: judges, + fees: DEFAULT_FEES, + guard: "v1-t0" + }); + console2.log("strategy tier 0 - moonwell flagship eth", address(strategy)); + + // Gauntlet USDC Prime + (strategy,) = deployMorphoStrategy({ + mToken: IERC4626(0xeE8F4eC5672F09119b96Ab6fB59C27E1b7e44b61), + tosGroup: BALMY_GUARDIAN_TOS_GROUP, + signerGroup: bytes32(0), + guardians: guardians, + judges: judges, + fees: DEFAULT_FEES, + guard: "v1-t0" + }); + console2.log("strategy tier 0 - gauntlet usdc prime", address(strategy)); + + // Tier 1 = 7.5% performance fee + 3.75% rescue fee + Fees memory tier1Fees = Fees({ depositFee: 0, withdrawFee: 0, performanceFee: 750, rescueFee: 375 }); + + // Moonwell Flagship ETH + (strategy,) = deployMorphoStrategy({ + mToken: IERC4626(0xa0E430870c4604CcfC7B38Ca7845B1FF653D0ff1), + tosGroup: BALMY_GUARDIAN_TOS_GROUP, + signerGroup: DEFAULT_SIGNER_GROUP, + guardians: guardians, + judges: judges, + fees: tier1Fees, + guard: "v1-t1" + }); + console2.log("strategy tier 1 - moonwell flagship eth", address(strategy)); + + // Gauntlet USDC Prime + (strategy,) = deployMorphoStrategy({ + mToken: IERC4626(0xeE8F4eC5672F09119b96Ab6fB59C27E1b7e44b61), + tosGroup: BALMY_GUARDIAN_TOS_GROUP, + signerGroup: DEFAULT_SIGNER_GROUP, + guardians: guardians, + judges: judges, + fees: tier1Fees, + guard: "v1-t1" + }); + console2.log("strategy tier 1 - gauntlet usdc prime", address(strategy)); + + // Tier 2 = 5% performance fee + 2.5% rescue fee + Fees memory tier2Fees = Fees({ depositFee: 0, withdrawFee: 0, performanceFee: 500, rescueFee: 250 }); + + // Moonwell Flagship ETH + (strategy,) = deployMorphoStrategy({ + mToken: IERC4626(0xa0E430870c4604CcfC7B38Ca7845B1FF653D0ff1), + tosGroup: BALMY_GUARDIAN_TOS_GROUP, + signerGroup: DEFAULT_SIGNER_GROUP, + guardians: guardians, + judges: judges, + fees: tier2Fees, + guard: "v1-t2" + }); + console2.log("strategy tier 2 - moonwell flagship eth", address(strategy)); + + // Gauntlet USDC Prime + (strategy,) = deployMorphoStrategy({ + mToken: IERC4626(0xeE8F4eC5672F09119b96Ab6fB59C27E1b7e44b61), + tosGroup: BALMY_GUARDIAN_TOS_GROUP, + signerGroup: DEFAULT_SIGNER_GROUP, + guardians: guardians, + judges: judges, + fees: tier2Fees, + guard: "v1-t2" + }); + console2.log("strategy tier 2 - gauntlet usdc prime", address(strategy)); + + // Tier 3 = 2.5% performance fee + 1% rescue fee + Fees memory tier3Fees = Fees({ depositFee: 0, withdrawFee: 0, performanceFee: 250, rescueFee: 100 }); + + // Moonwell Flagship ETH + (strategy,) = deployMorphoStrategy({ + mToken: IERC4626(0xa0E430870c4604CcfC7B38Ca7845B1FF653D0ff1), + tosGroup: BALMY_GUARDIAN_TOS_GROUP, + signerGroup: DEFAULT_SIGNER_GROUP, + guardians: guardians, + judges: judges, + fees: tier3Fees, + guard: "v1-t3" + }); + console2.log("strategy tier 3 - moonwell flagship eth", address(strategy)); + + // Gauntlet USDC Prime + (strategy,) = deployMorphoStrategy({ + mToken: IERC4626(0xeE8F4eC5672F09119b96Ab6fB59C27E1b7e44b61), + tosGroup: BALMY_GUARDIAN_TOS_GROUP, + signerGroup: DEFAULT_SIGNER_GROUP, + guardians: guardians, + judges: judges, + fees: tier3Fees, + guard: "v1-t3" + }); + console2.log("strategy tier 3 - gauntlet usdc prime", address(strategy)); + } +}