11// SPDX-License-Identifier: BUSL-1.1
22pragma solidity ^ 0.8.0 ;
33
4- import {HorizonPhaseOneListingTest, IDefaultInterestRateStrategyV2, ReserveConfiguration, DataTypes, EModeConfiguration} from './HorizonPhaseOneListing.t.sol ' ;
4+ import './HorizonPhaseOneListing.t.sol ' ;
55import {DeployHorizonPhaseOneUpdatePayload} from '../../scripts/misc/DeployHorizonPhaseOneUpdatePayload.sol ' ;
66
77/// forge-config: default.evm_version = "cancun"
88contract HorizonPhaseOneUpdateTest is HorizonPhaseOneListingTest {
99 using ReserveConfiguration for DataTypes.ReserveConfigurationMap;
1010 using EModeConfiguration for uint128 ;
11+ using PercentageMath for uint256 ;
1112
1213 // horizon addresses
1314 DeploymentInfo internal deploymentInfo =
@@ -40,9 +41,20 @@ contract HorizonPhaseOneUpdateTest is HorizonPhaseOneListingTest {
4041 return deploymentInfo;
4142 }
4243
44+ function test_listing (address token , TokenListingParams memory params ) internal virtual override {
45+ super .test_listing (token, params);
46+ if (params.isRwa) {
47+ test_nonEMode_collateralization (
48+ token,
49+ params,
50+ _toDynamicAddressArray (USDC_ADDRESS, RLUSD_ADDRESS, GHO_ADDRESS)
51+ );
52+ }
53+ }
54+
4355 function setUp () public virtual override {
44- vm.skip ( true );
45- super . setUp ();
56+ vm.createSelectFork ( ' mainnet ' , 23220361 );
57+ initEnvironment ();
4658 loadUpdatedParams ();
4759 }
4860
@@ -253,16 +265,69 @@ contract HorizonPhaseOneUpdateTest is HorizonPhaseOneListingTest {
253265 assertEq (pool.getEModeCategoryCollateralBitmap (eModeCategory), 0 , 'emode.collateralBitmap ' );
254266 assertEq (pool.getEModeCategoryBorrowableBitmap (eModeCategory), 0 , 'emode.borrowableBitmap ' );
255267 }
268+
269+ function test_nonEMode_collateralization (
270+ address token ,
271+ TokenListingParams memory params ,
272+ address [] memory borrowableAssets
273+ ) private {
274+ address poolConfigurator = pool.ADDRESSES_PROVIDER ().getPoolConfigurator ();
275+ vm.prank (poolAdmin);
276+ IPoolConfigurator (poolConfigurator).setPoolPause (false );
277+
278+ IAaveOracle oracle = IAaveOracle (pool.ADDRESSES_PROVIDER ().getPriceOracle ());
279+ uint256 amountInBaseCurrency = 1e5 * 1e8 ;
280+
281+ uint256 supplyAmount = (amountInBaseCurrency * 10 ** IERC20Detailed (token).decimals ()) /
282+ oracle.getAssetPrice (token) +
283+ 1 ;
284+ deal (token, alice, supplyAmount);
285+
286+ vm.startPrank (alice);
287+ IERC20Detailed (token).approve (address (pool), supplyAmount);
288+ pool.supply (token, supplyAmount, alice, 0 );
289+ vm.stopPrank ();
290+
291+ for (uint256 j = 0 ; j < borrowableAssets.length ; j++ ) {
292+ address borrowAsset = borrowableAssets[j];
293+ uint256 borrowAmount = (amountInBaseCurrency.percentMul (params.ltv) *
294+ 10 ** IERC20Detailed (borrowAsset).decimals ()) /
295+ oracle.getAssetPrice (borrowAsset) -
296+ 1 ;
297+
298+ deal (borrowAsset, bob, borrowAmount);
299+
300+ vm.startPrank (bob);
301+ IERC20Detailed (borrowAsset).approve (address (pool), borrowAmount);
302+ pool.supply (borrowAsset, borrowAmount, bob, 0 );
303+ vm.stopPrank ();
304+
305+ vm.prank (alice);
306+ pool.borrow (borrowAsset, borrowAmount, 2 , 0 , alice);
307+
308+ vm.startPrank (alice);
309+ IERC20Detailed (borrowAsset).approve (address (pool), borrowAmount);
310+ pool.repay (borrowAsset, borrowAmount, 2 , alice);
311+ vm.stopPrank ();
312+
313+ vm.prank (bob);
314+ pool.withdraw (borrowAsset, borrowAmount, bob);
315+ }
316+
317+ vm.prank (alice);
318+ pool.withdraw (token, supplyAmount, alice);
319+ }
256320}
257321
322+ /// forge-config: default.evm_version = "cancun"
323+ // can be run after payload has been deployed but before execution via multisig
258324contract HorizonPhaseOneUpdatePostDeploymentForkTest is HorizonPhaseOneUpdateTest {
259325 function setUp () public override {
260- vm.skip (true , 'post-payload deployment ' );
261326 super .setUp ();
262327 }
263328
264329 function loadDeployment () internal override returns (DeploymentInfo memory ) {
265- address horizonPhaseOneUpdate; // TODO: deployed payload address
330+ address horizonPhaseOneUpdate = 0xb14fbFcFDC5d725B6624Cb076dF617eE90aD7A6b ; // deployed payload address
266331 vm.prank (EMERGENCY_MULTISIG);
267332 (bool success , ) = LISTING_EXECUTOR_ADDRESS.call (
268333 abi.encodeWithSignature (
@@ -280,10 +345,13 @@ contract HorizonPhaseOneUpdatePostDeploymentForkTest is HorizonPhaseOneUpdateTes
280345 }
281346}
282347
348+ /// forge-config: default.evm_version = "cancun"
349+ // can be run after payload has been executed
283350contract HorizonPhaseOneUpdatePostExecutionForkTest is HorizonPhaseOneUpdateTest {
284351 function setUp () public override {
285- vm.skip (true , 'post-payload execution ' );
286- super .setUp ();
352+ vm.createSelectFork ('mainnet ' , 23229020 );
353+ initEnvironment ();
354+ loadUpdatedParams ();
287355 }
288356
289357 function loadDeployment () internal view override returns (DeploymentInfo memory ) {
0 commit comments