From aebcc678af1c5b86ee577feb35a8f17298242b98 Mon Sep 17 00:00:00 2001 From: Andrew Zhou Date: Fri, 27 Sep 2024 10:56:24 -0700 Subject: [PATCH] strategy management script --- .../actions-sepolia-manage-strategy.yaml | 6 ++ script/VaultStrategySwitch.s.sol | 61 +++++++++++++++++-- 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/.github/workflows/actions-sepolia-manage-strategy.yaml b/.github/workflows/actions-sepolia-manage-strategy.yaml index 79c144e..43097cb 100644 --- a/.github/workflows/actions-sepolia-manage-strategy.yaml +++ b/.github/workflows/actions-sepolia-manage-strategy.yaml @@ -6,10 +6,15 @@ on: description: 'New strategy address' required: true default: '0x' + strategiesDefaultQueue: + description: 'Strategies default queue' + required: true + default: '0x' oldStrategy: description: 'Old strategy address' required: false default: '0x' + jobs: @@ -34,5 +39,6 @@ jobs: ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} YEARN_VAULT_ADDRESS: ${{ vars.YEARN_VAULT_ADDRESS }} NEW_STRATEGY_ADDRESS: ${{ github.event.inputs.newStrategy }} + STRATEGIES_DEFAULT_QUEUE: ${{ github.event.inputs.strategiesDefaultQueue }} OLD_STRATEGY_ADDRESS: ${{ github.event.inputs.oldStrategy }} \ No newline at end of file diff --git a/script/VaultStrategySwitch.s.sol b/script/VaultStrategySwitch.s.sol index 2835bbf..2f9d93f 100644 --- a/script/VaultStrategySwitch.s.sol +++ b/script/VaultStrategySwitch.s.sol @@ -19,16 +19,15 @@ contract VaultStrategySwitch is Script { // Retrieve environment variables address yearnVaultAddress = vm.envAddress("YEARN_VAULT_ADDRESS"); address newStrategy = vm.envAddress("NEW_STRATEGY_ADDRESS"); + address[] memory strategiesDefaultQueue = stringToAddresses(vm.envString("STRATEGIES_DEFAULT_QUEUE"), ","); address oldStrategy = vm.envOr("OLD_STRATEGY_ADDRESS", address(0)); - - address[] memory strategies = new address[](1); - strategies[0] = newStrategy; + IVault vault = IVault(yearnVaultAddress); vault.add_strategy(newStrategy); console.log("added strategy to vault"); console.log(newStrategy); - vault.set_default_queue(strategies); + vault.set_default_queue(strategiesDefaultQueue); console.log("set default queue for vault"); @@ -41,9 +40,61 @@ contract VaultStrategySwitch is Script { console.log("revoked strategy from vault"); console.log(oldStrategy); - vault.set_default_queue(strategies); + vault.set_default_queue(strategiesDefaultQueue); console.log("set default queue for vault"); } vm.stopBroadcast(); } + + function stringToAddresses(string memory _str, string memory _delimiter) internal pure returns (address[] memory) { + // Split the string + string[] memory parts = split(_str, _delimiter); + + // Convert each part to an address + address[] memory addresses = new address[](parts.length); + for (uint i = 0; i < parts.length; i++) { + addresses[i] = vm.parseAddress(parts[i]); + } + + return addresses; + } + + function split(string memory _base, string memory _delimiter) internal pure returns (string[] memory) { + bytes memory baseBytes = bytes(_base); + bytes memory delBytes = bytes(_delimiter); + + uint count = 1; + for (uint i = 0; i < baseBytes.length; i++) { + if (keccak256(abi.encodePacked(baseBytes[i])) == keccak256(abi.encodePacked(delBytes[0]))) { + count++; + } + } + + string[] memory parts = new string[](count); + + count = 0; + uint lastIndex = 0; + for (uint i = 0; i < baseBytes.length; i++) { + if (keccak256(abi.encodePacked(baseBytes[i])) == keccak256(abi.encodePacked(delBytes[0]))) { + parts[count] = substring(_base, lastIndex, i); + lastIndex = i + 1; + count++; + } + } + parts[count] = substring(_base, lastIndex, baseBytes.length); + + return parts; + } + + function substring(string memory _base, uint _start, uint _end) internal pure returns (string memory) { + bytes memory baseBytes = bytes(_base); + require(_start <= _end && _end <= baseBytes.length, "Invalid substring range"); + + bytes memory result = new bytes(_end - _start); + for (uint i = _start; i < _end; i++) { + result[i - _start] = baseBytes[i]; + } + + return string(result); + } }