diff --git a/lib/aave-address-book b/lib/aave-address-book index 4d208edf..c7900ada 160000 --- a/lib/aave-address-book +++ b/lib/aave-address-book @@ -1 +1 @@ -Subproject commit 4d208edf7271e0fff0eceed55de535e32dc055d4 +Subproject commit c7900adaa8b454ae3e7b24cb729283257978c9eb diff --git a/lib/aave-stk-v1-5 b/lib/aave-stk-v1-5 index 0348eb11..3dbba868 160000 --- a/lib/aave-stk-v1-5 +++ b/lib/aave-stk-v1-5 @@ -1 +1 @@ -Subproject commit 0348eb110fcaf1937fcae3a1043ffe72bf98f82a +Subproject commit 3dbba868a21a19075562e43c6137e049aa6f22bc diff --git a/lib/aave-v3-core b/lib/aave-v3-core index a00f28e3..782f5191 160000 --- a/lib/aave-v3-core +++ b/lib/aave-v3-core @@ -1 +1 @@ -Subproject commit a00f28e3ad7c0e4a369d8e06e0ac9fd0acabcab7 +Subproject commit 782f51917056a53a2c228701058a6c3fb233684a diff --git a/lib/aave-v3-periphery b/lib/aave-v3-periphery index 222c1c67..803c3e7d 160000 --- a/lib/aave-v3-periphery +++ b/lib/aave-v3-periphery @@ -1 +1 @@ -Subproject commit 222c1c678a2a8968eb8ee31404e3eef098a6f447 +Subproject commit 803c3e7d6d1c6da8d91411f4d085494f7189ea0b diff --git a/lib/solidity-utils b/lib/solidity-utils index 9d4d0415..1422f3e6 160000 --- a/lib/solidity-utils +++ b/lib/solidity-utils @@ -1 +1 @@ -Subproject commit 9d4d041562f7ac2918e216e2e7c74172afe3d2af +Subproject commit 1422f3e6cc2ea038e37b1578e713b13b1f6f2dc8 diff --git a/src/contracts/gho/UpgradeableGhoToken.sol b/src/contracts/gho/UpgradeableGhoToken.sol index 402788ce..25551ce1 100644 --- a/src/contracts/gho/UpgradeableGhoToken.sol +++ b/src/contracts/gho/UpgradeableGhoToken.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {EnumerableSet} from '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {Initializable} from 'solidity-utils/contracts/transparent-proxy/Initializable.sol'; +import {Initializable} from '@openzeppelin/contracts/proxy/utils/Initializable.sol'; import {UpgradeableERC20} from './UpgradeableERC20.sol'; import {IGhoToken} from './interfaces/IGhoToken.sol'; diff --git a/src/contracts/misc/dependencies/AaveV3-1.sol b/src/contracts/misc/dependencies/AaveV3-1.sol index 01e8ea59..ca6af8e1 100644 --- a/src/contracts/misc/dependencies/AaveV3-1.sol +++ b/src/contracts/misc/dependencies/AaveV3-1.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; -import {Address} from 'solidity-utils/contracts/oz-common/Address.sol'; +import {Address} from '@openzeppelin/contracts/utils/Address.sol'; import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol'; import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; diff --git a/src/script/DeployGsm4626.s.sol b/src/script/DeployGsm4626.s.sol new file mode 100644 index 00000000..a09fdb68 --- /dev/null +++ b/src/script/DeployGsm4626.s.sol @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {Script, console2} from 'forge-std/Script.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {TransparentProxyFactory} from 'solidity-utils/contracts/transparent-proxy/TransparentProxyFactory.sol'; +import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; + +import {Gsm4626} from 'src/contracts/facilitators/gsm/Gsm4626.sol'; +import {FixedPriceStrategy4626} from 'src/contracts/facilitators/gsm/priceStrategy/FixedPriceStrategy4626.sol'; +import {IGsm} from 'src/contracts/facilitators/gsm/interfaces/IGsm.sol'; +import {OracleSwapFreezer} from 'src/contracts/facilitators/gsm/swapFreezer/OracleSwapFreezer.sol'; + +// GSM USDC +uint8 constant USDC_DECIMALS = 6; +uint128 constant USDC_EXPOSURE_CAP = 8_000_000e6; + +// GSM USDT +uint8 constant USDT_DECIMALS = 6; +uint128 constant USDT_EXPOSURE_CAP = 16_000_000e6; + +uint128 constant SWAP_FREEZE_LOWER_BOUND = 0.99e8; +uint128 constant SWAP_FREEZE_UPPER_BOUND = 1.01e8; +uint128 constant SWAP_UNFREEZE_LOWER_BOUND = 0.995e8; +uint128 constant SWAP_UNFREEZE_UPPER_BOUND = 1.005e8; +bool constant SWAP_UNFREEZE_ALLOWED = true; + +contract DeployGsm4626 is Script { + function run() external { + uint256 deployerPrivateKey = vm.envUint('PRIVATE_KEY'); + address deployerAddress = vm.addr(deployerPrivateKey); + console2.log('Deployer Address: ', deployerAddress); + console2.log('Deployer Balance: ', address(deployerAddress).balance); + console2.log('Block Number: ', block.number); + vm.startBroadcast(deployerPrivateKey); + _deploy(); + vm.stopBroadcast(); + } + + function _deploy() internal { + // ------------------------------------------------ + // 1. FixedPriceStrategy + // ------------------------------------------------ + FixedPriceStrategy gsmUsdcPriceStrategy = new FixedPriceStrategy( + GSM_PRICE_RATIO, + AaveV3EthereumAssets.USDC_UNDERLYING, + USDC_DECIMALS + ); + console2.log('GSM USDC FixedPriceStrategy: ', address(gsmUsdcPriceStrategy)); + + FixedPriceStrategy gsmUsdtPriceStrategy = new FixedPriceStrategy( + GSM_PRICE_RATIO, + AaveV3EthereumAssets.USDT_UNDERLYING, + USDT_DECIMALS + ); + + // ------------------------------------------------ + // 2. GSM implementations + // ------------------------------------------------ + Gsm4626 gsmUsdcImpl = new Gsm4626( + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDC_STATA_TOKEN, + address(gsmUsdcPriceStrategy) + ); + console2.log('GSM stataUSDC Implementation: ', address(gsmUsdcImpl)); + + Gsm4626 gsmUsdtImpl = new Gsm4626( + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDT_STATA_TOKEN, + address(gsmUsdtPriceStrategy) + ); + console2.log('GSM stataUSDT Implementation: ', address(gsmUsdtImpl)); + + gsmUsdcImpl.initialize( + GovernanceV3Ethereum.EXECUTOR_LVL_1, + address(AaveV3Ethereum.COLLECTOR), + USDC_EXPOSURE_CAP + ); + gsmUsdtImpl.initialize( + GovernanceV3Ethereum.EXECUTOR_LVL_1, + address(AaveV3Ethereum.COLLECTOR), + USDT_EXPOSURE_CAP + ); + + // ------------------------------------------------ + // 3. GSM proxy deployment and initialization + // ------------------------------------------------ + bytes memory gsmUsdcInitParams = abi.encodeWithSignature( + 'initialize(address,address,uint128)', + GovernanceV3Ethereum.EXECUTOR_LVL_1, + address(AaveV3Ethereum.COLLECTOR), + USDC_EXPOSURE_CAP + ); + address gsmUsdcProxy = TransaprentProxyFactory(MiscEthereum.TRANSPARENT_PROXY_FACTORY).create( + address(gsmUsdcImpl), + GovernanceV3Ethereum.EXECUTOR_LVL_1, + gsmUsdcInitParams + ); + console2.log('GSM stataUSDC Proxy: ', gsmUsdcProxy); + + bytes memory gsmUsdtInitParams = abi.encodeWithSignature( + 'initialize(address,address,uint128)', + GovernanceV3Ethereum.EXECUTOR_LVL_1, + address(AaveV3Ethereum.COLLECTOR), + USDT_EXPOSURE_CAP + ); + address gsmUsdtProxy = TransaprentProxyFactory(MiscEthereum.TRANSPARENT_PROXY_FACTORY).create( + address(gsmUsdtImpl), + GovernanceV3Ethereum.EXECUTOR_LVL_1, + gsmUsdtInitParams + ); + console2.log('GSM stataUSDT Proxy: ', gsmUsdtProxy); + + // ------------------------------------------------ + // 4. OracleSwapFreezers + // ------------------------------------------------ + OracleSwapFreezer gsmUsdcOracleSwapFreezer = new OracleSwapFreezer( + IGsm(gsmUsdcProxy), + AaveV3EthereumAssets.USDC_UNDERLYING, + IPoolAddressesProvider(address(AaveV3Ethereum.POOL_ADDRESSES_PROVIDER)), + SWAP_FREEZE_LOWER_BOUND, + SWAP_FREEZE_UPPER_BOUND, + SWAP_UNFREEZE_LOWER_BOUND, + SWAP_UNFREEZE_UPPER_BOUND, + SWAP_UNFREEZE_ALLOWED + ); + console2.log('GSM stataUSDC OracleSwapFreezer: ', address(gsmUsdcOracleSwapFreezer)); + + OracleSwapFreezer gsmUsdtOracleSwapFreezer = new OracleSwapFreezer( + IGsm(gsmUsdtProxy), + AaveV3EthereumAssets.USDT_UNDERLYING, + IPoolAddressesProvider(address(AaveV3Ethereum.POOL_ADDRESSES_PROVIDER)), + SWAP_FREEZE_LOWER_BOUND, + SWAP_FREEZE_UPPER_BOUND, + SWAP_UNFREEZE_LOWER_BOUND, + SWAP_UNFREEZE_UPPER_BOUND, + SWAP_UNFREEZE_ALLOWED + ); + console2.log('GSM stataUSDT OracleSwapFreezer: ', address(gsmUsdtOracleSwapFreezer)); + } +} diff --git a/src/script/DeployGsmLaunch.s.sol b/src/script/DeployGsmLaunch.s.sol index 9983c5b1..93e23581 100644 --- a/src/script/DeployGsmLaunch.s.sol +++ b/src/script/DeployGsmLaunch.s.sol @@ -5,7 +5,7 @@ import {Script, console2} from 'forge-std/Script.sol'; import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; -import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {TransparentUpgradeableProxy} from '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol'; import {IPoolAddressesProvider} from '@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol'; import {Gsm} from '../contracts/facilitators/gsm/Gsm.sol'; import {IGsm} from '../contracts/facilitators/gsm/interfaces/IGsm.sol'; diff --git a/src/test/TestGhoBase.t.sol b/src/test/TestGhoBase.t.sol index b382234c..48c3882d 100644 --- a/src/test/TestGhoBase.t.sol +++ b/src/test/TestGhoBase.t.sol @@ -49,7 +49,7 @@ import {AdminUpgradeabilityProxy} from '@aave/core-v3/contracts/dependencies/ope import {ERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/ERC20.sol'; import {StakedAaveV3} from 'aave-stk-v1-5/src/contracts/StakedAaveV3.sol'; import {ReserveConfiguration} from '@aave/core-v3/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; -import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {TransparentUpgradeableProxy} from '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol'; // GHO contracts import {GhoAToken} from '../contracts/facilitators/aave/tokens/GhoAToken.sol'; diff --git a/src/test/TestGhoStewardsForkRemote.t.sol b/src/test/TestGhoStewardsForkRemote.t.sol index c58f81c8..f21c392f 100644 --- a/src/test/TestGhoStewardsForkRemote.t.sol +++ b/src/test/TestGhoStewardsForkRemote.t.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import 'forge-std/Test.sol'; import {IAccessControl} from '@openzeppelin/contracts/access/IAccessControl.sol'; import {IACLManager} from '@aave/core-v3/contracts/interfaces/IACLManager.sol'; -import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {TransparentUpgradeableProxy} from '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol'; import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; import {IPoolAddressesProvider, IPoolDataProvider} from 'aave-address-book/AaveV3.sol'; diff --git a/src/test/mocks/MockUpgradeable.sol b/src/test/mocks/MockUpgradeable.sol index 285679b0..252fcda6 100644 --- a/src/test/mocks/MockUpgradeable.sol +++ b/src/test/mocks/MockUpgradeable.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {Initializable} from 'solidity-utils/contracts/transparent-proxy/Initializable.sol'; +import {Initializable} from '@openzeppelin/contracts/proxy/utils/Initializable.sol'; /** * @dev Mock contract to test upgrades, not to be used in production. diff --git a/src/test/mocks/MockUpgradeableBurnMintTokenPool.sol b/src/test/mocks/MockUpgradeableBurnMintTokenPool.sol index 4865ac90..f18faec7 100644 --- a/src/test/mocks/MockUpgradeableBurnMintTokenPool.sol +++ b/src/test/mocks/MockUpgradeableBurnMintTokenPool.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; -import {Initializable} from 'solidity-utils/contracts/transparent-proxy/Initializable.sol'; +import {Initializable} from '@openzeppelin/contracts/proxy/utils/Initializable.sol'; import {EnumerableSet} from '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; import {RateLimiter} from 'src/contracts/misc/dependencies/Ccip.sol'; import {IRouter} from 'src/contracts/misc/dependencies/Ccip.sol'; diff --git a/src/test/mocks/MockUpgradeableLockReleaseTokenPool.sol b/src/test/mocks/MockUpgradeableLockReleaseTokenPool.sol index 774671ee..f33ac65a 100644 --- a/src/test/mocks/MockUpgradeableLockReleaseTokenPool.sol +++ b/src/test/mocks/MockUpgradeableLockReleaseTokenPool.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; -import {Initializable} from 'solidity-utils/contracts/transparent-proxy/Initializable.sol'; +import {Initializable} from '@openzeppelin/contracts/proxy/utils/Initializable.sol'; import {EnumerableSet} from '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; import {RateLimiter} from 'src/contracts/misc/dependencies/Ccip.sol'; import {IRouter} from 'src/contracts/misc/dependencies/Ccip.sol';