From 7a9ed71ef407e3ce18c3f690abb4121690f9178a Mon Sep 17 00:00:00 2001 From: danoctavian Date: Sun, 24 Mar 2024 02:52:33 +0200 Subject: [PATCH] update deployment scripts --- scripts/forge/BaseScript.s.sol | 7 ++- scripts/forge/DeployYieldNest.s.sol | 27 ++++++++-- scripts/forge/DeployYnLSD.s.sol | 76 +++++++++++++++++------------ 3 files changed, 74 insertions(+), 36 deletions(-) diff --git a/scripts/forge/BaseScript.s.sol b/scripts/forge/BaseScript.s.sol index 2f204003e..6eb83cfb2 100644 --- a/scripts/forge/BaseScript.s.sol +++ b/scripts/forge/BaseScript.s.sol @@ -7,6 +7,7 @@ import "../../src/StakingNode.sol"; import "../../src/RewardsReceiver.sol"; import "../../src/ynLSD.sol"; import "../../src/YieldNestOracle.sol"; +import "../../src/ynViewer.sol"; import "../../src/LSDStakingNode.sol"; import "../../src/RewardsDistributor.sol"; import "../../src/external/tokens/WETH.sol"; @@ -27,6 +28,7 @@ abstract contract BaseScript is Script, Utils { RewardsReceiver consensusLayerReceiver; RewardsDistributor rewardsDistributor; StakingNode stakingNodeImplementation; + ynViewer ynViewer; } struct ynLSDDeployment { @@ -49,6 +51,7 @@ abstract contract BaseScript is Script, Utils { vm.serializeAddress(json, "consensusLayerReceiver", address(deployment.consensusLayerReceiver)); vm.serializeAddress(json, "rewardsDistributor", address(deployment.rewardsDistributor)); vm.serializeAddress(json, "stakingNodeImplementation", address(deployment.stakingNodeImplementation)); + vm.serializeAddress(json, "ynViewer", address(deployment.ynViewer)); string memory finalJson = vm.serializeString(json, "object", "dummy"); vm.writeJson(finalJson, getDeploymentFile()); @@ -59,6 +62,7 @@ abstract contract BaseScript is Script, Utils { string memory jsonContent = vm.readFile(deploymentFile); Deployment memory deployment; deployment.ynETH = ynETH(payable(jsonContent.readAddress(".ynETH"))); + deployment.ynViewer = ynViewer(payable(jsonContent.readAddress(".ynViewer"))); deployment.stakingNodesManager = StakingNodesManager(payable(jsonContent.readAddress(".stakingNodesManager"))); deployment.executionLayerReceiver = RewardsReceiver(payable(jsonContent.readAddress(".executionLayerReceiver"))); deployment.consensusLayerReceiver = RewardsReceiver(payable(jsonContent.readAddress(".consensusLayerReceiver"))); @@ -103,7 +107,8 @@ abstract contract BaseScript is Script, Utils { LSD_RESTAKING_MANAGER: vm.envAddress("LSD_RESTAKING_MANAGER_ADDRESS"), STAKING_NODE_CREATOR: vm.envAddress("LSD_STAKING_NODE_CREATOR_ADDRESS"), ORACLE_MANAGER: vm.envAddress("YIELDNEST_ORACLE_MANAGER_ADDRESS"), - DEPOSIT_BOOTSTRAPER: vm.envAddress("DEPOSIT_BOOTSTRAPER_ADDRESS") + DEPOSIT_BOOTSTRAPER: vm.envAddress("DEPOSIT_BOOTSTRAPER_ADDRESS"), + VALIDATOR_REMOVER_MANAGER: vm.envAddress("VALIDATOR_REMOVER_MANAGER_ADDRESS") }); } diff --git a/scripts/forge/DeployYieldNest.s.sol b/scripts/forge/DeployYieldNest.s.sol index 055ad356a..2dc190717 100644 --- a/scripts/forge/DeployYieldNest.s.sol +++ b/scripts/forge/DeployYieldNest.s.sol @@ -9,6 +9,7 @@ import "../../src/StakingNodesManager.sol"; import "../../src/RewardsReceiver.sol"; import "../../src/RewardsDistributor.sol"; import "../../src/ynETH.sol"; +import "../../src/StakingNodeV2.sol"; import "../../src/interfaces/IStakingNode.sol"; import "../../src/external/ethereum/IDepositContract.sol"; import "../../src/interfaces/IRewardsDistributor.sol"; @@ -81,9 +82,22 @@ contract DeployYieldNest is BaseScript { // Deploy implementations yneth = new ynETH(); stakingNodesManager = new StakingNodesManager(); - executionLayerReceiver = new RewardsReceiver(); - consensusLayerReceiver = new RewardsReceiver(); // Instantiating consensusLayerReceiver - stakingNodeImplementation = new StakingNode(); + + { + RewardsReceiver rewardsReceiverImplementation = new RewardsReceiver(); + TransparentUpgradeableProxy executionLayerReceiverProxy = new TransparentUpgradeableProxy(address(rewardsReceiverImplementation), actors.PROXY_ADMIN_OWNER, ""); + executionLayerReceiver = RewardsReceiver(payable(executionLayerReceiverProxy)); + + TransparentUpgradeableProxy consensusLayerReceiverProxy = new TransparentUpgradeableProxy(address(rewardsReceiverImplementation), actors.PROXY_ADMIN_OWNER, ""); + consensusLayerReceiver = RewardsReceiver(payable(consensusLayerReceiverProxy)); + } + + if (block.chainid == 17000) { // holeksy + stakingNodeImplementation = new StakingNode(); + } else { + stakingNodeImplementation = new StakingNodeV2(); + } + yieldNestOracle = new YieldNestOracle(); ynlsd = new ynLSD(); @@ -119,13 +133,13 @@ contract DeployYieldNest is BaseScript { }); yneth.initialize(ynethInit); - // Initialize StakingNodesManager with example parameters StakingNodesManager.Init memory stakingNodesManagerInit = StakingNodesManager.Init({ admin: actors.ADMIN, stakingAdmin: actors.STAKING_ADMIN, stakingNodesAdmin: actors.STAKING_NODES_ADMIN, validatorManager: actors.VALIDATOR_MANAGER, + validatorRemoverManager: actors.VALIDATOR_REMOVER_MANAGER, stakingNodeCreatorRole: actors.STAKING_NODE_CREATOR, maxNodeCount: 10, depositContract: depositContract, @@ -157,6 +171,8 @@ contract DeployYieldNest is BaseScript { executionLayerReceiver.initialize(rewardsReceiverInit); consensusLayerReceiver.initialize(rewardsReceiverInit); // Initializing consensusLayerReceiver + ynViewer ynviewer = new ynViewer(IynETH(address(yneth)), IStakingNodesManager(address(stakingNodesManager))); + vm.stopBroadcast(); Deployment memory deployment = Deployment({ @@ -165,8 +181,11 @@ contract DeployYieldNest is BaseScript { executionLayerReceiver: executionLayerReceiver, consensusLayerReceiver: consensusLayerReceiver, // Adding consensusLayerReceiver to the deployment rewardsDistributor: rewardsDistributor, + ynViewer: ynviewer, stakingNodeImplementation: stakingNodeImplementation }); + + saveDeployment(deployment); } diff --git a/scripts/forge/DeployYnLSD.s.sol b/scripts/forge/DeployYnLSD.s.sol index aca8f9682..1d208d9f9 100644 --- a/scripts/forge/DeployYnLSD.s.sol +++ b/scripts/forge/DeployYnLSD.s.sol @@ -61,17 +61,54 @@ contract DeployYnLSD is BaseScript { } IERC20[] memory assets = new IERC20[](2); - assets[0] = IERC20(chainAddresses.lsd.RETH_ADDRESS); - assets[1] = IERC20(chainAddresses.lsd.STETH_ADDRESS); + assets[0] = IERC20(chainAddresses.lsd.STETH_ADDRESS); + assets[1] = IERC20(chainAddresses.lsd.RETH_ADDRESS); + IStrategy[] memory strategies = new IStrategy[](2); - strategies[0] = IStrategy(chainAddresses.lsd.RETH_STRATEGY_ADDRESS); - strategies[1] = IStrategy(chainAddresses.lsd.STETH_STRATEGY_ADDRESS); + strategies[0] = IStrategy(chainAddresses.lsd.STETH_STRATEGY_ADDRESS); + strategies[1] = IStrategy(chainAddresses.lsd.RETH_STRATEGY_ADDRESS); + + { + uint256[] memory maxAgesArray = new uint256[](assets.length); + address[] memory priceFeedAddresses = new address[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + maxAgesArray[i] = type(uint256).max; + if (assets[i] == IERC20(chainAddresses.lsd.RETH_ADDRESS)) { + priceFeedAddresses[i] = chainAddresses.lsd.RETH_FEED_ADDRESS; + } else if (assets[i] == IERC20(chainAddresses.lsd.STETH_ADDRESS)) { + priceFeedAddresses[i] = chainAddresses.lsd.STETH_FEED_ADDRESS; + } + } + { + address[] memory assetsAddresses = new address[](assets.length); + for (uint256 i = 0; i < assets.length; i++) { + assetsAddresses[i] = address(assets[i]); + } + YieldNestOracle.Init memory yieldNestOracleInit = YieldNestOracle.Init({ + assets: assetsAddresses, + priceFeedAddresses: priceFeedAddresses, + maxAges: maxAgesArray, + admin: actors.ORACLE_MANAGER, + oracleManager: actors.ORACLE_MANAGER + }); + yieldNestOracle.initialize(yieldNestOracleInit); + } + + + } + // Initialize ynLSD with example parameters { address[] memory lsdPauseWhitelist = new address[](1); lsdPauseWhitelist[0] = _broadcaster; + IERC20 stETH = IERC20(chainAddresses.lsd.STETH_ADDRESS); + uint256 mintAmount = 1.0001 ether; + (bool success, ) = address(stETH).call{value: mintAmount}(""); + require(success, "ETH to stETH mint failed"); + stETH.approve(address(ynlsd), mintAmount); + ynLSD.Init memory ynlsdInit = ynLSD.Init({ assets: assets, strategies: strategies, @@ -84,37 +121,12 @@ contract DeployYnLSD is BaseScript { stakingAdmin: actors.STAKING_ADMIN, lsdRestakingManager: actors.LSD_RESTAKING_MANAGER, // Assuming no restaking manager is set initially lsdStakingNodeCreatorRole: actors.STAKING_NODE_CREATOR, // Assuming no staking node creator role is set initially - pauseWhitelist: lsdPauseWhitelist + pauseWhitelist: lsdPauseWhitelist, + depositBootstrapper: actors.DEPOSIT_BOOTSTRAPER }); ynlsd.initialize(ynlsdInit); } - uint256[] memory maxAgesArray = new uint256[](assets.length); - address[] memory priceFeedAddresses = new address[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - maxAgesArray[i] = type(uint256).max; - if (assets[i] == IERC20(chainAddresses.lsd.RETH_ADDRESS)) { - priceFeedAddresses[i] = chainAddresses.lsd.RETH_FEED_ADDRESS; - } else if (assets[i] == IERC20(chainAddresses.lsd.STETH_ADDRESS)) { - priceFeedAddresses[i] = chainAddresses.lsd.STETH_FEED_ADDRESS; - } - } - - { - address[] memory assetsAddresses = new address[](assets.length); - for (uint256 i = 0; i < assets.length; i++) { - assetsAddresses[i] = address(assets[i]); - } - YieldNestOracle.Init memory yieldNestOracleInit = YieldNestOracle.Init({ - assets: assetsAddresses, - priceFeedAddresses: priceFeedAddresses, - maxAges: maxAgesArray, - admin: actors.ORACLE_MANAGER, - oracleManager: actors.ORACLE_MANAGER - }); - yieldNestOracle.initialize(yieldNestOracleInit); - } - { LSDStakingNode lsdStakingNodeImplementation = new LSDStakingNode(); ynlsd.registerLSDStakingNodeImplementationContract(address(lsdStakingNodeImplementation)); @@ -127,5 +139,7 @@ contract DeployYnLSD is BaseScript { saveynLSDDeployment(deployment); } + + vm.stopBroadcast(); } }