From 7d117a52c3bf21b905f6fc74fd44c72ed22e6017 Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Thu, 5 May 2022 22:34:38 +0530 Subject: [PATCH] added function for imprtWithCollateral --- .../connectors/aave/v3-import/events.sol | 10 ++ .../connectors/aave/v3-import/helpers.sol | 3 +- .../connectors/aave/v3-import/main.sol | 96 +++++++++++++++++++ 3 files changed, 108 insertions(+), 1 deletion(-) diff --git a/contracts/polygon/connectors/aave/v3-import/events.sol b/contracts/polygon/connectors/aave/v3-import/events.sol index 03aafca4..2a1c4e23 100644 --- a/contracts/polygon/connectors/aave/v3-import/events.sol +++ b/contracts/polygon/connectors/aave/v3-import/events.sol @@ -12,4 +12,14 @@ contract Events { uint256[] supplyAmts, uint256[] borrowAmts ); + event LogAaveV3ImportWithCollateral( + address indexed user, + address[] ctokens, + string[] supplyIds, + string[] borrowIds, + uint256[] flashLoanFees, + uint256[] supplyAmts, + uint256[] borrowAmts, + bool[] enableCollateral + ); } diff --git a/contracts/polygon/connectors/aave/v3-import/helpers.sol b/contracts/polygon/connectors/aave/v3-import/helpers.sol index ebad1560..7e1ffbc2 100644 --- a/contracts/polygon/connectors/aave/v3-import/helpers.sol +++ b/contracts/polygon/connectors/aave/v3-import/helpers.sol @@ -229,10 +229,11 @@ contract AaveHelpers is Helper { ATokenInterface[] memory atokenContracts, uint256[] memory amts, address[] memory tokens, + bool[] memory colEnable, address userAccount ) internal { for (uint256 i = 0; i < _length; i++) { - if (amts[i] > 0) { + if (amts[i] > 0 && colEnable[i]) { uint256 _amt = amts[i]; require( atokenContracts[i].transferFrom( diff --git a/contracts/polygon/connectors/aave/v3-import/main.sol b/contracts/polygon/connectors/aave/v3-import/main.sol index 4a3b38e7..5356818a 100644 --- a/contracts/polygon/connectors/aave/v3-import/main.sol +++ b/contracts/polygon/connectors/aave/v3-import/main.sol @@ -92,6 +92,87 @@ contract AaveV3ImportResolver is AaveHelpers { ); } + function _importAaveWithCollateral(address userAccount, ImportInputData memory inputData, bool[] memory enableCollateral) + internal + returns (string memory _eventName, bytes memory _eventParam) + { + require( + AccountInterface(address(this)).isAuth(userAccount), + "user-account-not-auth" + ); + + require(inputData.supplyTokens.length > 0, "0-length-not-allowed"); + + ImportData memory data; + + AaveInterface aave = AaveInterface(aaveProvider.getPool()); + + data = getBorrowAmounts(userAccount, aave, inputData, data); + data = getSupplyAmounts(userAccount, inputData, data); + + // payback borrowed amount; + _PaybackStable( + data._borrowTokens.length, + aave, + data._borrowTokens, + data.stableBorrowAmts, + userAccount + ); + _PaybackVariable( + data._borrowTokens.length, + aave, + data._borrowTokens, + data.variableBorrowAmts, + userAccount + ); + + // transfer atokens to this address; + _TransferAtokens( + data._supplyTokens.length, + aave, + data.aTokens, + data.supplyAmts, + data._supplyTokens, + userAccount + ); + + // borrow assets after migrating position + if (data.convertStable) { + _BorrowVariable( + data._borrowTokens.length, + aave, + data._borrowTokens, + data.totalBorrowAmtsWithFee + ); + } else { + _BorrowStable( + data._borrowTokens.length, + aave, + data._borrowTokens, + data.stableBorrowAmtsWithFee + ); + _BorrowVariable( + data._borrowTokens.length, + aave, + data._borrowTokens, + data.variableBorrowAmtsWithFee + ); + } + + _eventName = "LogAaveV3ImportWithCollateral(address,bool,address[],address[],uint256[],uint256[],uint256[],uint256[])"; + _eventParam = abi.encode( + userAccount, + inputData.convertStable, + inputData.supplyTokens, + inputData.borrowTokens, + inputData.flashLoanFees, + data.supplyAmts, + data.stableBorrowAmts, + data.variableBorrowAmts, + enableCollateral + ); + } + /** * @dev Import aave V3 position . * @notice Import EOA's aave V3 position to DSA's aave v3 position @@ -105,6 +186,21 @@ contract AaveV3ImportResolver is AaveHelpers { { (_eventName, _eventParam) = _importAave(userAccount, inputData); } + + /** + * @dev Import aave V3 position (with collateral). + * @notice Import EOA's aave V3 position to DSA's aave v3 position + * @param userAccount The address of the EOA from which aave position will be imported + * @param inputData The struct containing all the neccessary input data + * @param enableCollateral The boolean array to enable selected collaterals in the imported position + */ + function importAaveWithCollateral(address userAccount, ImportInputData memory inputData, bool[] memory enableCollateral) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + (_eventName, _eventParam) = _importAaveWithCollateral(userAccount, inputData, enableCollateral); + } } contract ConnectV2AaveV3ImportPolygon is AaveV3ImportResolver {