From 22b03458e4cbe99f34f32fbb87e0b975ca0c108f Mon Sep 17 00:00:00 2001 From: Thrilok kumar Date: Wed, 27 Mar 2024 21:57:19 -0400 Subject: [PATCH 1/8] IGP 16 --- contracts/payloads/IGP16/PayloadIGP16.sol | 469 ++++++++++++++++++++++ 1 file changed, 469 insertions(+) create mode 100644 contracts/payloads/IGP16/PayloadIGP16.sol diff --git a/contracts/payloads/IGP16/PayloadIGP16.sol b/contracts/payloads/IGP16/PayloadIGP16.sol new file mode 100644 index 0000000..020ddd2 --- /dev/null +++ b/contracts/payloads/IGP16/PayloadIGP16.sol @@ -0,0 +1,469 @@ +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +interface IGovernorBravo { + function _acceptAdmin() external; + + function _setVotingDelay(uint newVotingDelay) external; + + function _setVotingPeriod(uint newVotingPeriod) external; + + function _acceptAdminOnTimelock() external; + + function _setImplementation(address implementation_) external; + + function propose( + address[] memory targets, + uint[] memory values, + string[] memory signatures, + bytes[] memory calldatas, + string memory description + ) external returns (uint); + + function admin() external view returns (address); + + function pendingAdmin() external view returns (address); + + function timelock() external view returns (address); + + function votingDelay() external view returns (uint256); + + function votingPeriod() external view returns (uint256); +} + +interface ITimelock { + function acceptAdmin() external; + + function setDelay(uint delay_) external; + + function setPendingAdmin(address pendingAdmin_) external; + + function queueTransaction( + address target, + uint value, + string memory signature, + bytes memory data, + uint eta + ) external returns (bytes32); + + function executeTransaction( + address target, + uint value, + string memory signature, + bytes memory data, + uint eta + ) external payable returns (bytes memory); + + function pendingAdmin() external view returns (address); + + function admin() external view returns (address); + + function delay() external view returns (uint256); +} + +interface AdminModuleStructs { + struct AddressBool { + address addr; + bool value; + } + + struct AddressUint256 { + address addr; + uint256 value; + } + + struct RateDataV1Params { + address token; + uint256 kink; + uint256 rateAtUtilizationZero; + uint256 rateAtUtilizationKink; + uint256 rateAtUtilizationMax; + } + + struct RateDataV2Params { + address token; + uint256 kink1; + uint256 kink2; + uint256 rateAtUtilizationZero; + uint256 rateAtUtilizationKink1; + uint256 rateAtUtilizationKink2; + uint256 rateAtUtilizationMax; + } + + struct TokenConfig { + address token; + uint256 fee; + uint256 threshold; + } + + struct UserSupplyConfig { + address user; + address token; + uint8 mode; + uint256 expandPercent; + uint256 expandDuration; + uint256 baseWithdrawalLimit; + } + + struct UserBorrowConfig { + address user; + address token; + uint8 mode; + uint256 expandPercent; + uint256 expandDuration; + uint256 baseDebtCeiling; + uint256 maxDebtCeiling; + } +} + +interface IFluidLiquidityAdmin { + /// @notice adds/removes auths. Auths generally could be contracts which can have restricted actions defined on contract. + /// auths can be helpful in reducing governance overhead where it's not needed. + /// @param authsStatus_ array of structs setting allowed status for an address. + /// status true => add auth, false => remove auth + function updateAuths( + AdminModuleStructs.AddressBool[] calldata authsStatus_ + ) external; + + /// @notice adds/removes guardians. Only callable by Governance. + /// @param guardiansStatus_ array of structs setting allowed status for an address. + /// status true => add guardian, false => remove guardian + function updateGuardians( + AdminModuleStructs.AddressBool[] calldata guardiansStatus_ + ) external; + + /// @notice changes the revenue collector address (contract that is sent revenue). Only callable by Governance. + /// @param revenueCollector_ new revenue collector address + function updateRevenueCollector(address revenueCollector_) external; + + /// @notice changes current status, e.g. for pausing or unpausing all user operations. Only callable by Auths. + /// @param newStatus_ new status + /// status = 2 -> pause, status = 1 -> resume. + function changeStatus(uint256 newStatus_) external; + + /// @notice update tokens rate data version 1. Only callable by Auths. + /// @param tokensRateData_ array of RateDataV1Params with rate data to set for each token + function updateRateDataV1s( + AdminModuleStructs.RateDataV1Params[] calldata tokensRateData_ + ) external; + + /// @notice update tokens rate data version 2. Only callable by Auths. + /// @param tokensRateData_ array of RateDataV2Params with rate data to set for each token + function updateRateDataV2s( + AdminModuleStructs.RateDataV2Params[] calldata tokensRateData_ + ) external; + + /// @notice updates token configs: fee charge on borrowers interest & storage update utilization threshold. + /// Only callable by Auths. + /// @param tokenConfigs_ contains token address, fee & utilization threshold + function updateTokenConfigs( + AdminModuleStructs.TokenConfig[] calldata tokenConfigs_ + ) external; + + /// @notice updates user classes: 0 is for new protocols, 1 is for established protocols. + /// Only callable by Auths. + /// @param userClasses_ struct array of uint256 value to assign for each user address + function updateUserClasses( + AdminModuleStructs.AddressUint256[] calldata userClasses_ + ) external; + + /// @notice sets user supply configs per token basis. Eg: with interest or interest-free and automated limits. + /// Only callable by Auths. + /// @param userSupplyConfigs_ struct array containing user supply config, see `UserSupplyConfig` struct for more info + function updateUserSupplyConfigs( + AdminModuleStructs.UserSupplyConfig[] memory userSupplyConfigs_ + ) external; + + /// @notice setting user borrow configs per token basis. Eg: with interest or interest-free and automated limits. + /// Only callable by Auths. + /// @param userBorrowConfigs_ struct array containing user borrow config, see `UserBorrowConfig` struct for more info + function updateUserBorrowConfigs( + AdminModuleStructs.UserBorrowConfig[] memory userBorrowConfigs_ + ) external; + + /// @notice pause operations for a particular user in class 0 (class 1 users can't be paused by guardians). + /// Only callable by Guardians. + /// @param user_ address of user to pause operations for + /// @param supplyTokens_ token addresses to pause withdrawals for + /// @param borrowTokens_ token addresses to pause borrowings for + function pauseUser( + address user_, + address[] calldata supplyTokens_, + address[] calldata borrowTokens_ + ) external; + + /// @notice unpause operations for a particular user in class 0 (class 1 users can't be paused by guardians). + /// Only callable by Guardians. + /// @param user_ address of user to unpause operations for + /// @param supplyTokens_ token addresses to unpause withdrawals for + /// @param borrowTokens_ token addresses to unpause borrowings for + function unpauseUser( + address user_, + address[] calldata supplyTokens_, + address[] calldata borrowTokens_ + ) external; + + /// @notice collects revenue for tokens to configured revenueCollector address. + /// @param tokens_ array of tokens to collect revenue for + /// @dev Note that this can revert if token balance is < revenueAmount (utilization > 100%) + function collectRevenue(address[] calldata tokens_) external; + + /// @notice gets the current updated exchange prices for n tokens and updates all prices, rates related data in storage. + /// @param tokens_ tokens to update exchange prices for + /// @return supplyExchangePrices_ new supply rates of overall system for each token + /// @return borrowExchangePrices_ new borrow rates of overall system for each token + function updateExchangePrices( + address[] calldata tokens_ + ) + external + returns ( + uint256[] memory supplyExchangePrices_, + uint256[] memory borrowExchangePrices_ + ); +} + +interface IFluidVaultT1Factory { + function deployVault( + address vaultDeploymentLogic_, + bytes calldata vaultDeploymentData_ + ) external returns (address vault_); + + function setVaultAuth( + address vault_, + address vaultAuth_, + bool allowed_ + ) external; +} + +interface IFluidVaultT1DeploymentLogic { + function vaultT1(address supplyToken_, address borrowToken_) external; +} + +interface IFluidVaultT1 { + /// @notice updates the Vault oracle to `newOracle_`. Must implement the FluidOracle interface. + function updateOracle(address newOracle_) external; + + /// @notice updates the all Vault core settings according to input params. + /// All input values are expected in 1e2 (1% = 100, 100% = 10_000). + function updateCoreSettings( + uint256 supplyRateMagnifier_, + uint256 borrowRateMagnifier_, + uint256 collateralFactor_, + uint256 liquidationThreshold_, + uint256 liquidationMaxLimit_, + uint256 withdrawGap_, + uint256 liquidationPenalty_, + uint256 borrowFee_ + ) external; + + /// @notice updates the allowed rebalancer to `newRebalancer_`. + function updateRebalancer(address newRebalancer_) external; + + /// @notice updates the supply rate magnifier to `supplyRateMagnifier_`. Input in 1e2 (1% = 100, 100% = 10_000). + function updateSupplyRateMagnifier(uint supplyRateMagnifier_) external; + + /// @notice updates the collateral factor to `collateralFactor_`. Input in 1e2 (1% = 100, 100% = 10_000). + function updateCollateralFactor(uint collateralFactor_) external; +} + +interface IFTokenAdmin { + /// @notice updates the rewards rate model contract. + /// Only callable by LendingFactory auths. + /// @param rewardsRateModel_ the new rewards rate model contract address. + /// can be set to address(0) to set no rewards (to save gas) + function updateRewards(address rewardsRateModel_) external; + + /// @notice Balances out the difference between fToken supply at Liquidity vs totalAssets(). + /// Deposits underlying from rebalancer address into Liquidity but doesn't mint any shares + /// -> thus making deposit available as rewards. + /// Only callable by rebalancer. + /// @return assets_ amount deposited to Liquidity + function rebalance() external payable returns (uint256 assets_); + + /// @notice gets the liquidity exchange price of the underlying asset, calculates the updated exchange price (with reward rates) + /// and writes those values to storage. + /// Callable by anyone. + /// @return tokenExchangePrice_ exchange price of fToken share to underlying asset + /// @return liquidityExchangePrice_ exchange price at Liquidity for the underlying asset + function updateRates() + external + returns (uint256 tokenExchangePrice_, uint256 liquidityExchangePrice_); + + /// @notice sends any potentially stuck funds to Liquidity contract. Only callable by LendingFactory auths. + function rescueFunds(address token_) external; + + /// @notice Updates the rebalancer address (ReserveContract). Only callable by LendingFactory auths. + function updateRebalancer(address rebalancer_) external; +} + +contract PayloadIGP16 { + uint256 public constant PROPOSAL_ID = 16; + + address public constant PROPOSER = + 0xA45f7bD6A5Ff45D31aaCE6bCD3d426D9328cea01; + + address public constant PROPOSER_AVO_MULTISIG = + 0x059A94A72951c0ae1cc1CE3BF0dB52421bbE8210; + + IGovernorBravo public constant GOVERNOR = + IGovernorBravo(0x0204Cd037B2ec03605CFdFe482D8e257C765fA1B); + ITimelock public immutable TIMELOCK = + ITimelock(0x2386DC45AdDed673317eF068992F19421B481F4c); + + address public immutable ADDRESS_THIS; + + address public constant TEAM_MULTISIG = + 0x4F6F977aCDD1177DCD81aB83074855EcB9C2D49e; + + IFluidLiquidityAdmin public constant LIQUIDITY = + IFluidLiquidityAdmin(0x52Aa899454998Be5b000Ad077a46Bbe360F4e497); + + address public constant USDC_ADDRESS = + 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address public constant USDT_ADDRESS = + 0xdAC17F958D2ee523a2206206994597C13D831ec7; + + address public constant ETH_ADDRESS = + 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + address public constant weETH_ADDRESS = + 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee; + address public constant wstETH_ADDRESS = + 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0; + + address public constant VAULT_ETH_USDC = address(0xeAbBfca72F8a8bf14C4ac59e69ECB2eB69F0811C); + address public constant VAULT_ETH_USDT = address(0xbEC491FeF7B4f666b270F9D5E5C3f443cBf20991); + address public constant VAULT_weETH_wstETH = address(0x40D9b8417E6E1DcD358f04E3328bCEd061018A82); + + + + constructor() { + ADDRESS_THIS = address(this); + } + + function propose(string memory description) external { + require( + msg.sender == PROPOSER || + msg.sender == TEAM_MULTISIG || + address(this) == PROPOSER_AVO_MULTISIG, + "msg.sender-not-allowed" + ); + + uint256 totalActions = 1; + address[] memory targets = new address[](totalActions); + uint256[] memory values = new uint256[](totalActions); + string[] memory signatures = new string[](totalActions); + bytes[] memory calldatas = new bytes[](totalActions); + + // Action 1: call executePayload on timelock contract to execute payload related to Fluid + targets[0] = address(TIMELOCK); + values[0] = 0; + signatures[0] = "executePayload(address,string,bytes)"; + calldatas[0] = abi.encode(ADDRESS_THIS, "execute()", abi.encode()); + + uint256 proposedId = GOVERNOR.propose( + targets, + values, + signatures, + calldatas, + description + ); + + require(proposedId == PROPOSAL_ID, "PROPOSAL_IS_NOT_SAME"); + } + + function execute() external { + require(address(this) == address(TIMELOCK), "not-valid-caller"); + + // Action 1: Update wstETH market rate curve and set fee as 10% + action1(); + + // Action 2: Update ETH market rate curve. + action2(); + + // Action 3: Update weETH/wstETH Vault borrow limit + action3(); + + // Action 4: Pause ETH Rewards on ETH Vaults + action4(); + } + + function verifyProposal() external view {} + + /***********************************| + | Proposal Payload Actions | + |__________________________________*/ + + /// @notice Action 1: Update wstETH market rate curve and set fee as 10% + function action1() internal { + { + AdminModuleStructs.RateDataV2Params[] + memory params_ = new AdminModuleStructs.RateDataV2Params[](1); + + params_[0] = AdminModuleStructs.RateDataV2Params({ + token: wstETH_ADDRESS, // wstETH + kink1: 70 * 1e2, // 70% + kink2: 90 * 1e2, // 90% + rateAtUtilizationZero: 0, // 0% + rateAtUtilizationKink1: 20 * 1e2, // 20% + rateAtUtilizationKink2: 40 * 1e2, // 40% + rateAtUtilizationMax: 150 * 1e2 // 150% + }); + + LIQUIDITY.updateRateDataV2s(params_); + } + + { + AdminModuleStructs.TokenConfig[] + memory params_ = new AdminModuleStructs.TokenConfig[](1); + + params_[0] = AdminModuleStructs.TokenConfig({ + token: wstETH_ADDRESS, // wstETH + threshold: 0.3 * 1e2, // 0.3 + fee: 10 * 1e2 // 10% + }); + + LIQUIDITY.updateTokenConfigs(params_); + } + } + + /// @notice Action 2: Update ETH market rate curve. + function action2() internal { + AdminModuleStructs.RateDataV2Params[] + memory params_ = new AdminModuleStructs.RateDataV2Params[](1); + + params_[0] = AdminModuleStructs.RateDataV2Params({ + token: ETH_ADDRESS, // ETH + kink1: 70 * 1e2, // 70% + kink2: 90 * 1e2, // 90% + rateAtUtilizationZero: 0, // 0% + rateAtUtilizationKink1: 15 * 1e2, // 15% + rateAtUtilizationKink2: 25 * 1e2, // 25% + rateAtUtilizationMax: 150 * 1e2 // 150% + }); + + LIQUIDITY.updateRateDataV2s(params_); + } + + /// @notice Action 3: Update weETH/wstETH Vault borrow limit + function action3() internal { + AdminModuleStructs.UserBorrowConfig[] + memory configs_ = new AdminModuleStructs.UserBorrowConfig[](1); + + configs_[0] = AdminModuleStructs.UserBorrowConfig({ + user: address(VAULT_weETH_wstETH), + token: wstETH_ADDRESS, + mode: 1, + expandPercent: 25 * 1e2, // 25% + expandDuration: 12 hours, // 12 hours + baseDebtCeiling: 4000 * 1e18, // 4000 wstETH + maxDebtCeiling: 15000 * 1e18 // 15_000 wstETH + }); + + LIQUIDITY.updateUserBorrowConfigs(configs_); + } + + /// @notice Action 4: Pause ETH Rewards on ETH Vaults + function action4() internal { + // TODO + } +} \ No newline at end of file From 30582b5b01857a14f211ef76d535c7e1c007e7d1 Mon Sep 17 00:00:00 2001 From: Thrilok kumar Date: Mon, 1 Apr 2024 17:26:11 +0530 Subject: [PATCH 2/8] wip --- contracts/payloads/IGP16/PayloadIGP16.sol | 98 ++++++++++++++++++----- 1 file changed, 79 insertions(+), 19 deletions(-) diff --git a/contracts/payloads/IGP16/PayloadIGP16.sol b/contracts/payloads/IGP16/PayloadIGP16.sol index 020ddd2..02a657a 100644 --- a/contracts/payloads/IGP16/PayloadIGP16.sol +++ b/contracts/payloads/IGP16/PayloadIGP16.sol @@ -317,6 +317,8 @@ contract PayloadIGP16 { IFluidLiquidityAdmin public constant LIQUIDITY = IFluidLiquidityAdmin(0x52Aa899454998Be5b000Ad077a46Bbe360F4e497); + IFluidVaultT1Factory public constant VAULT_T1_FACTORY = + IFluidVaultT1Factory(0x324c5Dc1fC42c7a4D43d92df1eBA58a54d13Bf2d); address public constant USDC_ADDRESS = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; @@ -332,6 +334,8 @@ contract PayloadIGP16 { address public constant VAULT_ETH_USDC = address(0xeAbBfca72F8a8bf14C4ac59e69ECB2eB69F0811C); address public constant VAULT_ETH_USDT = address(0xbEC491FeF7B4f666b270F9D5E5C3f443cBf20991); + address public constant VAULT_wstETH_USDC = address(0x51197586F6A9e2571868b6ffaef308f3bdfEd3aE); + address public constant VAULT_wstETH_USDT = address(0x1c2bB46f36561bc4F05A94BD50916496aa501078); address public constant VAULT_weETH_wstETH = address(0x40D9b8417E6E1DcD358f04E3328bCEd061018A82); @@ -377,14 +381,20 @@ contract PayloadIGP16 { // Action 1: Update wstETH market rate curve and set fee as 10% action1(); - // Action 2: Update ETH market rate curve. + // Action 2: Update ETH market rate curve and set fee as 0%. action2(); - // Action 3: Update weETH/wstETH Vault borrow limit + // Action 3: Make weETH/wstETH Vault borrow limit as dynamic action3(); - // Action 4: Pause ETH Rewards on ETH Vaults + // Action 4: Update supply rate magnifier wstETH/USDC and wstETH/USDT vault. action4(); + + // Action 5: Pauses ETH Rewards on ETH/USDC and ETH/USDT vaults. + action5(); + + // Action 6: Enabling wstETH token on lending protocol. + action6(); } function verifyProposal() external view {} @@ -426,25 +436,41 @@ contract PayloadIGP16 { } } - /// @notice Action 2: Update ETH market rate curve. + /// @notice Action 2: Update ETH market rate curve and set fee as 0%. function action2() internal { - AdminModuleStructs.RateDataV2Params[] - memory params_ = new AdminModuleStructs.RateDataV2Params[](1); + { + AdminModuleStructs.RateDataV2Params[] + memory params_ = new AdminModuleStructs.RateDataV2Params[](1); - params_[0] = AdminModuleStructs.RateDataV2Params({ - token: ETH_ADDRESS, // ETH - kink1: 70 * 1e2, // 70% - kink2: 90 * 1e2, // 90% - rateAtUtilizationZero: 0, // 0% - rateAtUtilizationKink1: 15 * 1e2, // 15% - rateAtUtilizationKink2: 25 * 1e2, // 25% - rateAtUtilizationMax: 150 * 1e2 // 150% - }); + params_[0] = AdminModuleStructs.RateDataV2Params({ + token: ETH_ADDRESS, // ETH + kink1: 70 * 1e2, // 70% + kink2: 90 * 1e2, // 90% + rateAtUtilizationZero: 0, // 0% + rateAtUtilizationKink1: 15 * 1e2, // 15% + rateAtUtilizationKink2: 25 * 1e2, // 25% + rateAtUtilizationMax: 150 * 1e2 // 150% + }); - LIQUIDITY.updateRateDataV2s(params_); + LIQUIDITY.updateRateDataV2s(params_); + } + + + { + AdminModuleStructs.TokenConfig[] + memory params_ = new AdminModuleStructs.TokenConfig[](1); + + params_[0] = AdminModuleStructs.TokenConfig({ + token: ETH_ADDRESS, // wstETH + threshold: 0.3 * 1e2, // 0.3 + fee: 0 * 1e2 // 0% + }); + + LIQUIDITY.updateTokenConfigs(params_); + } } - /// @notice Action 3: Update weETH/wstETH Vault borrow limit + /// @notice Action 3: Make weETH/wstETH Vault borrow limit as dynamic function action3() internal { AdminModuleStructs.UserBorrowConfig[] memory configs_ = new AdminModuleStructs.UserBorrowConfig[](1); @@ -462,8 +488,42 @@ contract PayloadIGP16 { LIQUIDITY.updateUserBorrowConfigs(configs_); } - /// @notice Action 4: Pause ETH Rewards on ETH Vaults + /// @notice Action 4: Update supply rate magnifier wstETH/USDC and wstETH/USDT vault. function action4() internal { - // TODO + IFluidVaultT1(VAULT_wstETH_USDC).updateSupplyRateMagnifier(80 * 1e2); // 0.8x supplyRateMagnifier + IFluidVaultT1(VAULT_wstETH_USDT).updateSupplyRateMagnifier(80 * 1e2); // 0.8x supplyRateMagnifier + } + + + /// @notice Action 5: Pauses ETH Rewards on ETH/USDC and ETH/USDT vaults. + function action5() internal { + IFluidVaultT1(VAULT_ETH_USDC).updateSupplyRateMagnifier(100 * 1e2); // 1x supplyRateMagnifier + VAULT_T1_FACTORY.setVaultAuth(VAULT_ETH_USDC, 0x58Dc7894a7B1B9D065CE2e94a73f62686B439A2A, false); // Removing Rewards contracts as auth + + IFluidVaultT1(VAULT_ETH_USDT).updateSupplyRateMagnifier(100 * 1e2); // 1x supplyRateMagnifier + VAULT_T1_FACTORY.setVaultAuth(VAULT_ETH_USDC, 0xB36Db4dfF978D2d552a5149E2fd0FBefA2a32809, false); // Removing Rewards contracts as auth + + } + + /// @notice Action 6: Enabling wstETH token on lending protocol. + function action6() internal { + address F_WSTETH = address(0); + + // Set user supply config for the vault on Liquidity Layer. + { + AdminModuleStructs.UserSupplyConfig[] + memory configs_ = new AdminModuleStructs.UserSupplyConfig[](1); + + configs_[0] = AdminModuleStructs.UserSupplyConfig({ + user: address(F_WSTETH), + token: wstETH_ADDRESS, + mode: 1, + expandPercent: 25 * 1e2, // 25% + expandDuration: 12 hours, + baseWithdrawalLimit: 4000 * 1e18 // 4000 wstETH + }); + + LIQUIDITY.updateUserSupplyConfigs(configs_); + } } } \ No newline at end of file From c7c1a3a8b10190d5373a9100b42cdbb02f3fd267 Mon Sep 17 00:00:00 2001 From: Thrilok kumar Date: Mon, 1 Apr 2024 17:46:13 +0530 Subject: [PATCH 3/8] wip --- contracts/payloads/IGP16/PayloadIGP16.sol | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/contracts/payloads/IGP16/PayloadIGP16.sol b/contracts/payloads/IGP16/PayloadIGP16.sol index 02a657a..7691e4e 100644 --- a/contracts/payloads/IGP16/PayloadIGP16.sol +++ b/contracts/payloads/IGP16/PayloadIGP16.sol @@ -384,7 +384,7 @@ contract PayloadIGP16 { // Action 2: Update ETH market rate curve and set fee as 0%. action2(); - // Action 3: Make weETH/wstETH Vault borrow limit as dynamic + // Action 3: Add config handler on liquidity layer for weETH/wstETH vault to make borrow limit dynamic. action3(); // Action 4: Update supply rate magnifier wstETH/USDC and wstETH/USDT vault. @@ -470,22 +470,19 @@ contract PayloadIGP16 { } } - /// @notice Action 3: Make weETH/wstETH Vault borrow limit as dynamic + /// @notice Action 3: Add config handler on liquidity layer for weETH/wstETH vault to make borrow limit dynamic function action3() internal { - AdminModuleStructs.UserBorrowConfig[] - memory configs_ = new AdminModuleStructs.UserBorrowConfig[](1); + address VAULT_weETH_wstETH_CONFIG_HANDLER = address(0); - configs_[0] = AdminModuleStructs.UserBorrowConfig({ - user: address(VAULT_weETH_wstETH), - token: wstETH_ADDRESS, - mode: 1, - expandPercent: 25 * 1e2, // 25% - expandDuration: 12 hours, // 12 hours - baseDebtCeiling: 4000 * 1e18, // 4000 wstETH - maxDebtCeiling: 15000 * 1e18 // 15_000 wstETH + AdminModuleStructs.AddressBool[] + memory configs_ = new AdminModuleStructs.AddressBool[](1); + + configs_[0] = AdminModuleStructs.AddressBool({ + addr: address(VAULT_weETH_wstETH_CONFIG_HANDLER), + value: true }); - LIQUIDITY.updateUserBorrowConfigs(configs_); + LIQUIDITY.updateAuths(configs_); } /// @notice Action 4: Update supply rate magnifier wstETH/USDC and wstETH/USDT vault. From 202e5ba9fae40b38af7206d29cf1cc57f4856708 Mon Sep 17 00:00:00 2001 From: Thrilok kumar Date: Mon, 1 Apr 2024 20:01:11 +0530 Subject: [PATCH 4/8] wip --- contracts/payloads/IGP16/PayloadIGP16.sol | 31 +++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/contracts/payloads/IGP16/PayloadIGP16.sol b/contracts/payloads/IGP16/PayloadIGP16.sol index 7691e4e..0611df3 100644 --- a/contracts/payloads/IGP16/PayloadIGP16.sol +++ b/contracts/payloads/IGP16/PayloadIGP16.sol @@ -222,6 +222,22 @@ interface IFluidLiquidityAdmin { ); } +interface IFluidLendingFactory { + /// @notice creates token for `asset_` for a lending protocol with interest. Only callable by deployers. + /// @param asset_ address of the asset + /// @param fTokenType_ type of fToken: + /// - if it's the native token, it should use `NativeUnderlying` + /// - otherwise it should use `fToken` + /// - could be more types available, check `fTokenTypes()` + /// @param isNativeUnderlying_ flag to signal fToken type that uses native underlying at Liquidity + /// @return token_ address of the created token + function createToken( + address asset_, + string calldata fTokenType_, + bool isNativeUnderlying_ + ) external returns (address token_); +} + interface IFluidVaultT1Factory { function deployVault( address vaultDeploymentLogic_, @@ -266,6 +282,11 @@ interface IFluidVaultT1 { function updateCollateralFactor(uint collateralFactor_) external; } +interface IFluidLending { + /// @notice Updates the rebalancer address (ReserveContract). Only callable by LendingFactory auths. + function updateRebalancer(address rebalancer_) external; +} + interface IFTokenAdmin { /// @notice updates the rewards rate model contract. /// Only callable by LendingFactory auths. @@ -319,6 +340,8 @@ contract PayloadIGP16 { IFluidLiquidityAdmin(0x52Aa899454998Be5b000Ad077a46Bbe360F4e497); IFluidVaultT1Factory public constant VAULT_T1_FACTORY = IFluidVaultT1Factory(0x324c5Dc1fC42c7a4D43d92df1eBA58a54d13Bf2d); + IFluidLendingFactory public constant LENDING_FACTORY = + IFluidLendingFactory(0x54B91A0D94cb471F37f949c60F7Fa7935b551D03); address public constant USDC_ADDRESS = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; @@ -502,9 +525,10 @@ contract PayloadIGP16 { } - /// @notice Action 6: Enabling wstETH token on lending protocol. + /// @notice Action 6: Deploy and enable wstETH token on lending protocol. function action6() internal { - address F_WSTETH = address(0); + // deploy fToken for wstETH + address F_WSTETH = LENDING_FACTORY.createToken(wstETH_ADDRESS, "fToken", false); // Set user supply config for the vault on Liquidity Layer. { @@ -522,5 +546,8 @@ contract PayloadIGP16 { LIQUIDITY.updateUserSupplyConfigs(configs_); } + + // set rebalancer at fToken to reserve contract proxy + IFluidLending(F_WSTETH).updateRebalancer(0x264786EF916af64a1DB19F513F24a3681734ce92); } } \ No newline at end of file From b3776950a1c0d2daa4d970c1496c9fee06be1265 Mon Sep 17 00:00:00 2001 From: Thrilok kumar Date: Mon, 1 Apr 2024 20:01:36 +0530 Subject: [PATCH 5/8] added todo --- contracts/payloads/IGP16/PayloadIGP16.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/payloads/IGP16/PayloadIGP16.sol b/contracts/payloads/IGP16/PayloadIGP16.sol index 0611df3..4f84e79 100644 --- a/contracts/payloads/IGP16/PayloadIGP16.sol +++ b/contracts/payloads/IGP16/PayloadIGP16.sol @@ -495,7 +495,7 @@ contract PayloadIGP16 { /// @notice Action 3: Add config handler on liquidity layer for weETH/wstETH vault to make borrow limit dynamic function action3() internal { - address VAULT_weETH_wstETH_CONFIG_HANDLER = address(0); + address VAULT_weETH_wstETH_CONFIG_HANDLER = address(0); // TODO AdminModuleStructs.AddressBool[] memory configs_ = new AdminModuleStructs.AddressBool[](1); From f450bb0a77512d5496ec72f8dce89f55c492c5fc Mon Sep 17 00:00:00 2001 From: Thrilok kumar Date: Mon, 1 Apr 2024 22:08:27 +0530 Subject: [PATCH 6/8] fix --- contracts/payloads/IGP16/PayloadIGP16.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/payloads/IGP16/PayloadIGP16.sol b/contracts/payloads/IGP16/PayloadIGP16.sol index 4f84e79..cc48bf3 100644 --- a/contracts/payloads/IGP16/PayloadIGP16.sol +++ b/contracts/payloads/IGP16/PayloadIGP16.sol @@ -521,7 +521,7 @@ contract PayloadIGP16 { VAULT_T1_FACTORY.setVaultAuth(VAULT_ETH_USDC, 0x58Dc7894a7B1B9D065CE2e94a73f62686B439A2A, false); // Removing Rewards contracts as auth IFluidVaultT1(VAULT_ETH_USDT).updateSupplyRateMagnifier(100 * 1e2); // 1x supplyRateMagnifier - VAULT_T1_FACTORY.setVaultAuth(VAULT_ETH_USDC, 0xB36Db4dfF978D2d552a5149E2fd0FBefA2a32809, false); // Removing Rewards contracts as auth + VAULT_T1_FACTORY.setVaultAuth(VAULT_ETH_USDT, 0xB36Db4dfF978D2d552a5149E2fd0FBefA2a32809, false); // Removing Rewards contracts as auth } From 8c122e3e54c80082c7635b2137151f39a60f4318 Mon Sep 17 00:00:00 2001 From: Thrilok kumar Date: Tue, 2 Apr 2024 10:44:24 +0530 Subject: [PATCH 7/8] fix --- contracts/payloads/IGP16/PayloadIGP16.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/payloads/IGP16/PayloadIGP16.sol b/contracts/payloads/IGP16/PayloadIGP16.sol index cc48bf3..ac4ae93 100644 --- a/contracts/payloads/IGP16/PayloadIGP16.sol +++ b/contracts/payloads/IGP16/PayloadIGP16.sol @@ -495,7 +495,7 @@ contract PayloadIGP16 { /// @notice Action 3: Add config handler on liquidity layer for weETH/wstETH vault to make borrow limit dynamic function action3() internal { - address VAULT_weETH_wstETH_CONFIG_HANDLER = address(0); // TODO + address VAULT_weETH_wstETH_CONFIG_HANDLER = address(0x133098588cdF2e35B9478a1f4979C4f7Ccee3a06); AdminModuleStructs.AddressBool[] memory configs_ = new AdminModuleStructs.AddressBool[](1); From 6eb3b9eb09c0b0952790b813fea3bdd91f2b4b30 Mon Sep 17 00:00:00 2001 From: Thrilok kumar Date: Tue, 2 Apr 2024 22:28:21 +0530 Subject: [PATCH 8/8] deployment --- deployments/mainnet_1/PayloadIGP16.json | 1 + scripts/deployIGP16.js | 22 ++++++++++++++++++++++ scripts/deploySimulation.js | 4 ++-- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 deployments/mainnet_1/PayloadIGP16.json create mode 100644 scripts/deployIGP16.js diff --git a/deployments/mainnet_1/PayloadIGP16.json b/deployments/mainnet_1/PayloadIGP16.json new file mode 100644 index 0000000..a01f5dd --- /dev/null +++ b/deployments/mainnet_1/PayloadIGP16.json @@ -0,0 +1 @@ +{"metadata":"{\"defaultCompiler\":{\"version\":\"0.7.3\"},\"sources\":{\"contracts/payloads/IGP16/PayloadIGP16.sol\":{\"content\":\"pragma solidity ^0.7.0;\\npragma experimental ABIEncoderV2;\\n\\ninterface IGovernorBravo {\\n function _acceptAdmin() external;\\n\\n function _setVotingDelay(uint newVotingDelay) external;\\n\\n function _setVotingPeriod(uint newVotingPeriod) external;\\n\\n function _acceptAdminOnTimelock() external;\\n\\n function _setImplementation(address implementation_) external;\\n\\n function propose(\\n address[] memory targets,\\n uint[] memory values,\\n string[] memory signatures,\\n bytes[] memory calldatas,\\n string memory description\\n ) external returns (uint);\\n\\n function admin() external view returns (address);\\n\\n function pendingAdmin() external view returns (address);\\n\\n function timelock() external view returns (address);\\n\\n function votingDelay() external view returns (uint256);\\n\\n function votingPeriod() external view returns (uint256);\\n}\\n\\ninterface ITimelock {\\n function acceptAdmin() external;\\n\\n function setDelay(uint delay_) external;\\n\\n function setPendingAdmin(address pendingAdmin_) external;\\n\\n function queueTransaction(\\n address target,\\n uint value,\\n string memory signature,\\n bytes memory data,\\n uint eta\\n ) external returns (bytes32);\\n\\n function executeTransaction(\\n address target,\\n uint value,\\n string memory signature,\\n bytes memory data,\\n uint eta\\n ) external payable returns (bytes memory);\\n\\n function pendingAdmin() external view returns (address);\\n\\n function admin() external view returns (address);\\n\\n function delay() external view returns (uint256);\\n}\\n\\ninterface AdminModuleStructs {\\n struct AddressBool {\\n address addr;\\n bool value;\\n }\\n\\n struct AddressUint256 {\\n address addr;\\n uint256 value;\\n }\\n\\n struct RateDataV1Params {\\n address token;\\n uint256 kink;\\n uint256 rateAtUtilizationZero;\\n uint256 rateAtUtilizationKink;\\n uint256 rateAtUtilizationMax;\\n }\\n\\n struct RateDataV2Params {\\n address token;\\n uint256 kink1;\\n uint256 kink2;\\n uint256 rateAtUtilizationZero;\\n uint256 rateAtUtilizationKink1;\\n uint256 rateAtUtilizationKink2;\\n uint256 rateAtUtilizationMax;\\n }\\n\\n struct TokenConfig {\\n address token;\\n uint256 fee;\\n uint256 threshold;\\n }\\n\\n struct UserSupplyConfig {\\n address user;\\n address token;\\n uint8 mode;\\n uint256 expandPercent;\\n uint256 expandDuration;\\n uint256 baseWithdrawalLimit;\\n }\\n\\n struct UserBorrowConfig {\\n address user;\\n address token;\\n uint8 mode;\\n uint256 expandPercent;\\n uint256 expandDuration;\\n uint256 baseDebtCeiling;\\n uint256 maxDebtCeiling;\\n }\\n}\\n\\ninterface IFluidLiquidityAdmin {\\n /// @notice adds/removes auths. Auths generally could be contracts which can have restricted actions defined on contract.\\n /// auths can be helpful in reducing governance overhead where it's not needed.\\n /// @param authsStatus_ array of structs setting allowed status for an address.\\n /// status true => add auth, false => remove auth\\n function updateAuths(\\n AdminModuleStructs.AddressBool[] calldata authsStatus_\\n ) external;\\n\\n /// @notice adds/removes guardians. Only callable by Governance.\\n /// @param guardiansStatus_ array of structs setting allowed status for an address.\\n /// status true => add guardian, false => remove guardian\\n function updateGuardians(\\n AdminModuleStructs.AddressBool[] calldata guardiansStatus_\\n ) external;\\n\\n /// @notice changes the revenue collector address (contract that is sent revenue). Only callable by Governance.\\n /// @param revenueCollector_ new revenue collector address\\n function updateRevenueCollector(address revenueCollector_) external;\\n\\n /// @notice changes current status, e.g. for pausing or unpausing all user operations. Only callable by Auths.\\n /// @param newStatus_ new status\\n /// status = 2 -> pause, status = 1 -> resume.\\n function changeStatus(uint256 newStatus_) external;\\n\\n /// @notice update tokens rate data version 1. Only callable by Auths.\\n /// @param tokensRateData_ array of RateDataV1Params with rate data to set for each token\\n function updateRateDataV1s(\\n AdminModuleStructs.RateDataV1Params[] calldata tokensRateData_\\n ) external;\\n\\n /// @notice update tokens rate data version 2. Only callable by Auths.\\n /// @param tokensRateData_ array of RateDataV2Params with rate data to set for each token\\n function updateRateDataV2s(\\n AdminModuleStructs.RateDataV2Params[] calldata tokensRateData_\\n ) external;\\n\\n /// @notice updates token configs: fee charge on borrowers interest & storage update utilization threshold.\\n /// Only callable by Auths.\\n /// @param tokenConfigs_ contains token address, fee & utilization threshold\\n function updateTokenConfigs(\\n AdminModuleStructs.TokenConfig[] calldata tokenConfigs_\\n ) external;\\n\\n /// @notice updates user classes: 0 is for new protocols, 1 is for established protocols.\\n /// Only callable by Auths.\\n /// @param userClasses_ struct array of uint256 value to assign for each user address\\n function updateUserClasses(\\n AdminModuleStructs.AddressUint256[] calldata userClasses_\\n ) external;\\n\\n /// @notice sets user supply configs per token basis. Eg: with interest or interest-free and automated limits.\\n /// Only callable by Auths.\\n /// @param userSupplyConfigs_ struct array containing user supply config, see `UserSupplyConfig` struct for more info\\n function updateUserSupplyConfigs(\\n AdminModuleStructs.UserSupplyConfig[] memory userSupplyConfigs_\\n ) external;\\n\\n /// @notice setting user borrow configs per token basis. Eg: with interest or interest-free and automated limits.\\n /// Only callable by Auths.\\n /// @param userBorrowConfigs_ struct array containing user borrow config, see `UserBorrowConfig` struct for more info\\n function updateUserBorrowConfigs(\\n AdminModuleStructs.UserBorrowConfig[] memory userBorrowConfigs_\\n ) external;\\n\\n /// @notice pause operations for a particular user in class 0 (class 1 users can't be paused by guardians).\\n /// Only callable by Guardians.\\n /// @param user_ address of user to pause operations for\\n /// @param supplyTokens_ token addresses to pause withdrawals for\\n /// @param borrowTokens_ token addresses to pause borrowings for\\n function pauseUser(\\n address user_,\\n address[] calldata supplyTokens_,\\n address[] calldata borrowTokens_\\n ) external;\\n\\n /// @notice unpause operations for a particular user in class 0 (class 1 users can't be paused by guardians).\\n /// Only callable by Guardians.\\n /// @param user_ address of user to unpause operations for\\n /// @param supplyTokens_ token addresses to unpause withdrawals for\\n /// @param borrowTokens_ token addresses to unpause borrowings for\\n function unpauseUser(\\n address user_,\\n address[] calldata supplyTokens_,\\n address[] calldata borrowTokens_\\n ) external;\\n\\n /// @notice collects revenue for tokens to configured revenueCollector address.\\n /// @param tokens_ array of tokens to collect revenue for\\n /// @dev Note that this can revert if token balance is < revenueAmount (utilization > 100%)\\n function collectRevenue(address[] calldata tokens_) external;\\n\\n /// @notice gets the current updated exchange prices for n tokens and updates all prices, rates related data in storage.\\n /// @param tokens_ tokens to update exchange prices for\\n /// @return supplyExchangePrices_ new supply rates of overall system for each token\\n /// @return borrowExchangePrices_ new borrow rates of overall system for each token\\n function updateExchangePrices(\\n address[] calldata tokens_\\n )\\n external\\n returns (\\n uint256[] memory supplyExchangePrices_,\\n uint256[] memory borrowExchangePrices_\\n );\\n}\\n\\ninterface IFluidLendingFactory {\\n /// @notice creates token for `asset_` for a lending protocol with interest. Only callable by deployers.\\n /// @param asset_ address of the asset\\n /// @param fTokenType_ type of fToken:\\n /// - if it's the native token, it should use `NativeUnderlying`\\n /// - otherwise it should use `fToken`\\n /// - could be more types available, check `fTokenTypes()`\\n /// @param isNativeUnderlying_ flag to signal fToken type that uses native underlying at Liquidity\\n /// @return token_ address of the created token\\n function createToken(\\n address asset_,\\n string calldata fTokenType_,\\n bool isNativeUnderlying_\\n ) external returns (address token_);\\n}\\n\\ninterface IFluidVaultT1Factory {\\n function deployVault(\\n address vaultDeploymentLogic_,\\n bytes calldata vaultDeploymentData_\\n ) external returns (address vault_);\\n\\n function setVaultAuth(\\n address vault_,\\n address vaultAuth_,\\n bool allowed_\\n ) external;\\n}\\n\\ninterface IFluidVaultT1DeploymentLogic {\\n function vaultT1(address supplyToken_, address borrowToken_) external;\\n}\\n\\ninterface IFluidVaultT1 {\\n /// @notice updates the Vault oracle to `newOracle_`. Must implement the FluidOracle interface.\\n function updateOracle(address newOracle_) external;\\n\\n /// @notice updates the all Vault core settings according to input params.\\n /// All input values are expected in 1e2 (1% = 100, 100% = 10_000).\\n function updateCoreSettings(\\n uint256 supplyRateMagnifier_,\\n uint256 borrowRateMagnifier_,\\n uint256 collateralFactor_,\\n uint256 liquidationThreshold_,\\n uint256 liquidationMaxLimit_,\\n uint256 withdrawGap_,\\n uint256 liquidationPenalty_,\\n uint256 borrowFee_\\n ) external;\\n\\n /// @notice updates the allowed rebalancer to `newRebalancer_`.\\n function updateRebalancer(address newRebalancer_) external;\\n\\n /// @notice updates the supply rate magnifier to `supplyRateMagnifier_`. Input in 1e2 (1% = 100, 100% = 10_000).\\n function updateSupplyRateMagnifier(uint supplyRateMagnifier_) external;\\n\\n /// @notice updates the collateral factor to `collateralFactor_`. Input in 1e2 (1% = 100, 100% = 10_000).\\n function updateCollateralFactor(uint collateralFactor_) external;\\n}\\n\\ninterface IFluidLending {\\n /// @notice Updates the rebalancer address (ReserveContract). Only callable by LendingFactory auths.\\n function updateRebalancer(address rebalancer_) external;\\n}\\n\\ninterface IFTokenAdmin {\\n /// @notice updates the rewards rate model contract.\\n /// Only callable by LendingFactory auths.\\n /// @param rewardsRateModel_ the new rewards rate model contract address.\\n /// can be set to address(0) to set no rewards (to save gas)\\n function updateRewards(address rewardsRateModel_) external;\\n\\n /// @notice Balances out the difference between fToken supply at Liquidity vs totalAssets().\\n /// Deposits underlying from rebalancer address into Liquidity but doesn't mint any shares\\n /// -> thus making deposit available as rewards.\\n /// Only callable by rebalancer.\\n /// @return assets_ amount deposited to Liquidity\\n function rebalance() external payable returns (uint256 assets_);\\n\\n /// @notice gets the liquidity exchange price of the underlying asset, calculates the updated exchange price (with reward rates)\\n /// and writes those values to storage.\\n /// Callable by anyone.\\n /// @return tokenExchangePrice_ exchange price of fToken share to underlying asset\\n /// @return liquidityExchangePrice_ exchange price at Liquidity for the underlying asset\\n function updateRates()\\n external\\n returns (uint256 tokenExchangePrice_, uint256 liquidityExchangePrice_);\\n\\n /// @notice sends any potentially stuck funds to Liquidity contract. Only callable by LendingFactory auths.\\n function rescueFunds(address token_) external;\\n\\n /// @notice Updates the rebalancer address (ReserveContract). Only callable by LendingFactory auths.\\n function updateRebalancer(address rebalancer_) external;\\n}\\n\\ncontract PayloadIGP16 {\\n uint256 public constant PROPOSAL_ID = 16;\\n\\n address public constant PROPOSER =\\n 0xA45f7bD6A5Ff45D31aaCE6bCD3d426D9328cea01;\\n\\n address public constant PROPOSER_AVO_MULTISIG =\\n 0x059A94A72951c0ae1cc1CE3BF0dB52421bbE8210;\\n\\n IGovernorBravo public constant GOVERNOR =\\n IGovernorBravo(0x0204Cd037B2ec03605CFdFe482D8e257C765fA1B);\\n ITimelock public immutable TIMELOCK =\\n ITimelock(0x2386DC45AdDed673317eF068992F19421B481F4c);\\n\\n address public immutable ADDRESS_THIS;\\n\\n address public constant TEAM_MULTISIG =\\n 0x4F6F977aCDD1177DCD81aB83074855EcB9C2D49e;\\n\\n IFluidLiquidityAdmin public constant LIQUIDITY =\\n IFluidLiquidityAdmin(0x52Aa899454998Be5b000Ad077a46Bbe360F4e497);\\n IFluidVaultT1Factory public constant VAULT_T1_FACTORY =\\n IFluidVaultT1Factory(0x324c5Dc1fC42c7a4D43d92df1eBA58a54d13Bf2d);\\n IFluidLendingFactory public constant LENDING_FACTORY =\\n IFluidLendingFactory(0x54B91A0D94cb471F37f949c60F7Fa7935b551D03);\\n\\n address public constant USDC_ADDRESS =\\n 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;\\n address public constant USDT_ADDRESS =\\n 0xdAC17F958D2ee523a2206206994597C13D831ec7;\\n\\n address public constant ETH_ADDRESS =\\n 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\\n address public constant weETH_ADDRESS =\\n 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee;\\n address public constant wstETH_ADDRESS =\\n 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0;\\n\\n address public constant VAULT_ETH_USDC = address(0xeAbBfca72F8a8bf14C4ac59e69ECB2eB69F0811C);\\n address public constant VAULT_ETH_USDT = address(0xbEC491FeF7B4f666b270F9D5E5C3f443cBf20991);\\n address public constant VAULT_wstETH_USDC = address(0x51197586F6A9e2571868b6ffaef308f3bdfEd3aE);\\n address public constant VAULT_wstETH_USDT = address(0x1c2bB46f36561bc4F05A94BD50916496aa501078);\\n address public constant VAULT_weETH_wstETH = address(0x40D9b8417E6E1DcD358f04E3328bCEd061018A82);\\n\\n \\n\\n constructor() {\\n ADDRESS_THIS = address(this);\\n }\\n\\n function propose(string memory description) external {\\n require(\\n msg.sender == PROPOSER ||\\n msg.sender == TEAM_MULTISIG ||\\n address(this) == PROPOSER_AVO_MULTISIG,\\n \\\"msg.sender-not-allowed\\\"\\n );\\n\\n uint256 totalActions = 1;\\n address[] memory targets = new address[](totalActions);\\n uint256[] memory values = new uint256[](totalActions);\\n string[] memory signatures = new string[](totalActions);\\n bytes[] memory calldatas = new bytes[](totalActions);\\n\\n // Action 1: call executePayload on timelock contract to execute payload related to Fluid\\n targets[0] = address(TIMELOCK);\\n values[0] = 0;\\n signatures[0] = \\\"executePayload(address,string,bytes)\\\";\\n calldatas[0] = abi.encode(ADDRESS_THIS, \\\"execute()\\\", abi.encode());\\n\\n uint256 proposedId = GOVERNOR.propose(\\n targets,\\n values,\\n signatures,\\n calldatas,\\n description\\n );\\n\\n require(proposedId == PROPOSAL_ID, \\\"PROPOSAL_IS_NOT_SAME\\\");\\n }\\n\\n function execute() external {\\n require(address(this) == address(TIMELOCK), \\\"not-valid-caller\\\");\\n\\n // Action 1: Update wstETH market rate curve and set fee as 10%\\n action1();\\n\\n // Action 2: Update ETH market rate curve and set fee as 0%.\\n action2();\\n\\n // Action 3: Add config handler on liquidity layer for weETH/wstETH vault to make borrow limit dynamic.\\n action3();\\n\\n // Action 4: Update supply rate magnifier wstETH/USDC and wstETH/USDT vault.\\n action4();\\n\\n // Action 5: Pauses ETH Rewards on ETH/USDC and ETH/USDT vaults.\\n action5();\\n\\n // Action 6: Enabling wstETH token on lending protocol.\\n action6();\\n }\\n\\n function verifyProposal() external view {}\\n\\n /***********************************|\\n | Proposal Payload Actions |\\n |__________________________________*/\\n\\n /// @notice Action 1: Update wstETH market rate curve and set fee as 10%\\n function action1() internal {\\n {\\n AdminModuleStructs.RateDataV2Params[]\\n memory params_ = new AdminModuleStructs.RateDataV2Params[](1);\\n\\n params_[0] = AdminModuleStructs.RateDataV2Params({\\n token: wstETH_ADDRESS, // wstETH\\n kink1: 70 * 1e2, // 70%\\n kink2: 90 * 1e2, // 90%\\n rateAtUtilizationZero: 0, // 0%\\n rateAtUtilizationKink1: 20 * 1e2, // 20%\\n rateAtUtilizationKink2: 40 * 1e2, // 40%\\n rateAtUtilizationMax: 150 * 1e2 // 150%\\n });\\n\\n LIQUIDITY.updateRateDataV2s(params_);\\n }\\n\\n {\\n AdminModuleStructs.TokenConfig[]\\n memory params_ = new AdminModuleStructs.TokenConfig[](1);\\n\\n params_[0] = AdminModuleStructs.TokenConfig({\\n token: wstETH_ADDRESS, // wstETH\\n threshold: 0.3 * 1e2, // 0.3\\n fee: 10 * 1e2 // 10%\\n });\\n\\n LIQUIDITY.updateTokenConfigs(params_);\\n }\\n }\\n\\n /// @notice Action 2: Update ETH market rate curve and set fee as 0%.\\n function action2() internal {\\n {\\n AdminModuleStructs.RateDataV2Params[]\\n memory params_ = new AdminModuleStructs.RateDataV2Params[](1);\\n\\n params_[0] = AdminModuleStructs.RateDataV2Params({\\n token: ETH_ADDRESS, // ETH\\n kink1: 70 * 1e2, // 70%\\n kink2: 90 * 1e2, // 90%\\n rateAtUtilizationZero: 0, // 0%\\n rateAtUtilizationKink1: 15 * 1e2, // 15%\\n rateAtUtilizationKink2: 25 * 1e2, // 25%\\n rateAtUtilizationMax: 150 * 1e2 // 150%\\n });\\n\\n LIQUIDITY.updateRateDataV2s(params_);\\n }\\n\\n\\n {\\n AdminModuleStructs.TokenConfig[]\\n memory params_ = new AdminModuleStructs.TokenConfig[](1);\\n\\n params_[0] = AdminModuleStructs.TokenConfig({\\n token: ETH_ADDRESS, // wstETH\\n threshold: 0.3 * 1e2, // 0.3\\n fee: 0 * 1e2 // 0%\\n });\\n\\n LIQUIDITY.updateTokenConfigs(params_);\\n }\\n }\\n\\n /// @notice Action 3: Add config handler on liquidity layer for weETH/wstETH vault to make borrow limit dynamic\\n function action3() internal {\\n address VAULT_weETH_wstETH_CONFIG_HANDLER = address(0x133098588cdF2e35B9478a1f4979C4f7Ccee3a06);\\n\\n AdminModuleStructs.AddressBool[]\\n memory configs_ = new AdminModuleStructs.AddressBool[](1);\\n\\n configs_[0] = AdminModuleStructs.AddressBool({\\n addr: address(VAULT_weETH_wstETH_CONFIG_HANDLER),\\n value: true\\n });\\n\\n LIQUIDITY.updateAuths(configs_);\\n }\\n\\n /// @notice Action 4: Update supply rate magnifier wstETH/USDC and wstETH/USDT vault.\\n function action4() internal {\\n IFluidVaultT1(VAULT_wstETH_USDC).updateSupplyRateMagnifier(80 * 1e2); // 0.8x supplyRateMagnifier\\n IFluidVaultT1(VAULT_wstETH_USDT).updateSupplyRateMagnifier(80 * 1e2); // 0.8x supplyRateMagnifier\\n }\\n\\n\\n /// @notice Action 5: Pauses ETH Rewards on ETH/USDC and ETH/USDT vaults.\\n function action5() internal {\\n IFluidVaultT1(VAULT_ETH_USDC).updateSupplyRateMagnifier(100 * 1e2); // 1x supplyRateMagnifier\\n VAULT_T1_FACTORY.setVaultAuth(VAULT_ETH_USDC, 0x58Dc7894a7B1B9D065CE2e94a73f62686B439A2A, false); // Removing Rewards contracts as auth\\n\\n IFluidVaultT1(VAULT_ETH_USDT).updateSupplyRateMagnifier(100 * 1e2); // 1x supplyRateMagnifier\\n VAULT_T1_FACTORY.setVaultAuth(VAULT_ETH_USDT, 0xB36Db4dfF978D2d552a5149E2fd0FBefA2a32809, false); // Removing Rewards contracts as auth\\n\\n }\\n\\n /// @notice Action 6: Deploy and enable wstETH token on lending protocol.\\n function action6() internal {\\n // deploy fToken for wstETH\\n address F_WSTETH = LENDING_FACTORY.createToken(wstETH_ADDRESS, \\\"fToken\\\", false);\\n\\n // Set user supply config for the vault on Liquidity Layer.\\n {\\n AdminModuleStructs.UserSupplyConfig[]\\n memory configs_ = new AdminModuleStructs.UserSupplyConfig[](1);\\n\\n configs_[0] = AdminModuleStructs.UserSupplyConfig({\\n user: address(F_WSTETH),\\n token: wstETH_ADDRESS,\\n mode: 1,\\n expandPercent: 25 * 1e2, // 25%\\n expandDuration: 12 hours,\\n baseWithdrawalLimit: 4000 * 1e18 // 4000 wstETH\\n });\\n\\n LIQUIDITY.updateUserSupplyConfigs(configs_);\\n }\\n\\n // set rebalancer at fToken to reserve contract proxy\\n IFluidLending(F_WSTETH).updateRebalancer(0x264786EF916af64a1DB19F513F24a3681734ce92);\\n }\\n}\",\"versionPragma\":\"^0.7.0\"}}}","address":"0x1eF805e8f79c3405ba9cE6532c262B5508F4ACc1","bytecode":"0x60c06040527f2386dc45added673317ef068992f19421b481f4c00000000000000000000000060805234801561003457600080fd5b5030606081811b60a052608051901c906118036100706000398061062f52806107b6525080610292528061033c528061058052506118036000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80638a951d6c116100c3578063aaff04931161007c578063aaff04931461020a578063b788f3a114610212578063bb09d9b71461021a578063bffa7f0f14610222578063c18920581461022a578063cc025f7c146102325761014d565b80638a951d6c146101cf57806396bac931146101d7578063a4485598146101df578063a734f06e146101e7578063a948f8d2146101ef578063aa98df39146101f75761014d565b806366760d7d1161011557806366760d7d1461019f57806369f55592146101a75780636dc0ae22146101af5780637aadef8b146101b75780637e2f35fa146101bf5780638a1c7364146101c75761014d565b80630b297739146101525780630bc9136e146101705780632861c7d1146101855780632fca5d4f1461018d5780636146195414610195575b600080fd5b61015a61023a565b6040516101679190611418565b60405180910390f35b610178610252565b6040516101679190611718565b61015a610257565b61015a61026f565b61019d610287565b005b61019d610308565b61015a61030a565b61015a610322565b61015a61033a565b61015a61035e565b61015a610376565b61015a61038e565b61015a6103a6565b61015a6103be565b61015a6103d6565b61015a6103ee565b61019d610205366004611247565b610406565b61015a61073c565b61015a610754565b61015a61076c565b61015a610784565b61015a61079c565b61015a6107b4565b731c2bb46f36561bc4f05a94bd50916496aa50107881565b601081565b7352aa899454998be5b000ad077a46bbe360f4e49781565b73eabbfca72f8a8bf14c4ac59e69ecb2eb69f0811c81565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102d85760405162461bcd60e51b81526004016102cf9061177f565b60405180910390fd5b6102e06107d8565b6102e86109ff565b6102f0610bae565b6102f8610c9f565b610300610d77565b610308610f47565b565b73bec491fef7b4f666b270f9d5e5c3f443cbf2099181565b730204cd037b2ec03605cfdfe482d8e257c765fa1b81565b7f000000000000000000000000000000000000000000000000000000000000000081565b73059a94a72951c0ae1cc1ce3bf0db52421bbe821081565b73324c5dc1fc42c7a4d43d92df1eba58a54d13bf2d81565b7340d9b8417e6e1dcd358f04e3328bced061018a8281565b7354b91a0d94cb471f37f949c60f7fa7935b551d0381565b737f39c581f595b53c5cb19bd0b3f8da6c935e2ca081565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b7351197586f6a9e2571868b6ffaef308f3bdfed3ae81565b3373a45f7bd6a5ff45d31aace6bcd3d426d9328cea01148061043b575033734f6f977acdd1177dcd81ab83074855ecb9c2d49e145b8061045957503073059a94a72951c0ae1cc1ce3bf0db52421bbe8210145b6104755760405162461bcd60e51b81526004016102cf90611721565b604080516001808252818301909252606090826020808301908036833701905050905060608267ffffffffffffffff811180156104b157600080fd5b506040519080825280602002602001820160405280156104db578160200160208202803683370190505b50905060608367ffffffffffffffff811180156104f757600080fd5b5060405190808252806020026020018201604052801561052b57816020015b60608152602001906001900390816105165790505b50905060608467ffffffffffffffff8111801561054757600080fd5b5060405190808252806020026020018201604052801561057b57816020015b60608152602001906001900390816105665790505b5090507f0000000000000000000000000000000000000000000000000000000000000000846000815181106105ac57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000836000815181106105db57fe5b6020026020010181815250506040518060600160405280602481526020016117aa602491398260008151811061060d57fe5b60209081029190910181019190915260408051600081529182018152610656917f0000000000000000000000000000000000000000000000000000000000000000918101611489565b6040516020818303038152906040528160008151811061067257fe5b6020908102919091010152604051636d4ab48d60e11b8152600090730204cd037b2ec03605cfdfe482d8e257c765fa1b9063da95691a906106bf9088908890889088908e906004016114d2565b602060405180830381600087803b1580156106d957600080fd5b505af11580156106ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071191906112dc565b9050601081146107335760405162461bcd60e51b81526004016102cf90611751565b50505050505050565b73cd5fe23c85820f7b72d0926fc9b05b43e359b7ee81565b734f6f977acdd1177dcd81ab83074855ecb9c2d49e81565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73a45f7bd6a5ff45d31aace6bcd3d426d9328cea0181565b73dac17f958d2ee523a2206206994597c13d831ec781565b7f000000000000000000000000000000000000000000000000000000000000000081565b604080516001808252818301909252606091816020015b6107f7611147565b8152602001906001900390816107ef5790505090506040518060e00160405280737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06001600160a01b03168152602001611b5881526020016123288152602001600081526020016107d08152602001610fa08152602001613a988152508160008151811061087457fe5b6020908102919091010152604051639dde597760e01b81527352aa899454998be5b000ad077a46bbe360f4e49790639dde5977906108b69084906004016115cb565b600060405180830381600087803b1580156108d057600080fd5b505af11580156108e4573d6000803e3d6000fd5b50505050506060600167ffffffffffffffff8111801561090357600080fd5b5060405190808252806020026020018201604052801561093d57816020015b61092a61118d565b8152602001906001900390816109225790505b5090506040518060600160405280737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06001600160a01b031681526020016103e88152602001601e8152508160008151811061098857fe5b60209081029190910101526040516338b7e8e760e01b81527352aa899454998be5b000ad077a46bbe360f4e497906338b7e8e7906109ca908490600401611649565b600060405180830381600087803b1580156109e457600080fd5b505af11580156109f8573d6000803e3d6000fd5b5050505050565b604080516001808252818301909252606091816020015b610a1e611147565b815260200190600190039081610a165790505090506040518060e0016040528073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168152602001611b5881526020016123288152602001600081526020016105dc81526020016109c48152602001613a9881525081600081518110610a9b57fe5b6020908102919091010152604051639dde597760e01b81527352aa899454998be5b000ad077a46bbe360f4e49790639dde597790610add9084906004016115cb565b600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b50505050506060600167ffffffffffffffff81118015610b2a57600080fd5b50604051908082528060200260200182016040528015610b6457816020015b610b5161118d565b815260200190600190039081610b495790505b509050604051806060016040528073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0316815260200160008152602001601e8152508160008151811061098857fe5b60408051600180825281830190925273133098588cdf2e35b9478a1f4979c4f7ccee3a069160609190816020015b610be46111b7565b815260200190600190039081610bdc5790505090506040518060400160405280836001600160a01b031681526020016001151581525081600081518110610c2757fe5b6020908102919091010152604051633f66feff60e01b81527352aa899454998be5b000ad077a46bbe360f4e49790633f66feff90610c69908490600401611571565b600060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b505050505050565b604051634a138a7160e01b81527351197586f6a9e2571868b6ffaef308f3bdfed3ae90634a138a7190610cd890611f4090600401611718565b600060405180830381600087803b158015610cf257600080fd5b505af1158015610d06573d6000803e3d6000fd5b5050604051634a138a7160e01b8152731c2bb46f36561bc4f05a94bd50916496aa5010789250634a138a719150610d4390611f4090600401611718565b600060405180830381600087803b158015610d5d57600080fd5b505af1158015610d71573d6000803e3d6000fd5b50505050565b604051634a138a7160e01b815273eabbfca72f8a8bf14c4ac59e69ecb2eb69f0811c90634a138a7190610db09061271090600401611718565b600060405180830381600087803b158015610dca57600080fd5b505af1158015610dde573d6000803e3d6000fd5b5050604051637faa1d2160e01b815273324c5dc1fc42c7a4d43d92df1eba58a54d13bf2d9250637faa1d219150610e469073eabbfca72f8a8bf14c4ac59e69ecb2eb69f0811c907358dc7894a7b1b9d065ce2e94a73f62686b439a2a9060009060040161142c565b600060405180830381600087803b158015610e6057600080fd5b505af1158015610e74573d6000803e3d6000fd5b5050604051634a138a7160e01b815273bec491fef7b4f666b270f9d5e5c3f443cbf209919250634a138a719150610eb19061271090600401611718565b600060405180830381600087803b158015610ecb57600080fd5b505af1158015610edf573d6000803e3d6000fd5b5050604051637faa1d2160e01b815273324c5dc1fc42c7a4d43d92df1eba58a54d13bf2d9250637faa1d219150610d439073bec491fef7b4f666b270f9d5e5c3f443cbf209919073b36db4dff978d2d552a5149e2fd0fbefa2a328099060009060040161142c565b6040516373c7024d60e11b81526000907354b91a0d94cb471f37f949c60f7fa7935b551d039063e78e049a90610f9790737f39c581f595b53c5cb19bd0b3f8da6c935e2ca0908590600401611450565b602060405180830381600087803b158015610fb157600080fd5b505af1158015610fc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe99190611219565b60408051600180825281830190925291925060609190816020015b61100c6111ce565b8152602001906001900390816110045790505090506040518060c00160405280836001600160a01b03168152602001737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06001600160a01b03168152602001600160ff1681526020016109c4815260200161a8c0815260200168d8d726b7177a8000008152508160008151811061109257fe5b60209081029190910101526040516301635db560e11b81527352aa899454998be5b000ad077a46bbe360f4e497906302c6bb6a906110d490849060040161169e565b600060405180830381600087803b1580156110ee57600080fd5b505af1158015611102573d6000803e3d6000fd5b505060405163b046a44960e01b81526001600160a01b038516935063b046a44992506109ca915073264786ef916af64a1db19f513f24a3681734ce9290600401611418565b6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600060ff1681526020016000815260200160008152602001600081525090565b60006020828403121561122a578081fd5b81516001600160a01b0381168114611240578182fd5b9392505050565b60006020808385031215611259578182fd5b823567ffffffffffffffff80821115611270578384fd5b818501915085601f830112611283578384fd5b81358181111561128f57fe5b604051601f8201601f19168101850183811182821017156112ac57fe5b60405281815283820185018810156112c2578586fd5b818585018683013790810190930193909352509392505050565b6000602082840312156112ed578081fd5b5051919050565b60008282518085526020808601955080818302840101818601855b8481101561133d57601f1986840301895261132b8383516113cd565b9884019892509083019060010161130f565b5090979650505050505050565b60008282518085526020808601955080818302840101818601855b8481101561133d57601f198684030189526113818383516113cd565b98840198925090830190600101611365565b6000815180845260208085019450808401835b838110156113c2578151875295820195908201906001016113a6565b509495945050505050565b60008151808452815b818110156113f2576020818501810151868301820152016113d6565b818111156114035782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6001600160a01b0392909216825260606020830181905260069083015265332a37b5b2b760d11b60808301521515604082015260a00190565b600060018060a01b038416825260606020830152600960608301526865786563757465282960b81b608083015260a060408301526114ca60a08301846113cd565b949350505050565b60a0808252865190820181905260009060209060c0840190828a01845b828110156115145781516001600160a01b0316845292840192908401906001016114ef565b505050838103828501526115288189611393565b915050828103604084015261153d818761134a565b9050828103606084015261155181866112f4565b9050828103608084015261156581856113cd565b98975050505050505050565b602080825282518282018190526000919060409081850190868401855b828110156115be57815180516001600160a01b03168552860151151586850152928401929085019060010161158e565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156115be57815180516001600160a01b0316855286810151878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0908101519085015260e090930192908501906001016115e8565b602080825282518282018190526000919060409081850190868401855b828110156115be57815180516001600160a01b0316855286810151878601528501518585015260609093019290850190600101611666565b602080825282518282018190526000919060409081850190868401855b828110156115be57815180516001600160a01b0390811686528782015116878601528581015160ff1686860152606080820151908601526080808201519086015260a0908101519085015260c090930192908501906001016116bb565b90815260200190565b6020808252601690820152751b5cd9cb9cd95b99195c8b5b9bdd0b585b1b1bddd95960521b604082015260600190565b60208082526014908201527350524f504f53414c5f49535f4e4f545f53414d4560601b604082015260600190565b60208082526010908201526f3737ba16bb30b634b216b1b0b63632b960811b60408201526060019056fe657865637574655061796c6f616428616464726573732c737472696e672c627974657329a26469706673582212203e3b5acc81966044652b95ce3f5a13f0f601f582cf8e585e6c1fe03fcc4728c864736f6c63430007030033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80638a951d6c116100c3578063aaff04931161007c578063aaff04931461020a578063b788f3a114610212578063bb09d9b71461021a578063bffa7f0f14610222578063c18920581461022a578063cc025f7c146102325761014d565b80638a951d6c146101cf57806396bac931146101d7578063a4485598146101df578063a734f06e146101e7578063a948f8d2146101ef578063aa98df39146101f75761014d565b806366760d7d1161011557806366760d7d1461019f57806369f55592146101a75780636dc0ae22146101af5780637aadef8b146101b75780637e2f35fa146101bf5780638a1c7364146101c75761014d565b80630b297739146101525780630bc9136e146101705780632861c7d1146101855780632fca5d4f1461018d5780636146195414610195575b600080fd5b61015a61023a565b6040516101679190611418565b60405180910390f35b610178610252565b6040516101679190611718565b61015a610257565b61015a61026f565b61019d610287565b005b61019d610308565b61015a61030a565b61015a610322565b61015a61033a565b61015a61035e565b61015a610376565b61015a61038e565b61015a6103a6565b61015a6103be565b61015a6103d6565b61015a6103ee565b61019d610205366004611247565b610406565b61015a61073c565b61015a610754565b61015a61076c565b61015a610784565b61015a61079c565b61015a6107b4565b731c2bb46f36561bc4f05a94bd50916496aa50107881565b601081565b7352aa899454998be5b000ad077a46bbe360f4e49781565b73eabbfca72f8a8bf14c4ac59e69ecb2eb69f0811c81565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102d85760405162461bcd60e51b81526004016102cf9061177f565b60405180910390fd5b6102e06107d8565b6102e86109ff565b6102f0610bae565b6102f8610c9f565b610300610d77565b610308610f47565b565b73bec491fef7b4f666b270f9d5e5c3f443cbf2099181565b730204cd037b2ec03605cfdfe482d8e257c765fa1b81565b7f000000000000000000000000000000000000000000000000000000000000000081565b73059a94a72951c0ae1cc1ce3bf0db52421bbe821081565b73324c5dc1fc42c7a4d43d92df1eba58a54d13bf2d81565b7340d9b8417e6e1dcd358f04e3328bced061018a8281565b7354b91a0d94cb471f37f949c60f7fa7935b551d0381565b737f39c581f595b53c5cb19bd0b3f8da6c935e2ca081565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b7351197586f6a9e2571868b6ffaef308f3bdfed3ae81565b3373a45f7bd6a5ff45d31aace6bcd3d426d9328cea01148061043b575033734f6f977acdd1177dcd81ab83074855ecb9c2d49e145b8061045957503073059a94a72951c0ae1cc1ce3bf0db52421bbe8210145b6104755760405162461bcd60e51b81526004016102cf90611721565b604080516001808252818301909252606090826020808301908036833701905050905060608267ffffffffffffffff811180156104b157600080fd5b506040519080825280602002602001820160405280156104db578160200160208202803683370190505b50905060608367ffffffffffffffff811180156104f757600080fd5b5060405190808252806020026020018201604052801561052b57816020015b60608152602001906001900390816105165790505b50905060608467ffffffffffffffff8111801561054757600080fd5b5060405190808252806020026020018201604052801561057b57816020015b60608152602001906001900390816105665790505b5090507f0000000000000000000000000000000000000000000000000000000000000000846000815181106105ac57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000836000815181106105db57fe5b6020026020010181815250506040518060600160405280602481526020016117aa602491398260008151811061060d57fe5b60209081029190910181019190915260408051600081529182018152610656917f0000000000000000000000000000000000000000000000000000000000000000918101611489565b6040516020818303038152906040528160008151811061067257fe5b6020908102919091010152604051636d4ab48d60e11b8152600090730204cd037b2ec03605cfdfe482d8e257c765fa1b9063da95691a906106bf9088908890889088908e906004016114d2565b602060405180830381600087803b1580156106d957600080fd5b505af11580156106ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071191906112dc565b9050601081146107335760405162461bcd60e51b81526004016102cf90611751565b50505050505050565b73cd5fe23c85820f7b72d0926fc9b05b43e359b7ee81565b734f6f977acdd1177dcd81ab83074855ecb9c2d49e81565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73a45f7bd6a5ff45d31aace6bcd3d426d9328cea0181565b73dac17f958d2ee523a2206206994597c13d831ec781565b7f000000000000000000000000000000000000000000000000000000000000000081565b604080516001808252818301909252606091816020015b6107f7611147565b8152602001906001900390816107ef5790505090506040518060e00160405280737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06001600160a01b03168152602001611b5881526020016123288152602001600081526020016107d08152602001610fa08152602001613a988152508160008151811061087457fe5b6020908102919091010152604051639dde597760e01b81527352aa899454998be5b000ad077a46bbe360f4e49790639dde5977906108b69084906004016115cb565b600060405180830381600087803b1580156108d057600080fd5b505af11580156108e4573d6000803e3d6000fd5b50505050506060600167ffffffffffffffff8111801561090357600080fd5b5060405190808252806020026020018201604052801561093d57816020015b61092a61118d565b8152602001906001900390816109225790505b5090506040518060600160405280737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06001600160a01b031681526020016103e88152602001601e8152508160008151811061098857fe5b60209081029190910101526040516338b7e8e760e01b81527352aa899454998be5b000ad077a46bbe360f4e497906338b7e8e7906109ca908490600401611649565b600060405180830381600087803b1580156109e457600080fd5b505af11580156109f8573d6000803e3d6000fd5b5050505050565b604080516001808252818301909252606091816020015b610a1e611147565b815260200190600190039081610a165790505090506040518060e0016040528073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168152602001611b5881526020016123288152602001600081526020016105dc81526020016109c48152602001613a9881525081600081518110610a9b57fe5b6020908102919091010152604051639dde597760e01b81527352aa899454998be5b000ad077a46bbe360f4e49790639dde597790610add9084906004016115cb565b600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b50505050506060600167ffffffffffffffff81118015610b2a57600080fd5b50604051908082528060200260200182016040528015610b6457816020015b610b5161118d565b815260200190600190039081610b495790505b509050604051806060016040528073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0316815260200160008152602001601e8152508160008151811061098857fe5b60408051600180825281830190925273133098588cdf2e35b9478a1f4979c4f7ccee3a069160609190816020015b610be46111b7565b815260200190600190039081610bdc5790505090506040518060400160405280836001600160a01b031681526020016001151581525081600081518110610c2757fe5b6020908102919091010152604051633f66feff60e01b81527352aa899454998be5b000ad077a46bbe360f4e49790633f66feff90610c69908490600401611571565b600060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b505050505050565b604051634a138a7160e01b81527351197586f6a9e2571868b6ffaef308f3bdfed3ae90634a138a7190610cd890611f4090600401611718565b600060405180830381600087803b158015610cf257600080fd5b505af1158015610d06573d6000803e3d6000fd5b5050604051634a138a7160e01b8152731c2bb46f36561bc4f05a94bd50916496aa5010789250634a138a719150610d4390611f4090600401611718565b600060405180830381600087803b158015610d5d57600080fd5b505af1158015610d71573d6000803e3d6000fd5b50505050565b604051634a138a7160e01b815273eabbfca72f8a8bf14c4ac59e69ecb2eb69f0811c90634a138a7190610db09061271090600401611718565b600060405180830381600087803b158015610dca57600080fd5b505af1158015610dde573d6000803e3d6000fd5b5050604051637faa1d2160e01b815273324c5dc1fc42c7a4d43d92df1eba58a54d13bf2d9250637faa1d219150610e469073eabbfca72f8a8bf14c4ac59e69ecb2eb69f0811c907358dc7894a7b1b9d065ce2e94a73f62686b439a2a9060009060040161142c565b600060405180830381600087803b158015610e6057600080fd5b505af1158015610e74573d6000803e3d6000fd5b5050604051634a138a7160e01b815273bec491fef7b4f666b270f9d5e5c3f443cbf209919250634a138a719150610eb19061271090600401611718565b600060405180830381600087803b158015610ecb57600080fd5b505af1158015610edf573d6000803e3d6000fd5b5050604051637faa1d2160e01b815273324c5dc1fc42c7a4d43d92df1eba58a54d13bf2d9250637faa1d219150610d439073bec491fef7b4f666b270f9d5e5c3f443cbf209919073b36db4dff978d2d552a5149e2fd0fbefa2a328099060009060040161142c565b6040516373c7024d60e11b81526000907354b91a0d94cb471f37f949c60f7fa7935b551d039063e78e049a90610f9790737f39c581f595b53c5cb19bd0b3f8da6c935e2ca0908590600401611450565b602060405180830381600087803b158015610fb157600080fd5b505af1158015610fc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe99190611219565b60408051600180825281830190925291925060609190816020015b61100c6111ce565b8152602001906001900390816110045790505090506040518060c00160405280836001600160a01b03168152602001737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06001600160a01b03168152602001600160ff1681526020016109c4815260200161a8c0815260200168d8d726b7177a8000008152508160008151811061109257fe5b60209081029190910101526040516301635db560e11b81527352aa899454998be5b000ad077a46bbe360f4e497906302c6bb6a906110d490849060040161169e565b600060405180830381600087803b1580156110ee57600080fd5b505af1158015611102573d6000803e3d6000fd5b505060405163b046a44960e01b81526001600160a01b038516935063b046a44992506109ca915073264786ef916af64a1db19f513f24a3681734ce9290600401611418565b6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600060ff1681526020016000815260200160008152602001600081525090565b60006020828403121561122a578081fd5b81516001600160a01b0381168114611240578182fd5b9392505050565b60006020808385031215611259578182fd5b823567ffffffffffffffff80821115611270578384fd5b818501915085601f830112611283578384fd5b81358181111561128f57fe5b604051601f8201601f19168101850183811182821017156112ac57fe5b60405281815283820185018810156112c2578586fd5b818585018683013790810190930193909352509392505050565b6000602082840312156112ed578081fd5b5051919050565b60008282518085526020808601955080818302840101818601855b8481101561133d57601f1986840301895261132b8383516113cd565b9884019892509083019060010161130f565b5090979650505050505050565b60008282518085526020808601955080818302840101818601855b8481101561133d57601f198684030189526113818383516113cd565b98840198925090830190600101611365565b6000815180845260208085019450808401835b838110156113c2578151875295820195908201906001016113a6565b509495945050505050565b60008151808452815b818110156113f2576020818501810151868301820152016113d6565b818111156114035782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6001600160a01b0392909216825260606020830181905260069083015265332a37b5b2b760d11b60808301521515604082015260a00190565b600060018060a01b038416825260606020830152600960608301526865786563757465282960b81b608083015260a060408301526114ca60a08301846113cd565b949350505050565b60a0808252865190820181905260009060209060c0840190828a01845b828110156115145781516001600160a01b0316845292840192908401906001016114ef565b505050838103828501526115288189611393565b915050828103604084015261153d818761134a565b9050828103606084015261155181866112f4565b9050828103608084015261156581856113cd565b98975050505050505050565b602080825282518282018190526000919060409081850190868401855b828110156115be57815180516001600160a01b03168552860151151586850152928401929085019060010161158e565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156115be57815180516001600160a01b0316855286810151878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0908101519085015260e090930192908501906001016115e8565b602080825282518282018190526000919060409081850190868401855b828110156115be57815180516001600160a01b0316855286810151878601528501518585015260609093019290850190600101611666565b602080825282518282018190526000919060409081850190868401855b828110156115be57815180516001600160a01b0390811686528782015116878601528581015160ff1686860152606080820151908601526080808201519086015260a0908101519085015260c090930192908501906001016116bb565b90815260200190565b6020808252601690820152751b5cd9cb9cd95b99195c8b5b9bdd0b585b1b1bddd95960521b604082015260600190565b60208082526014908201527350524f504f53414c5f49535f4e4f545f53414d4560601b604082015260600190565b60208082526010908201526f3737ba16bb30b634b216b1b0b63632b960811b60408201526060019056fe657865637574655061796c6f616428616464726573732c737472696e672c627974657329a26469706673582212203e3b5acc81966044652b95ce3f5a13f0f601f582cf8e585e6c1fe03fcc4728c864736f6c63430007030033","abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ADDRESS_THIS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNOR","outputs":[{"internalType":"contract IGovernorBravo","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LENDING_FACTORY","outputs":[{"internalType":"contract IFluidLendingFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY","outputs":[{"internalType":"contract IFluidLiquidityAdmin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROPOSAL_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROPOSER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROPOSER_AVO_MULTISIG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_MULTISIG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMELOCK","outputs":[{"internalType":"contract ITimelock","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_ETH_USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_ETH_USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_T1_FACTORY","outputs":[{"internalType":"contract IFluidVaultT1Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_weETH_wstETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_wstETH_USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_wstETH_USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"description","type":"string"}],"name":"propose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifyProposal","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wstETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]} \ No newline at end of file diff --git a/scripts/deployIGP16.js b/scripts/deployIGP16.js new file mode 100644 index 0000000..9dee9fd --- /dev/null +++ b/scripts/deployIGP16.js @@ -0,0 +1,22 @@ +const hre = require("hardhat"); +const { ethers } = hre; + +async function main() { + const PayloadIGP16 = await ethers.getContractFactory("PayloadIGP16") + const payloadIGP16 = await PayloadIGP16.deploy() + await payloadIGP16.deployed() + + console.log("PayloadIGP16: ", payloadIGP16.address) + + await hre.run("verify:verify", { + address: payloadIGP16.address, + constructorArguments: [] + }) +} + +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deploySimulation.js b/scripts/deploySimulation.js index ffd53cc..8db49b7 100644 --- a/scripts/deploySimulation.js +++ b/scripts/deploySimulation.js @@ -2,10 +2,10 @@ const hre = require("hardhat"); const { ethers } = hre; async function main() { - const payload = await ethers.deployContract("PayloadIGP15", []) + const payload = await ethers.deployContract("PayloadIGP16", []) await payload.waitForDeployment() - console.log("PayloadIGP15: ", payload.target) + console.log("PayloadIGP16: ", payload.target) console.log() }