From 94554c2523001d00b0e3c2955c6237f30b3c415d Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Tue, 10 May 2022 14:21:49 +0530 Subject: [PATCH] updated aave-v2 connector|polygon,avalanche --- .../avalanche/connectors/aave/v2/events.sol | 42 +++++++++++-- .../avalanche/connectors/aave/v2/helpers.sol | 15 +++++ .../avalanche/connectors/aave/v2/main.sol | 57 ++++++++++++++++- .../polygon/connectors/aave/v2/events.sol | 42 +++++++++++-- .../polygon/connectors/aave/v2/helpers.sol | 15 +++++ contracts/polygon/connectors/aave/v2/main.sol | 63 +++++++++++++++++-- 6 files changed, 215 insertions(+), 19 deletions(-) diff --git a/contracts/avalanche/connectors/aave/v2/events.sol b/contracts/avalanche/connectors/aave/v2/events.sol index a89e15e4..4640d2fa 100644 --- a/contracts/avalanche/connectors/aave/v2/events.sol +++ b/contracts/avalanche/connectors/aave/v2/events.sol @@ -2,10 +2,40 @@ pragma solidity ^0.7.0; contract Events { - event LogDeposit(address indexed token, uint256 tokenAmt, uint256 getId, uint256 setId); - event LogWithdraw(address indexed token, uint256 tokenAmt, uint256 getId, uint256 setId); - event LogBorrow(address indexed token, uint256 tokenAmt, uint256 indexed rateMode, uint256 getId, uint256 setId); - event LogPayback(address indexed token, uint256 tokenAmt, uint256 indexed rateMode, uint256 getId, uint256 setId); - event LogEnableCollateral(address[] tokens); - event LogSwapRateMode(address indexed token, uint256 rateMode); + event LogDeposit( + address indexed token, + uint256 tokenAmt, + uint256 getId, + uint256 setId + ); + event LogWithdraw( + address indexed token, + uint256 tokenAmt, + uint256 getId, + uint256 setId + ); + event LogBorrow( + address indexed token, + uint256 tokenAmt, + uint256 indexed rateMode, + uint256 getId, + uint256 setId + ); + event LogPayback( + address indexed token, + uint256 tokenAmt, + uint256 indexed rateMode, + uint256 getId, + uint256 setId + ); + event LogEnableCollateral(address[] tokens); + event LogSwapRateMode(address indexed token, uint256 rateMode); + event LogPaybackOnBehalfOf( + address token, + uint256 amt, + uint256 rateMode, + address onBehalfOf, + uint256 getId, + uint256 setId + ); } diff --git a/contracts/avalanche/connectors/aave/v2/helpers.sol b/contracts/avalanche/connectors/aave/v2/helpers.sol index 3f7dc223..d964c6db 100644 --- a/contracts/avalanche/connectors/aave/v2/helpers.sol +++ b/contracts/avalanche/connectors/aave/v2/helpers.sol @@ -40,6 +40,21 @@ abstract contract Helpers is DSMath, Basic { return rateMode == 1 ? stableDebt : variableDebt; } + /** + * @dev Get OnBehalfOf user's total debt balance & fee for an asset + * @param token token address of the debt.(For AVAX: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param rateMode Borrow rate mode (Stable = 1, Variable = 2) + */ + function getOnBehalfOfPaybackBalance(address token, uint256 rateMode, address onBehalfOf) + internal + view + returns (uint256) + { + (, uint256 stableDebt, uint256 variableDebt, , , , , , ) = aaveData + .getUserReserveData(token, onBehalfOf); + return rateMode == 1 ? stableDebt : variableDebt; + } + /** * @dev Get total collateral balance for an asset * @param token token address of the collateral.(For AVAX: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) diff --git a/contracts/avalanche/connectors/aave/v2/main.sol b/contracts/avalanche/connectors/aave/v2/main.sol index 6ae9d88f..b10162aa 100644 --- a/contracts/avalanche/connectors/aave/v2/main.sol +++ b/contracts/avalanche/connectors/aave/v2/main.sol @@ -151,7 +151,11 @@ abstract contract AaveResolver is Events, Helpers { TokenInterface tokenContract = TokenInterface(_token); - _amt = _amt == uint(-1) ? getPaybackBalance(_token, rateMode) : _amt; + if (_amt == uint(-1)) { + uint _amtDSA = isAVAX ? address(this).balance : tokenContract.balanceOf(address(this)); + uint _amtDebt = getPaybackBalance(_token, rateMode); + _amt = _amtDSA <= _amtDebt ? _amtDSA : _amtDebt; + } if (isAVAX) convertAvaxToWavax(isAVAX, tokenContract, _amt); @@ -165,6 +169,55 @@ abstract contract AaveResolver is Events, Helpers { _eventParam = abi.encode(token, _amt, rateMode, getId, setId); } + /** + * @dev Payback borrowed AVAX/ERC20_Token on behalf of a user. + * @notice Payback debt owed on behalf os a user. + * @param token The address of the token to payback.(For AVAX: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param amt The amount of the token to payback. (For max: `uint256(-1)`) + * @param rateMode The type of debt paying back. (For Stable: 1, Variable: 2) + * @param onBehalfOf Address of user who's debt to repay. + * @param getId ID to retrieve amt. + * @param setId ID stores the amount of tokens paid back. + */ + function paybackOnBehalfOf( + address token, + uint256 amt, + uint256 rateMode, + address onBehalfOf, + uint256 getId, + uint256 setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(getId, amt); + + AaveInterface aave = AaveInterface(aaveProvider.getLendingPool()); + + bool isAVAX = token == avaxAddr; + address _token = isAVAX ? wavaxAddr : token; + + TokenInterface tokenContract = TokenInterface(_token); + + if (_amt == uint(-1)) { + uint _amtDSA = isAVAX ? address(this).balance : tokenContract.balanceOf(address(this)); + uint _amtDebt = getOnBehalfOfPaybackBalance(_token, rateMode, onBehalfOf); + _amt = _amtDSA <= _amtDebt ? _amtDSA : _amtDebt; + } + + if (isAVAX) convertAvaxToWavax(isAVAX, tokenContract, _amt); + + approve(tokenContract, address(aave), _amt); + + aave.repay(_token, _amt, rateMode, onBehalfOf); + + setUint(setId, _amt); + + _eventName = "LogPaybackOnBehalfOf(address,uint256,uint256,address,uint256,uint256)"; + _eventParam = abi.encode(token, _amt, rateMode, onBehalfOf, getId, setId); + } + /** * @dev Enable collateral * @notice Enable an array of tokens as collateral @@ -213,5 +266,5 @@ abstract contract AaveResolver is Events, Helpers { } contract ConnectV2AaveV2Avalanche is AaveResolver { - string constant public name = "AaveV2-v1"; + string constant public name = "AaveV2-v1.1"; } diff --git a/contracts/polygon/connectors/aave/v2/events.sol b/contracts/polygon/connectors/aave/v2/events.sol index a89e15e4..4640d2fa 100644 --- a/contracts/polygon/connectors/aave/v2/events.sol +++ b/contracts/polygon/connectors/aave/v2/events.sol @@ -2,10 +2,40 @@ pragma solidity ^0.7.0; contract Events { - event LogDeposit(address indexed token, uint256 tokenAmt, uint256 getId, uint256 setId); - event LogWithdraw(address indexed token, uint256 tokenAmt, uint256 getId, uint256 setId); - event LogBorrow(address indexed token, uint256 tokenAmt, uint256 indexed rateMode, uint256 getId, uint256 setId); - event LogPayback(address indexed token, uint256 tokenAmt, uint256 indexed rateMode, uint256 getId, uint256 setId); - event LogEnableCollateral(address[] tokens); - event LogSwapRateMode(address indexed token, uint256 rateMode); + event LogDeposit( + address indexed token, + uint256 tokenAmt, + uint256 getId, + uint256 setId + ); + event LogWithdraw( + address indexed token, + uint256 tokenAmt, + uint256 getId, + uint256 setId + ); + event LogBorrow( + address indexed token, + uint256 tokenAmt, + uint256 indexed rateMode, + uint256 getId, + uint256 setId + ); + event LogPayback( + address indexed token, + uint256 tokenAmt, + uint256 indexed rateMode, + uint256 getId, + uint256 setId + ); + event LogEnableCollateral(address[] tokens); + event LogSwapRateMode(address indexed token, uint256 rateMode); + event LogPaybackOnBehalfOf( + address token, + uint256 amt, + uint256 rateMode, + address onBehalfOf, + uint256 getId, + uint256 setId + ); } diff --git a/contracts/polygon/connectors/aave/v2/helpers.sol b/contracts/polygon/connectors/aave/v2/helpers.sol index 45515089..6274699a 100644 --- a/contracts/polygon/connectors/aave/v2/helpers.sol +++ b/contracts/polygon/connectors/aave/v2/helpers.sol @@ -40,6 +40,21 @@ abstract contract Helpers is DSMath, Basic { return rateMode == 1 ? stableDebt : variableDebt; } + /** + * @dev Get OnBehalfOf user's total debt balance & fee for an asset + * @param token token address of the debt.(For MATIC: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param rateMode Borrow rate mode (Stable = 1, Variable = 2) + */ + function getOnBehalfOfPaybackBalance(address token, uint256 rateMode, address onBehalfOf) + internal + view + returns (uint256) + { + (, uint256 stableDebt, uint256 variableDebt, , , , , , ) = aaveData + .getUserReserveData(token, onBehalfOf); + return rateMode == 1 ? stableDebt : variableDebt; + } + /** * @dev Get total collateral balance for an asset * @param token token address of the collateral.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) diff --git a/contracts/polygon/connectors/aave/v2/main.sol b/contracts/polygon/connectors/aave/v2/main.sol index 6301515c..43a31ba3 100644 --- a/contracts/polygon/connectors/aave/v2/main.sol +++ b/contracts/polygon/connectors/aave/v2/main.sol @@ -146,14 +146,18 @@ abstract contract AaveResolver is Events, Helpers { AaveInterface aave = AaveInterface(aaveProvider.getLendingPool()); - bool isEth = token == maticAddr; - address _token = isEth ? wmaticAddr : token; + bool isMatic = token == maticAddr; + address _token = isMatic ? wmaticAddr : token; TokenInterface tokenContract = TokenInterface(_token); - _amt = _amt == uint(-1) ? getPaybackBalance(_token, rateMode) : _amt; + if (_amt == uint(-1)) { + uint _amtDSA = isMatic ? address(this).balance : tokenContract.balanceOf(address(this)); + uint _amtDebt = getPaybackBalance(_token, rateMode); + _amt = _amtDSA <= _amtDebt ? _amtDSA : _amtDebt; + } - if (isEth) convertMaticToWmatic(isEth, tokenContract, _amt); + if (isMatic) convertMaticToWmatic(isMatic, tokenContract, _amt); approve(tokenContract, address(aave), _amt); @@ -165,6 +169,55 @@ abstract contract AaveResolver is Events, Helpers { _eventParam = abi.encode(token, _amt, rateMode, getId, setId); } + /** + * @dev Payback borrowed MATIC/ERC20_Token on behalf of a user. + * @notice Payback debt owed on behalf os a user. + * @param token The address of the token to payback.(For AVAX: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param amt The amount of the token to payback. (For max: `uint256(-1)`) + * @param rateMode The type of debt paying back. (For Stable: 1, Variable: 2) + * @param onBehalfOf Address of user who's debt to repay. + * @param getId ID to retrieve amt. + * @param setId ID stores the amount of tokens paid back. + */ + function paybackOnBehalfOf( + address token, + uint256 amt, + uint256 rateMode, + address onBehalfOf, + uint256 getId, + uint256 setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(getId, amt); + + AaveInterface aave = AaveInterface(aaveProvider.getLendingPool()); + + bool isMatic = token == maticAddr; + address _token = isMatic ? wmaticAddr : token; + + TokenInterface tokenContract = TokenInterface(_token); + + if (_amt == uint(-1)) { + uint _amtDSA = isMatic ? address(this).balance : tokenContract.balanceOf(address(this)); + uint _amtDebt = getOnBehalfOfPaybackBalance(_token, rateMode, onBehalfOf); + _amt = _amtDSA <= _amtDebt ? _amtDSA : _amtDebt; + } + + if (isMatic) convertMaticToWmatic(isMatic, tokenContract, _amt); + + approve(tokenContract, address(aave), _amt); + + aave.repay(_token, _amt, rateMode, onBehalfOf); + + setUint(setId, _amt); + + _eventName = "LogPaybackOnBehalfOf(address,uint256,uint256,address,uint256,uint256)"; + _eventParam = abi.encode(token, _amt, rateMode, onBehalfOf, getId, setId); + } + /** * @dev Enable collateral * @notice Enable an array of tokens as collateral @@ -213,5 +266,5 @@ abstract contract AaveResolver is Events, Helpers { } contract ConnectV2AaveV2Polygon is AaveResolver { - string constant public name = "AaveV2-v1"; + string constant public name = "AaveV2-v1.1"; }