From 46ae8e333a6df5fcb128fb6e3526b655a5c2cc6f Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 00:53:09 +0400
Subject: [PATCH 01/33] New functions added

---
 .../polygon/connectors/aave/v3/events.sol     |   6 +
 .../polygon/connectors/aave/v3/helpers.sol    |  17 +++
 .../polygon/connectors/aave/v3/interface.sol  |   4 +
 contracts/polygon/connectors/aave/v3/main.sol | 112 +++++++++++++++++-
 4 files changed, 138 insertions(+), 1 deletion(-)

diff --git a/contracts/polygon/connectors/aave/v3/events.sol b/contracts/polygon/connectors/aave/v3/events.sol
index b29b4425..3b2513dd 100644
--- a/contracts/polygon/connectors/aave/v3/events.sol
+++ b/contracts/polygon/connectors/aave/v3/events.sol
@@ -32,4 +32,10 @@ contract Events {
 	event LogDisableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
+	event LogApproveDelegation(
+		address token,
+		uint16 debtType,
+		address delegateTo,
+		uint256 amount
+	);
 }
diff --git a/contracts/polygon/connectors/aave/v3/helpers.sol b/contracts/polygon/connectors/aave/v3/helpers.sol
index 567e9ddd..01fc3bcb 100644
--- a/contracts/polygon/connectors/aave/v3/helpers.sol
+++ b/contracts/polygon/connectors/aave/v3/helpers.sol
@@ -64,4 +64,21 @@ abstract contract Helpers is DSMath, Basic {
 			address(this)
 		);
 	}
+
+	/**
+	 * @dev Get debt token address for an asset
+	 * @param token token address of the asset
+	 * @param rateMode Debt type: stable-1, variable-2
+	 */
+	function getDTokenAddr(address token, uint16 rateMode)
+		internal
+		view
+		returns(address dToken)
+	{
+		if (rateMode == 1) {
+			(, dToken, ) = aaveData.getReserveTokensAddresses(token);
+		} else {
+			(, , dToken) = aaveData.getReserveTokensAddresses(token);
+		}
+	}
 }
diff --git a/contracts/polygon/connectors/aave/v3/interface.sol b/contracts/polygon/connectors/aave/v3/interface.sol
index 81553143..6de08261 100644
--- a/contracts/polygon/connectors/aave/v3/interface.sol
+++ b/contracts/polygon/connectors/aave/v3/interface.sol
@@ -90,3 +90,7 @@ interface AaveAddressProviderRegistryInterface {
 interface ATokenInterface {
 	function balanceOf(address _user) external view returns (uint256);
 }
+
+interface DTokenInterface {
+	function approveDelegation(address delegatee, uint256 amount) external;
+}
diff --git a/contracts/polygon/connectors/aave/v3/main.sol b/contracts/polygon/connectors/aave/v3/main.sol
index 44c5c57a..74ad6bcb 100644
--- a/contracts/polygon/connectors/aave/v3/main.sol
+++ b/contracts/polygon/connectors/aave/v3/main.sol
@@ -10,7 +10,7 @@ import { TokenInterface } from "../../../common/interfaces.sol";
 import { Stores } from "../../../common/stores.sol";
 import { Helpers } from "./helpers.sol";
 import { Events } from "./events.sol";
-import { AaveInterface } from "./interface.sol";
+import { AaveInterface, DTokenInterface } from "./interface.sol";
 
 abstract contract AaveResolver is Events, Helpers {
 	/**
@@ -63,6 +63,52 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 
+	/**
+	 * @dev Deposit Matic/ERC20_Token.
+	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 * @param token The address of the token to deposit.(For Matic: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
+	 */
+	function depositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(getId, amt);
+
+		AaveInterface aave = AaveInterface(aaveProvider.getPool());
+
+		bool isMatic = token == maticAddr;
+		address _token = isMatic ? wmaticAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		if (isMatic) {
+			_amt = _amt == uint256(-1) ? address(this).balance : _amt;
+			convertMaticToWmatic(isMatic, tokenContract, _amt);
+		} else {
+			_amt = _amt == uint256(-1)
+				? tokenContract.balanceOf(address(this))
+				: _amt;
+		}
+
+		approve(tokenContract, address(aave), _amt);
+
+		aave.supply(_token, _amt, address(this), referralCode);
+
+		setUint(setId, _amt);
+
+		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, getId, setId);
+	}
+
 	/**
 	 * @dev Withdraw matic/ERC20_Token.
 	 * @notice Withdraw deposited token from Aave v3
@@ -139,6 +185,44 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 
+	/**
+	 * @dev Borrow matic/ERC20_Token on behalf of a user.
+	 * @notice Borrow a token using Aave v3 on behalf of a user
+	 * @param token The address of the token to borrow.(For matic: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to borrow.
+	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param onBehalfOf The user who will incur the debt
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens borrowed.
+	 */
+	function borrowOnBehalfOf(
+		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.getPool());
+
+		bool isMatic = token == maticAddr;
+		address _token = isMatic ? wmaticAddr : token;
+
+		aave.borrow(_token, _amt, rateMode, referralCode, onBehalfOf);
+		convertWmaticToMatic(isMatic, TokenInterface(_token), _amt);
+
+		setUint(setId, _amt);
+
+		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+	}
+
 	/**
 	 * @dev Payback borrowed matic/ERC20_Token.
 	 * @notice Payback debt owed.
@@ -317,6 +401,32 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventName = "LogSetUserEMode(uint8)";
 		_eventParam = abi.encode(categoryId);
 	}
+
+	/**
+	 * @dev Approve Delegation
+	 * @notice Gives approval to delegate debt tokens
+	 * @param token The address of token
+	 * @param rateMode The type of borrow debt
+	 * @param delegateTo The address to whom the user is delegating
+	 * @param amount The amount 
+	 */
+	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+
+		bool isMatic = token == maticAddr;
+		address _token = isMatic ? wmaticAddr : token;
+
+		address _dToken = getDTokenAddr(_token, rateMode);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+
+		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
+		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+
+	}
 }
 
 contract ConnectV2AaveV3Polygon is AaveResolver {

From cdf9a737a14793149791e7d5f886fe188adc81e3 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 02:27:52 +0400
Subject: [PATCH 02/33] modified depositWithoutCollateral()

---
 contracts/polygon/connectors/aave/v3/main.sol | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/contracts/polygon/connectors/aave/v3/main.sol b/contracts/polygon/connectors/aave/v3/main.sol
index 74ad6bcb..30a9f8ce 100644
--- a/contracts/polygon/connectors/aave/v3/main.sol
+++ b/contracts/polygon/connectors/aave/v3/main.sol
@@ -103,6 +103,10 @@ abstract contract AaveResolver is Events, Helpers {
 
 		aave.supply(_token, _amt, address(this), referralCode);
 
+		if (getCollateralBalance(_token) > 0 && getIsColl(token)) {
+			aave.setUserUseReserveAsCollateral(_token, false);
+		}
+
 		setUint(setId, _amt);
 
 		_eventName = "LogDeposit(address,uint256,uint256,uint256)";

From 8ae6b45e4226a518cc3df94035408a1822a65d4b Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 02:37:51 +0400
Subject: [PATCH 03/33] Aave v3 updates on Optimism

---
 .../optimism/connectors/aave/v3/events.sol    |   6 +
 .../optimism/connectors/aave/v3/helpers.sol   |  17 +++
 .../optimism/connectors/aave/v3/interface.sol |   4 +
 .../optimism/connectors/aave/v3/main.sol      | 116 +++++++++++++++++-
 4 files changed, 142 insertions(+), 1 deletion(-)

diff --git a/contracts/optimism/connectors/aave/v3/events.sol b/contracts/optimism/connectors/aave/v3/events.sol
index b29b4425..3b2513dd 100644
--- a/contracts/optimism/connectors/aave/v3/events.sol
+++ b/contracts/optimism/connectors/aave/v3/events.sol
@@ -32,4 +32,10 @@ contract Events {
 	event LogDisableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
+	event LogApproveDelegation(
+		address token,
+		uint16 debtType,
+		address delegateTo,
+		uint256 amount
+	);
 }
diff --git a/contracts/optimism/connectors/aave/v3/helpers.sol b/contracts/optimism/connectors/aave/v3/helpers.sol
index ae72fa02..d7f8f0a2 100644
--- a/contracts/optimism/connectors/aave/v3/helpers.sol
+++ b/contracts/optimism/connectors/aave/v3/helpers.sol
@@ -64,4 +64,21 @@ abstract contract Helpers is DSMath, Basic {
 			address(this)
 		);
 	}
+
+	/**
+	 * @dev Get debt token address for an asset
+	 * @param token token address of the asset
+	 * @param rateMode Debt type: stable-1, variable-2
+	 */
+	function getDTokenAddr(address token, uint16 rateMode)
+		internal
+		view
+		returns(address dToken)
+	{
+		if (rateMode == 1) {
+			(, dToken, ) = aaveData.getReserveTokensAddresses(token);
+		} else {
+			(, , dToken) = aaveData.getReserveTokensAddresses(token);
+		}
+	}
 }
diff --git a/contracts/optimism/connectors/aave/v3/interface.sol b/contracts/optimism/connectors/aave/v3/interface.sol
index 81553143..6de08261 100644
--- a/contracts/optimism/connectors/aave/v3/interface.sol
+++ b/contracts/optimism/connectors/aave/v3/interface.sol
@@ -90,3 +90,7 @@ interface AaveAddressProviderRegistryInterface {
 interface ATokenInterface {
 	function balanceOf(address _user) external view returns (uint256);
 }
+
+interface DTokenInterface {
+	function approveDelegation(address delegatee, uint256 amount) external;
+}
diff --git a/contracts/optimism/connectors/aave/v3/main.sol b/contracts/optimism/connectors/aave/v3/main.sol
index e98ae77e..3a544184 100644
--- a/contracts/optimism/connectors/aave/v3/main.sol
+++ b/contracts/optimism/connectors/aave/v3/main.sol
@@ -10,7 +10,7 @@ import { TokenInterface } from "../../../common/interfaces.sol";
 import { Stores } from "../../../common/stores.sol";
 import { Helpers } from "./helpers.sol";
 import { Events } from "./events.sol";
-import { AaveInterface } from "./interface.sol";
+import { AaveInterface, DTokenInterface } from "./interface.sol";
 
 abstract contract AaveResolver is Events, Helpers {
 	/**
@@ -63,6 +63,56 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 
+	/**
+	 * @dev Deposit ETH/ERC20_Token.
+	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 * @param token The address of the token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
+	 */
+	function depositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(getId, amt);
+
+		AaveInterface aave = AaveInterface(aaveProvider.getPool());
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		if (isEth) {
+			_amt = _amt == uint256(-1) ? address(this).balance : _amt;
+			convertEthToWeth(isEth, tokenContract, _amt);
+		} else {
+			_amt = _amt == uint256(-1)
+				? tokenContract.balanceOf(address(this))
+				: _amt;
+		}
+
+		approve(tokenContract, address(aave), _amt);
+
+		aave.supply(_token, _amt, address(this), referralCode);
+
+		if (getCollateralBalance(_token) > 0 && getIsColl(token)) {
+			aave.setUserUseReserveAsCollateral(_token, false);
+		}
+
+		setUint(setId, _amt);
+
+		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, getId, setId);
+	}
+
 	/**
 	 * @dev Withdraw ETH/ERC20_Token.
 	 * @notice Withdraw deposited token from Aave v3
@@ -139,6 +189,44 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 
+	/**
+	 * @dev Borrow ETH/ERC20_Token on behalf of a user.
+	 * @notice Borrow a token using Aave v3 on behalf of a user
+	 * @param token The address of the token to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to borrow.
+	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param onBehalfOf The user who will incur the debt
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens borrowed.
+	 */
+	function borrowOnBehalfOf(
+		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.getPool());
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		aave.borrow(_token, _amt, rateMode, referralCode, onBehalfOf);
+		convertEthToWeth(isEth, TokenInterface(_token), _amt);
+
+		setUint(setId, _amt);
+
+		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+	}
+
 	/**
 	 * @dev Payback borrowed ETH/ERC20_Token.
 	 * @notice Payback debt owed.
@@ -316,6 +404,32 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventName = "LogSetUserEMode(uint8)";
 		_eventParam = abi.encode(categoryId);
 	}
+
+	/**
+	 * @dev Approve Delegation
+	 * @notice Gives approval to delegate debt tokens
+	 * @param token The address of token
+	 * @param rateMode The type of borrow debt
+	 * @param delegateTo The address to whom the user is delegating
+	 * @param amount The amount 
+	 */
+	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		address _dToken = getDTokenAddr(_token, rateMode);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+
+		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
+		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+
+	}
 }
 
 contract ConnectV2AaveV3Optimism is AaveResolver {

From a1169c871d35b60909216c2ded1359e5099cebca Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 02:44:25 +0400
Subject: [PATCH 04/33] Aave v3 updates on Fantom

---
 .../fantom/connectors/aave/v3/events.sol      |   6 +
 .../fantom/connectors/aave/v3/helpers.sol     |  17 +++
 .../fantom/connectors/aave/v3/interface.sol   |   4 +
 contracts/fantom/connectors/aave/v3/main.sol  | 116 +++++++++++++++++-
 4 files changed, 142 insertions(+), 1 deletion(-)

diff --git a/contracts/fantom/connectors/aave/v3/events.sol b/contracts/fantom/connectors/aave/v3/events.sol
index b29b4425..3b2513dd 100644
--- a/contracts/fantom/connectors/aave/v3/events.sol
+++ b/contracts/fantom/connectors/aave/v3/events.sol
@@ -32,4 +32,10 @@ contract Events {
 	event LogDisableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
+	event LogApproveDelegation(
+		address token,
+		uint16 debtType,
+		address delegateTo,
+		uint256 amount
+	);
 }
diff --git a/contracts/fantom/connectors/aave/v3/helpers.sol b/contracts/fantom/connectors/aave/v3/helpers.sol
index 537db40a..527e08a7 100644
--- a/contracts/fantom/connectors/aave/v3/helpers.sol
+++ b/contracts/fantom/connectors/aave/v3/helpers.sol
@@ -64,4 +64,21 @@ abstract contract Helpers is DSMath, Basic {
 			address(this)
 		);
 	}
+
+	/**
+	 * @dev Get debt token address for an asset
+	 * @param token token address of the asset
+	 * @param rateMode Debt type: stable-1, variable-2
+	 */
+	function getDTokenAddr(address token, uint16 rateMode)
+		internal
+		view
+		returns(address dToken)
+	{
+		if (rateMode == 1) {
+			(, dToken, ) = aaveData.getReserveTokensAddresses(token);
+		} else {
+			(, , dToken) = aaveData.getReserveTokensAddresses(token);
+		}
+	}
 }
diff --git a/contracts/fantom/connectors/aave/v3/interface.sol b/contracts/fantom/connectors/aave/v3/interface.sol
index 81553143..6de08261 100644
--- a/contracts/fantom/connectors/aave/v3/interface.sol
+++ b/contracts/fantom/connectors/aave/v3/interface.sol
@@ -90,3 +90,7 @@ interface AaveAddressProviderRegistryInterface {
 interface ATokenInterface {
 	function balanceOf(address _user) external view returns (uint256);
 }
+
+interface DTokenInterface {
+	function approveDelegation(address delegatee, uint256 amount) external;
+}
diff --git a/contracts/fantom/connectors/aave/v3/main.sol b/contracts/fantom/connectors/aave/v3/main.sol
index 75f1a9b6..34aeb4cd 100644
--- a/contracts/fantom/connectors/aave/v3/main.sol
+++ b/contracts/fantom/connectors/aave/v3/main.sol
@@ -10,7 +10,7 @@ import { TokenInterface } from "../../../common/interfaces.sol";
 import { Stores } from "../../../common/stores.sol";
 import { Helpers } from "./helpers.sol";
 import { Events } from "./events.sol";
-import { AaveInterface } from "./interface.sol";
+import { AaveInterface, DTokenInterface } from "./interface.sol";
 
 abstract contract AaveResolver is Events, Helpers {
 	/**
@@ -63,6 +63,56 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 
+	/**
+	 * @dev Deposit Ftm/ERC20_Token.
+	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 * @param token The address of the token to deposit.(For FTM: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
+	 */
+	function depositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(getId, amt);
+
+		AaveInterface aave = AaveInterface(aaveProvider.getPool());
+
+		bool isFTM = token == ftmAddr;
+		address _token = isFTM ? wftmAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		if (isFTM) {
+			_amt = _amt == uint256(-1) ? address(this).balance : _amt;
+			convertFtmToWftm(isFTM, tokenContract, _amt);
+		} else {
+			_amt = _amt == uint256(-1)
+				? tokenContract.balanceOf(address(this))
+				: _amt;
+		}
+
+		approve(tokenContract, address(aave), _amt);
+
+		aave.supply(_token, _amt, address(this), referralCode);
+
+		if (getCollateralBalance(_token) > 0 && getIsColl(token)) {
+			aave.setUserUseReserveAsCollateral(_token, false);
+		}
+
+		setUint(setId, _amt);
+
+		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, getId, setId);
+	}
+
 	/**
 	 * @dev Withdraw ftm/ERC20_Token.
 	 * @notice Withdraw deposited token from Aave v3
@@ -139,6 +189,44 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 
+	/**
+	 * @dev Borrow Ftm/ERC20_Token on behalf of a user.
+	 * @notice Borrow a token using Aave v3 on behalf of a user
+	 * @param token The address of the token to borrow.(For FTM: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to borrow.
+	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param onBehalfOf The user who will incur the debt
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens borrowed.
+	 */
+	function borrowOnBehalfOf(
+		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.getPool());
+
+		bool isFTM = token == ftmAddr;
+		address _token = isFTM ? wftmAddr : token;
+
+		aave.borrow(_token, _amt, rateMode, referralCode, onBehalfOf);
+		convertFtmToWftm(isFTM, TokenInterface(_token), _amt);
+
+		setUint(setId, _amt);
+
+		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+	}
+
 	/**
 	 * @dev Payback borrowed ftm/ERC20_Token.
 	 * @notice Payback debt owed.
@@ -316,6 +404,32 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventName = "LogSetUserEMode(uint8)";
 		_eventParam = abi.encode(categoryId);
 	}
+
+	/**
+	 * @dev Approve Delegation
+	 * @notice Gives approval to delegate debt tokens
+	 * @param token The address of token
+	 * @param rateMode The type of borrow debt
+	 * @param delegateTo The address to whom the user is delegating
+	 * @param amount The amount 
+	 */
+	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+
+		bool isFTM = token == ftmAddr;
+		address _token = isFTM ? wftmAddr : token;
+
+		address _dToken = getDTokenAddr(_token, rateMode);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+
+		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
+		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+
+	}
 }
 
 contract ConnectV2AaveV3Fantom is AaveResolver {

From 721a60f51d5cb32c72c4b5bbb28de4579265a7d4 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 02:49:33 +0400
Subject: [PATCH 05/33] Aave v3 updates on Avalanche

---
 .../avalanche/connectors/aave/v3/events.sol   |   6 +
 .../avalanche/connectors/aave/v3/helpers.sol  |  17 +++
 .../connectors/aave/v3/interface.sol          |   4 +
 .../avalanche/connectors/aave/v3/main.sol     | 116 +++++++++++++++++-
 4 files changed, 142 insertions(+), 1 deletion(-)

diff --git a/contracts/avalanche/connectors/aave/v3/events.sol b/contracts/avalanche/connectors/aave/v3/events.sol
index b29b4425..3b2513dd 100644
--- a/contracts/avalanche/connectors/aave/v3/events.sol
+++ b/contracts/avalanche/connectors/aave/v3/events.sol
@@ -32,4 +32,10 @@ contract Events {
 	event LogDisableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
+	event LogApproveDelegation(
+		address token,
+		uint16 debtType,
+		address delegateTo,
+		uint256 amount
+	);
 }
diff --git a/contracts/avalanche/connectors/aave/v3/helpers.sol b/contracts/avalanche/connectors/aave/v3/helpers.sol
index d4c06017..96a57412 100644
--- a/contracts/avalanche/connectors/aave/v3/helpers.sol
+++ b/contracts/avalanche/connectors/aave/v3/helpers.sol
@@ -64,4 +64,21 @@ abstract contract Helpers is DSMath, Basic {
 			address(this)
 		);
 	}
+
+	/**
+	 * @dev Get debt token address for an asset
+	 * @param token token address of the asset
+	 * @param rateMode Debt type: stable-1, variable-2
+	 */
+	function getDTokenAddr(address token, uint16 rateMode)
+		internal
+		view
+		returns(address dToken)
+	{
+		if (rateMode == 1) {
+			(, dToken, ) = aaveData.getReserveTokensAddresses(token);
+		} else {
+			(, , dToken) = aaveData.getReserveTokensAddresses(token);
+		}
+	}
 }
diff --git a/contracts/avalanche/connectors/aave/v3/interface.sol b/contracts/avalanche/connectors/aave/v3/interface.sol
index 81553143..6de08261 100644
--- a/contracts/avalanche/connectors/aave/v3/interface.sol
+++ b/contracts/avalanche/connectors/aave/v3/interface.sol
@@ -90,3 +90,7 @@ interface AaveAddressProviderRegistryInterface {
 interface ATokenInterface {
 	function balanceOf(address _user) external view returns (uint256);
 }
+
+interface DTokenInterface {
+	function approveDelegation(address delegatee, uint256 amount) external;
+}
diff --git a/contracts/avalanche/connectors/aave/v3/main.sol b/contracts/avalanche/connectors/aave/v3/main.sol
index 611d12c6..5eb55867 100644
--- a/contracts/avalanche/connectors/aave/v3/main.sol
+++ b/contracts/avalanche/connectors/aave/v3/main.sol
@@ -10,7 +10,7 @@ import { TokenInterface } from "../../../common/interfaces.sol";
 import { Stores } from "../../../common/stores.sol";
 import { Helpers } from "./helpers.sol";
 import { Events } from "./events.sol";
-import { AaveInterface } from "./interface.sol";
+import { AaveInterface, DTokenInterface } from "./interface.sol";
 
 abstract contract AaveResolver is Events, Helpers {
 	/**
@@ -63,6 +63,56 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 
+	/**
+	 * @dev Deposit avax/ERC20_Token.
+	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 * @param token The address of the token to deposit.(For avax: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
+	 */
+	function depositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(getId, amt);
+
+		AaveInterface aave = AaveInterface(aaveProvider.getPool());
+
+		bool isAVAX = token == avaxAddr;
+		address _token = isAVAX ? wavaxAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		if (isAVAX) {
+			_amt = _amt == uint256(-1) ? address(this).balance : _amt;
+			convertAvaxToWavax(isAVAX, tokenContract, _amt);
+		} else {
+			_amt = _amt == uint256(-1)
+				? tokenContract.balanceOf(address(this))
+				: _amt;
+		}
+
+		approve(tokenContract, address(aave), _amt);
+
+		aave.supply(_token, _amt, address(this), referralCode);
+
+		if (getCollateralBalance(_token) > 0 && getIsColl(token)) {
+			aave.setUserUseReserveAsCollateral(_token, false);
+		}
+
+		setUint(setId, _amt);
+
+		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, getId, setId);
+	}
+
 	/**
 	 * @dev Withdraw avax/ERC20_Token.
 	 * @notice Withdraw deposited token from Aave v3
@@ -139,6 +189,44 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 
+	/**
+	 * @dev Borrow avax/ERC20_Token on behalf of a user.
+	 * @notice Borrow a token using Aave v3 on behalf of a user
+	 * @param token The address of the token to borrow.(For avax: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to borrow.
+	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param onBehalfOf The user who will incur the debt
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens borrowed.
+	 */
+	function borrowOnBehalfOf(
+		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.getPool());
+
+		bool isAVAX = token == avaxAddr;
+		address _token = isAVAX ? wavaxAddr : token;
+
+		aave.borrow(_token, _amt, rateMode, referralCode, onBehalfOf);
+		convertAvaxToWavax(isAVAX, TokenInterface(_token), _amt);
+
+		setUint(setId, _amt);
+
+		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+	}
+
 	/**
 	 * @dev Payback borrowed avax/ERC20_Token.
 	 * @notice Payback debt owed.
@@ -315,6 +403,32 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventName = "LogSetUserEMode(uint8)";
 		_eventParam = abi.encode(categoryId);
 	}
+
+	/**
+	 * @dev Approve Delegation
+	 * @notice Gives approval to delegate debt tokens
+	 * @param token The address of token
+	 * @param rateMode The type of borrow debt
+	 * @param delegateTo The address to whom the user is delegating
+	 * @param amount The amount 
+	 */
+	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+
+		bool isAVAX = token == avaxAddr;
+		address _token = isAVAX ? wavaxAddr : token;
+
+		address _dToken = getDTokenAddr(_token, rateMode);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+
+		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
+		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+
+	}
 }
 
 contract ConnectV2AaveV3Avalanche is AaveResolver {

From e31d39afb06ab1eb875991e482cec0fe29bab9f7 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 02:54:23 +0400
Subject: [PATCH 06/33] Aave v3 updates on Arbitrum

---
 .../arbitrum/connectors/aave/v3/events.sol    |   6 +
 .../arbitrum/connectors/aave/v3/helpers.sol   |  17 +++
 .../arbitrum/connectors/aave/v3/interface.sol |   4 +
 .../arbitrum/connectors/aave/v3/main.sol      | 116 +++++++++++++++++-
 4 files changed, 142 insertions(+), 1 deletion(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/events.sol b/contracts/arbitrum/connectors/aave/v3/events.sol
index b29b4425..3b2513dd 100644
--- a/contracts/arbitrum/connectors/aave/v3/events.sol
+++ b/contracts/arbitrum/connectors/aave/v3/events.sol
@@ -32,4 +32,10 @@ contract Events {
 	event LogDisableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
+	event LogApproveDelegation(
+		address token,
+		uint16 debtType,
+		address delegateTo,
+		uint256 amount
+	);
 }
diff --git a/contracts/arbitrum/connectors/aave/v3/helpers.sol b/contracts/arbitrum/connectors/aave/v3/helpers.sol
index 2d9243d3..093f6da6 100644
--- a/contracts/arbitrum/connectors/aave/v3/helpers.sol
+++ b/contracts/arbitrum/connectors/aave/v3/helpers.sol
@@ -64,4 +64,21 @@ abstract contract Helpers is DSMath, Basic {
 			address(this)
 		);
 	}
+
+	/**
+	 * @dev Get debt token address for an asset
+	 * @param token token address of the asset
+	 * @param rateMode Debt type: stable-1, variable-2
+	 */
+	function getDTokenAddr(address token, uint16 rateMode)
+		internal
+		view
+		returns(address dToken)
+	{
+		if (rateMode == 1) {
+			(, dToken, ) = aaveData.getReserveTokensAddresses(token);
+		} else {
+			(, , dToken) = aaveData.getReserveTokensAddresses(token);
+		}
+	}
 }
diff --git a/contracts/arbitrum/connectors/aave/v3/interface.sol b/contracts/arbitrum/connectors/aave/v3/interface.sol
index 81553143..6de08261 100644
--- a/contracts/arbitrum/connectors/aave/v3/interface.sol
+++ b/contracts/arbitrum/connectors/aave/v3/interface.sol
@@ -90,3 +90,7 @@ interface AaveAddressProviderRegistryInterface {
 interface ATokenInterface {
 	function balanceOf(address _user) external view returns (uint256);
 }
+
+interface DTokenInterface {
+	function approveDelegation(address delegatee, uint256 amount) external;
+}
diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index 150cebf0..5e508340 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -10,7 +10,7 @@ import { TokenInterface } from "../../../common/interfaces.sol";
 import { Stores } from "../../../common/stores.sol";
 import { Helpers } from "./helpers.sol";
 import { Events } from "./events.sol";
-import { AaveInterface } from "./interface.sol";
+import { AaveInterface, DTokenInterface } from "./interface.sol";
 
 abstract contract AaveResolver is Events, Helpers {
 	/**
@@ -63,6 +63,56 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 
+	/**
+	 * @dev Deposit ETH/ERC20_Token.
+	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 * @param token The address of the token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
+	 */
+	function depositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(getId, amt);
+
+		AaveInterface aave = AaveInterface(aaveProvider.getPool());
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		if (isEth) {
+			_amt = _amt == uint256(-1) ? address(this).balance : _amt;
+			convertEthToWeth(isEth, tokenContract, _amt);
+		} else {
+			_amt = _amt == uint256(-1)
+				? tokenContract.balanceOf(address(this))
+				: _amt;
+		}
+
+		approve(tokenContract, address(aave), _amt);
+
+		aave.supply(_token, _amt, address(this), referralCode);
+
+		if (getCollateralBalance(_token) > 0 && getIsColl(token)) {
+			aave.setUserUseReserveAsCollateral(_token, false);
+		}
+
+		setUint(setId, _amt);
+
+		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, getId, setId);
+	}
+
 	/**
 	 * @dev Withdraw ETH/ERC20_Token.
 	 * @notice Withdraw deposited token from Aave v2
@@ -139,6 +189,44 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 
+	/**
+	 * @dev Borrow ETH/ERC20_Token on behalf of a user.
+	 * @notice Borrow a token using Aave v3 on behalf of a user
+	 * @param token The address of the token to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to borrow.
+	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param onBehalfOf The user who will incur the debt
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens borrowed.
+	 */
+	function borrowOnBehalfOf(
+		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.getPool());
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		aave.borrow(_token, _amt, rateMode, referralCode, onBehalfOf);
+		convertEthToWeth(isEth, TokenInterface(_token), _amt);
+
+		setUint(setId, _amt);
+
+		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+	}
+
 	/**
 	 * @dev Payback borrowed ETH/ERC20_Token.
 	 * @notice Payback debt owed.
@@ -316,6 +404,32 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventName = "LogSetUserEMode(uint8)";
 		_eventParam = abi.encode(categoryId);
 	}
+
+	/**
+	 * @dev Approve Delegation
+	 * @notice Gives approval to delegate debt tokens
+	 * @param token The address of token
+	 * @param rateMode The type of borrow debt
+	 * @param delegateTo The address to whom the user is delegating
+	 * @param amount The amount 
+	 */
+	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		address _dToken = getDTokenAddr(_token, rateMode);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+
+		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
+		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+
+	}
 }
 
 contract ConnectV2AaveV3Arbitrum is AaveResolver {

From 22efee297b9f7d4a8ce1543f98cf49771db64b20 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 03:02:47 +0400
Subject: [PATCH 07/33] Aave v3 updated on Mainnet

---
 .../mainnet/connectors/aave/v3/events.sol     |   6 +
 .../mainnet/connectors/aave/v3/helpers.sol    |  17 +++
 .../mainnet/connectors/aave/v3/interface.sol  |   4 +
 contracts/mainnet/connectors/aave/v3/main.sol | 116 +++++++++++++++++-
 4 files changed, 142 insertions(+), 1 deletion(-)

diff --git a/contracts/mainnet/connectors/aave/v3/events.sol b/contracts/mainnet/connectors/aave/v3/events.sol
index 09c88ea7..8255058f 100644
--- a/contracts/mainnet/connectors/aave/v3/events.sol
+++ b/contracts/mainnet/connectors/aave/v3/events.sol
@@ -31,4 +31,10 @@ contract Events {
 	event LogEnableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
+	event LogApproveDelegation(
+		address token,
+		uint16 debtType,
+		address delegateTo,
+		uint256 amount
+	);
 }
diff --git a/contracts/mainnet/connectors/aave/v3/helpers.sol b/contracts/mainnet/connectors/aave/v3/helpers.sol
index e14e0fbe..c25b492c 100644
--- a/contracts/mainnet/connectors/aave/v3/helpers.sol
+++ b/contracts/mainnet/connectors/aave/v3/helpers.sol
@@ -64,4 +64,21 @@ abstract contract Helpers is DSMath, Basic {
 			address(this)
 		);
 	}
+
+	/**
+	 * @dev Get debt token address for an asset
+	 * @param token token address of the asset
+	 * @param rateMode Debt type: stable-1, variable-2
+	 */
+	function getDTokenAddr(address token, uint16 rateMode)
+		internal
+		view
+		returns(address dToken)
+	{
+		if (rateMode == 1) {
+			(, dToken, ) = aaveData.getReserveTokensAddresses(token);
+		} else {
+			(, , dToken) = aaveData.getReserveTokensAddresses(token);
+		}
+	}
 }
diff --git a/contracts/mainnet/connectors/aave/v3/interface.sol b/contracts/mainnet/connectors/aave/v3/interface.sol
index 81553143..6de08261 100644
--- a/contracts/mainnet/connectors/aave/v3/interface.sol
+++ b/contracts/mainnet/connectors/aave/v3/interface.sol
@@ -90,3 +90,7 @@ interface AaveAddressProviderRegistryInterface {
 interface ATokenInterface {
 	function balanceOf(address _user) external view returns (uint256);
 }
+
+interface DTokenInterface {
+	function approveDelegation(address delegatee, uint256 amount) external;
+}
diff --git a/contracts/mainnet/connectors/aave/v3/main.sol b/contracts/mainnet/connectors/aave/v3/main.sol
index 2ac93267..a452e631 100644
--- a/contracts/mainnet/connectors/aave/v3/main.sol
+++ b/contracts/mainnet/connectors/aave/v3/main.sol
@@ -10,7 +10,7 @@ import { TokenInterface } from "../../../common/interfaces.sol";
 import { Stores } from "../../../common/stores.sol";
 import { Helpers } from "./helpers.sol";
 import { Events } from "./events.sol";
-import { AaveInterface } from "./interface.sol";
+import { AaveInterface, DTokenInterface } from "./interface.sol";
 
 abstract contract AaveResolver is Events, Helpers {
 	/**
@@ -63,6 +63,56 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 
+	/**
+	 * @dev Deposit ETH/ERC20_Token.
+	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 * @param token The address of the token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
+	 */
+	function depositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(getId, amt);
+
+		AaveInterface aave = AaveInterface(aaveProvider.getPool());
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		if (isEth) {
+			_amt = _amt == uint256(-1) ? address(this).balance : _amt;
+			convertEthToWeth(isEth, tokenContract, _amt);
+		} else {
+			_amt = _amt == uint256(-1)
+				? tokenContract.balanceOf(address(this))
+				: _amt;
+		}
+
+		approve(tokenContract, address(aave), _amt);
+
+		aave.supply(_token, _amt, address(this), referralCode);
+
+		if (getCollateralBalance(_token) > 0 && getIsColl(token)) {
+			aave.setUserUseReserveAsCollateral(_token, false);
+		}
+
+		setUint(setId, _amt);
+
+		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, getId, setId);
+	}
+
 	/**
 	 * @dev Withdraw ETH/ERC20_Token.
 	 * @notice Withdraw deposited token from Aave v3
@@ -139,6 +189,44 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 
+	/**
+	 * @dev Borrow ETH/ERC20_Token on behalf of a user.
+	 * @notice Borrow a token using Aave v3 on behalf of a user
+	 * @param token The address of the token to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param amt The amount of the token to borrow.
+	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param onBehalfOf The user who will incur the debt
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens borrowed.
+	 */
+	function borrowOnBehalfOf(
+		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.getPool());
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		aave.borrow(_token, _amt, rateMode, referralCode, onBehalfOf);
+		convertEthToWeth(isEth, TokenInterface(_token), _amt);
+
+		setUint(setId, _amt);
+
+		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+	}
+
 	/**
 	 * @dev Payback borrowed ETH/ERC20_Token.
 	 * @notice Payback debt owed.
@@ -291,6 +379,32 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventName = "LogSetUserEMode(uint8)";
 		_eventParam = abi.encode(categoryId);
 	}
+
+	/**
+	 * @dev Approve Delegation
+	 * @notice Gives approval to delegate debt tokens
+	 * @param token The address of token
+	 * @param rateMode The type of borrow debt
+	 * @param delegateTo The address to whom the user is delegating
+	 * @param amount The amount 
+	 */
+	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		address _dToken = getDTokenAddr(_token, rateMode);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+
+		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
+		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+
+	}
 }
 
 contract ConnectV2AaveV3 is AaveResolver {

From fc24288d5973cfdd525860d7fdb86ad704ed4838 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <47134275+shriyatyagii@users.noreply.github.com>
Date: Wed, 27 Apr 2022 17:35:17 +0400
Subject: [PATCH 08/33] updated rateMode

Co-authored-by: Thrilok kumar <thrilok2000@gmail.com>
---
 contracts/arbitrum/connectors/aave/v3/main.sol | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index 5e508340..b21d6cb7 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -413,7 +413,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @param delegateTo The address to whom the user is delegating
 	 * @param amount The amount 
 	 */
-	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+	function approveDelegation(address token, , uint256 amount, uint256 rateMode, address delegateTo)
 		external
 		payable
 		returns (string memory _eventName, bytes memory _eventParam)

From 3a8a2ba6bca73958ca586f425e35bd6949704455 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <47134275+shriyatyagii@users.noreply.github.com>
Date: Wed, 27 Apr 2022 17:37:24 +0400
Subject: [PATCH 09/33] LogBorrowOnBehalfOf event created

Co-authored-by: Thrilok kumar <thrilok2000@gmail.com>
---
 contracts/arbitrum/connectors/aave/v3/main.sol | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index b21d6cb7..8503f6db 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -223,7 +223,7 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
+		_eventName = "LogBorrowOnBehalfOf(address,uint256,uint256,address,uint256,uint256)";
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 

From d7b7c4c2e8c146ce44dc1cfbdcb284bdc6fc349e Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <47134275+shriyatyagii@users.noreply.github.com>
Date: Wed, 27 Apr 2022 17:37:39 +0400
Subject: [PATCH 10/33] LogDepositWithoutCollateral event created

Co-authored-by: Thrilok kumar <thrilok2000@gmail.com>
---
 contracts/arbitrum/connectors/aave/v3/main.sol | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index 8503f6db..fe040eee 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -109,7 +109,7 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventName = "LogDepositWithoutCollateral(address,uint256,uint256,uint256)";
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 

From 99376e63814831f14cc22e213cb0b88b086e4dca Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 18:01:09 +0400
Subject: [PATCH 11/33] changes updated- Avalanche

---
 .../avalanche/connectors/aave/v3/events.sol   | 20 +++++++++++--
 .../avalanche/connectors/aave/v3/helpers.sol  |  2 +-
 .../avalanche/connectors/aave/v3/main.sol     | 30 +++++++++++++------
 3 files changed, 40 insertions(+), 12 deletions(-)

diff --git a/contracts/avalanche/connectors/aave/v3/events.sol b/contracts/avalanche/connectors/aave/v3/events.sol
index 3b2513dd..6c0f0451 100644
--- a/contracts/avalanche/connectors/aave/v3/events.sol
+++ b/contracts/avalanche/connectors/aave/v3/events.sol
@@ -34,8 +34,24 @@ contract Events {
 	event LogSetUserEMode(uint8 categoryId);
 	event LogApproveDelegation(
 		address token,
-		uint16 debtType,
+		uint256 amount,
+		uint16 rateMode,
 		address delegateTo,
-		uint256 amount
+		uint256 getId,
+		uint256 setId
+	);
+	event LogDepositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	);
+	event LogBorrowOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
 	);
 }
diff --git a/contracts/avalanche/connectors/aave/v3/helpers.sol b/contracts/avalanche/connectors/aave/v3/helpers.sol
index 96a57412..0fa43646 100644
--- a/contracts/avalanche/connectors/aave/v3/helpers.sol
+++ b/contracts/avalanche/connectors/aave/v3/helpers.sol
@@ -70,7 +70,7 @@ abstract contract Helpers is DSMath, Basic {
 	 * @param token token address of the asset
 	 * @param rateMode Debt type: stable-1, variable-2
 	 */
-	function getDTokenAddr(address token, uint16 rateMode)
+	function getDTokenAddr(address token, uint256 rateMode)
 		internal
 		view
 		returns(address dToken)
diff --git a/contracts/avalanche/connectors/aave/v3/main.sol b/contracts/avalanche/connectors/aave/v3/main.sol
index 5eb55867..b28873ba 100644
--- a/contracts/avalanche/connectors/aave/v3/main.sol
+++ b/contracts/avalanche/connectors/aave/v3/main.sol
@@ -109,7 +109,7 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventName = "LogDepositWithoutCollateral(address,uint256,uint256,uint256)";
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 
@@ -223,8 +223,8 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
-		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+		_eventName = "LogBorrowOnBehalfOf(address,uint256,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, onBehalfOf, getId, setId);
 	}
 
 	/**
@@ -408,29 +408,41 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @dev Approve Delegation
 	 * @notice Gives approval to delegate debt tokens
 	 * @param token The address of token
+	 * @param amount The amount
 	 * @param rateMode The type of borrow debt
 	 * @param delegateTo The address to whom the user is delegating
-	 * @param amount The amount 
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
 	 */
-	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+	function approveDelegation(
+		address token,
+		uint256 amount,
+		uint256 rateMode,
+		address delegateTo,
+		uint256 getId,
+		uint256 setId
+	)
 		external
 		payable
 		returns (string memory _eventName, bytes memory _eventParam)
 	{
 		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+		uint256 _amt = getUint(getId, amount);
 
 		bool isAVAX = token == avaxAddr;
 		address _token = isAVAX ? wavaxAddr : token;
 
 		address _dToken = getDTokenAddr(_token, rateMode);
-		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, _amt);
 
-		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
-		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+		setUint(setId, _amt);
+
+		_eventName = "LogApproveDelegation(address,uint256,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, delegateTo, getId, setId);
 
 	}
 }
 
 contract ConnectV2AaveV3Avalanche is AaveResolver {
-	string public constant name = "AaveV3-v1.1";
+	string public constant name = "AaveV3-v1.2";
 }

From 062029d9b4cbd5665c38a031f242763bc7cc1e25 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 18:11:52 +0400
Subject: [PATCH 12/33] updated changes-polygon

---
 .../polygon/connectors/aave/v3/events.sol     | 22 +++++++++++++--
 .../polygon/connectors/aave/v3/helpers.sol    |  2 +-
 contracts/polygon/connectors/aave/v3/main.sol | 28 +++++++++++++------
 3 files changed, 40 insertions(+), 12 deletions(-)

diff --git a/contracts/polygon/connectors/aave/v3/events.sol b/contracts/polygon/connectors/aave/v3/events.sol
index 3b2513dd..32926b9a 100644
--- a/contracts/polygon/connectors/aave/v3/events.sol
+++ b/contracts/polygon/connectors/aave/v3/events.sol
@@ -32,10 +32,26 @@ contract Events {
 	event LogDisableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
-	event LogApproveDelegation(
+	event LogDelegateBorrow(
 		address token,
-		uint16 debtType,
+		uint256 amount,
+		uint16 rateMode,
 		address delegateTo,
-		uint256 amount
+		uint256 getId,
+		uint256 setId
+	);
+	event LogDepositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	);
+	event LogBorrowOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
 	);
 }
diff --git a/contracts/polygon/connectors/aave/v3/helpers.sol b/contracts/polygon/connectors/aave/v3/helpers.sol
index 01fc3bcb..4b2d239b 100644
--- a/contracts/polygon/connectors/aave/v3/helpers.sol
+++ b/contracts/polygon/connectors/aave/v3/helpers.sol
@@ -70,7 +70,7 @@ abstract contract Helpers is DSMath, Basic {
 	 * @param token token address of the asset
 	 * @param rateMode Debt type: stable-1, variable-2
 	 */
-	function getDTokenAddr(address token, uint16 rateMode)
+	function getDTokenAddr(address token, uint256 rateMode)
 		internal
 		view
 		returns(address dToken)
diff --git a/contracts/polygon/connectors/aave/v3/main.sol b/contracts/polygon/connectors/aave/v3/main.sol
index 30a9f8ce..35d20767 100644
--- a/contracts/polygon/connectors/aave/v3/main.sol
+++ b/contracts/polygon/connectors/aave/v3/main.sol
@@ -109,7 +109,7 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventName = "LogDepositWithoutCollateral(address,uint256,uint256,uint256)";
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 
@@ -223,8 +223,8 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
-		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+		_eventName = "LogBorrowOnBehalfOf(address,uint256,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, onBehalfOf, getId, setId);
 	}
 
 	/**
@@ -410,25 +410,37 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @dev Approve Delegation
 	 * @notice Gives approval to delegate debt tokens
 	 * @param token The address of token
+	 * @param amount The amount
 	 * @param rateMode The type of borrow debt
 	 * @param delegateTo The address to whom the user is delegating
-	 * @param amount The amount 
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
 	 */
-	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+	function delegateBorrow(
+		address token,
+		uint256 amount,
+		uint256 rateMode,
+		address delegateTo,
+		uint256 getId,
+		uint256 setId
+	)
 		external
 		payable
 		returns (string memory _eventName, bytes memory _eventParam)
 	{
 		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+		uint256 _amt = getUint(getId, amount);
 
 		bool isMatic = token == maticAddr;
 		address _token = isMatic ? wmaticAddr : token;
 
 		address _dToken = getDTokenAddr(_token, rateMode);
-		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, _amt);
 
-		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
-		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+		setUint(setId, _amt);
+
+		_eventName = "LogDelegateBorrow(address,uint256,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, delegateTo, getId, setId);
 
 	}
 }

From 8bbae5a1e1537acf9a1f9c4e69ad0da6ee9ab0d1 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 18:13:16 +0400
Subject: [PATCH 13/33] Updated changes- Optimism

---
 .../optimism/connectors/aave/v3/events.sol    | 22 ++++++++++++--
 .../optimism/connectors/aave/v3/helpers.sol   |  2 +-
 .../optimism/connectors/aave/v3/main.sol      | 29 ++++++++++++++-----
 contracts/polygon/connectors/aave/v3/main.sol |  2 +-
 4 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/contracts/optimism/connectors/aave/v3/events.sol b/contracts/optimism/connectors/aave/v3/events.sol
index 3b2513dd..32926b9a 100644
--- a/contracts/optimism/connectors/aave/v3/events.sol
+++ b/contracts/optimism/connectors/aave/v3/events.sol
@@ -32,10 +32,26 @@ contract Events {
 	event LogDisableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
-	event LogApproveDelegation(
+	event LogDelegateBorrow(
 		address token,
-		uint16 debtType,
+		uint256 amount,
+		uint16 rateMode,
 		address delegateTo,
-		uint256 amount
+		uint256 getId,
+		uint256 setId
+	);
+	event LogDepositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	);
+	event LogBorrowOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
 	);
 }
diff --git a/contracts/optimism/connectors/aave/v3/helpers.sol b/contracts/optimism/connectors/aave/v3/helpers.sol
index d7f8f0a2..5e66f60e 100644
--- a/contracts/optimism/connectors/aave/v3/helpers.sol
+++ b/contracts/optimism/connectors/aave/v3/helpers.sol
@@ -70,7 +70,7 @@ abstract contract Helpers is DSMath, Basic {
 	 * @param token token address of the asset
 	 * @param rateMode Debt type: stable-1, variable-2
 	 */
-	function getDTokenAddr(address token, uint16 rateMode)
+	function getDTokenAddr(address token, uint256 rateMode)
 		internal
 		view
 		returns(address dToken)
diff --git a/contracts/optimism/connectors/aave/v3/main.sol b/contracts/optimism/connectors/aave/v3/main.sol
index 3a544184..772d92c6 100644
--- a/contracts/optimism/connectors/aave/v3/main.sol
+++ b/contracts/optimism/connectors/aave/v3/main.sol
@@ -109,7 +109,7 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventName = "LogDepositWithoutCollateral(address,uint256,uint256,uint256)";
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 
@@ -223,8 +223,8 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
-		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+		_eventName = "LogBorrowOnBehalfOf(address,uint256,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, onBehalfOf, getId, setId);
 	}
 
 	/**
@@ -409,25 +409,38 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @dev Approve Delegation
 	 * @notice Gives approval to delegate debt tokens
 	 * @param token The address of token
+	 * @param amount The amount
 	 * @param rateMode The type of borrow debt
 	 * @param delegateTo The address to whom the user is delegating
-	 * @param amount The amount 
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
 	 */
-	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+	function delegateBorrow(
+		address token,
+		uint256 amount,
+		uint256 rateMode,
+		address delegateTo,
+		uint256 getId,
+		uint256 setId
+	)
 		external
 		payable
 		returns (string memory _eventName, bytes memory _eventParam)
 	{
 		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+		uint256 _amt = getUint(getId, amount);
+
 
 		bool isEth = token == ethAddr;
 		address _token = isEth ? wethAddr : token;
 
 		address _dToken = getDTokenAddr(_token, rateMode);
-		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, _amt);
 
-		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
-		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+		setUint(setId, _amt);
+
+		_eventName = "LogDelegateBorrow(address,uint256,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, delegateTo, getId, setId);
 
 	}
 }
diff --git a/contracts/polygon/connectors/aave/v3/main.sol b/contracts/polygon/connectors/aave/v3/main.sol
index 35d20767..2a166a7d 100644
--- a/contracts/polygon/connectors/aave/v3/main.sol
+++ b/contracts/polygon/connectors/aave/v3/main.sol
@@ -446,5 +446,5 @@ abstract contract AaveResolver is Events, Helpers {
 }
 
 contract ConnectV2AaveV3Polygon is AaveResolver {
-	string public constant name = "AaveV3-v1.1";
+	string public constant name = "AaveV3-v1.2";
 }

From 484ff2ef33451668937346ac1d55c33ae9afb500 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 18:15:32 +0400
Subject: [PATCH 14/33] updated changes- Mainnet

---
 .../mainnet/connectors/aave/v3/events.sol     | 22 +++++++++++++--
 .../mainnet/connectors/aave/v3/helpers.sol    |  2 +-
 contracts/mainnet/connectors/aave/v3/main.sol | 28 +++++++++++++------
 3 files changed, 40 insertions(+), 12 deletions(-)

diff --git a/contracts/mainnet/connectors/aave/v3/events.sol b/contracts/mainnet/connectors/aave/v3/events.sol
index 8255058f..d3b6d186 100644
--- a/contracts/mainnet/connectors/aave/v3/events.sol
+++ b/contracts/mainnet/connectors/aave/v3/events.sol
@@ -31,10 +31,26 @@ contract Events {
 	event LogEnableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
-	event LogApproveDelegation(
+	event LogDelegateBorrow(
 		address token,
-		uint16 debtType,
+		uint256 amount,
+		uint16 rateMode,
 		address delegateTo,
-		uint256 amount
+		uint256 getId,
+		uint256 setId
+	);
+	event LogDepositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	);
+	event LogBorrowOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
 	);
 }
diff --git a/contracts/mainnet/connectors/aave/v3/helpers.sol b/contracts/mainnet/connectors/aave/v3/helpers.sol
index c25b492c..ed7f03a2 100644
--- a/contracts/mainnet/connectors/aave/v3/helpers.sol
+++ b/contracts/mainnet/connectors/aave/v3/helpers.sol
@@ -70,7 +70,7 @@ abstract contract Helpers is DSMath, Basic {
 	 * @param token token address of the asset
 	 * @param rateMode Debt type: stable-1, variable-2
 	 */
-	function getDTokenAddr(address token, uint16 rateMode)
+	function getDTokenAddr(address token, uint256 rateMode)
 		internal
 		view
 		returns(address dToken)
diff --git a/contracts/mainnet/connectors/aave/v3/main.sol b/contracts/mainnet/connectors/aave/v3/main.sol
index a452e631..895a3619 100644
--- a/contracts/mainnet/connectors/aave/v3/main.sol
+++ b/contracts/mainnet/connectors/aave/v3/main.sol
@@ -109,7 +109,7 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventName = "LogDepositWithoutCollateral(address,uint256,uint256,uint256)";
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 
@@ -223,8 +223,8 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
-		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+		_eventName = "LogBorrowOnBehalfOf(address,uint256,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, onBehalfOf, getId, setId);
 	}
 
 	/**
@@ -384,25 +384,37 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @dev Approve Delegation
 	 * @notice Gives approval to delegate debt tokens
 	 * @param token The address of token
+	 * @param amount The amount
 	 * @param rateMode The type of borrow debt
 	 * @param delegateTo The address to whom the user is delegating
-	 * @param amount The amount 
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
 	 */
-	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+	function delegateBorrow(
+		address token,
+		uint256 amount,
+		uint256 rateMode,
+		address delegateTo,
+		uint256 getId,
+		uint256 setId
+	)
 		external
 		payable
 		returns (string memory _eventName, bytes memory _eventParam)
 	{
 		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+		uint256 _amt = getUint(getId, amount);
 
 		bool isEth = token == ethAddr;
 		address _token = isEth ? wethAddr : token;
 
 		address _dToken = getDTokenAddr(_token, rateMode);
-		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, _amt);
 
-		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
-		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+		setUint(setId, _amt);
+
+		_eventName = "LogDelegateBorrow(address,uint256,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, delegateTo, getId, setId);
 
 	}
 }

From 11ded62f6d51e421d56f1fe7862e1b28a56c0046 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 18:16:25 +0400
Subject: [PATCH 15/33] updated changes- Fantom

---
 .../fantom/connectors/aave/v3/events.sol      | 22 ++++++++++++--
 .../fantom/connectors/aave/v3/helpers.sol     |  2 +-
 contracts/fantom/connectors/aave/v3/main.sol  | 30 +++++++++++++------
 3 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/contracts/fantom/connectors/aave/v3/events.sol b/contracts/fantom/connectors/aave/v3/events.sol
index 3b2513dd..32926b9a 100644
--- a/contracts/fantom/connectors/aave/v3/events.sol
+++ b/contracts/fantom/connectors/aave/v3/events.sol
@@ -32,10 +32,26 @@ contract Events {
 	event LogDisableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
-	event LogApproveDelegation(
+	event LogDelegateBorrow(
 		address token,
-		uint16 debtType,
+		uint256 amount,
+		uint16 rateMode,
 		address delegateTo,
-		uint256 amount
+		uint256 getId,
+		uint256 setId
+	);
+	event LogDepositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	);
+	event LogBorrowOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
 	);
 }
diff --git a/contracts/fantom/connectors/aave/v3/helpers.sol b/contracts/fantom/connectors/aave/v3/helpers.sol
index 527e08a7..a5a57c81 100644
--- a/contracts/fantom/connectors/aave/v3/helpers.sol
+++ b/contracts/fantom/connectors/aave/v3/helpers.sol
@@ -70,7 +70,7 @@ abstract contract Helpers is DSMath, Basic {
 	 * @param token token address of the asset
 	 * @param rateMode Debt type: stable-1, variable-2
 	 */
-	function getDTokenAddr(address token, uint16 rateMode)
+	function getDTokenAddr(address token, uint256 rateMode)
 		internal
 		view
 		returns(address dToken)
diff --git a/contracts/fantom/connectors/aave/v3/main.sol b/contracts/fantom/connectors/aave/v3/main.sol
index 34aeb4cd..47284485 100644
--- a/contracts/fantom/connectors/aave/v3/main.sol
+++ b/contracts/fantom/connectors/aave/v3/main.sol
@@ -109,7 +109,7 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogDeposit(address,uint256,uint256,uint256)";
+		_eventName = "LogDepositWithoutCollateral(address,uint256,uint256,uint256)";
 		_eventParam = abi.encode(token, _amt, getId, setId);
 	}
 
@@ -223,8 +223,8 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogBorrow(address,uint256,uint256,uint256,uint256)";
-		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+		_eventName = "LogBorrowOnBehalfOf(address,uint256,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, onBehalfOf, getId, setId);
 	}
 
 	/**
@@ -409,29 +409,41 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @dev Approve Delegation
 	 * @notice Gives approval to delegate debt tokens
 	 * @param token The address of token
+	 * @param amount The amount
 	 * @param rateMode The type of borrow debt
 	 * @param delegateTo The address to whom the user is delegating
-	 * @param amount The amount 
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
 	 */
-	function approveDelegation(address token, uint16 rateMode, address delegateTo, uint256 amount)
+	function delegateBorrow(
+		address token,
+		uint256 amount,
+		uint256 rateMode,
+		address delegateTo,
+		uint256 getId,
+		uint256 setId
+	)
 		external
 		payable
 		returns (string memory _eventName, bytes memory _eventParam)
 	{
 		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+		uint256 _amt = getUint(getId, amount);
 
 		bool isFTM = token == ftmAddr;
 		address _token = isFTM ? wftmAddr : token;
 
 		address _dToken = getDTokenAddr(_token, rateMode);
-		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, _amt);
 
-		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
-		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+		setUint(setId, _amt);
+
+		_eventName = "LogDelegateBorrow(address,uint256,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, delegateTo, getId, setId);
 
 	}
 }
 
 contract ConnectV2AaveV3Fantom is AaveResolver {
-	string public constant name = "AaveV3-v1.1";
+	string public constant name = "AaveV3-v1.2";
 }

From d5b096c9950ce3ab7af15a3ac77375016aefd363 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 18:18:18 +0400
Subject: [PATCH 16/33] updated changes- Arbitrum

---
 .../arbitrum/connectors/aave/v3/events.sol    | 22 +++++++++++++---
 .../arbitrum/connectors/aave/v3/helpers.sol   |  2 +-
 .../arbitrum/connectors/aave/v3/main.sol      | 26 ++++++++++++++-----
 3 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/events.sol b/contracts/arbitrum/connectors/aave/v3/events.sol
index 3b2513dd..32926b9a 100644
--- a/contracts/arbitrum/connectors/aave/v3/events.sol
+++ b/contracts/arbitrum/connectors/aave/v3/events.sol
@@ -32,10 +32,26 @@ contract Events {
 	event LogDisableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
-	event LogApproveDelegation(
+	event LogDelegateBorrow(
 		address token,
-		uint16 debtType,
+		uint256 amount,
+		uint16 rateMode,
 		address delegateTo,
-		uint256 amount
+		uint256 getId,
+		uint256 setId
+	);
+	event LogDepositWithoutCollateral(
+		address token,
+		uint256 amt,
+		uint256 getId,
+		uint256 setId
+	);
+	event LogBorrowOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
 	);
 }
diff --git a/contracts/arbitrum/connectors/aave/v3/helpers.sol b/contracts/arbitrum/connectors/aave/v3/helpers.sol
index 093f6da6..f1cfb63b 100644
--- a/contracts/arbitrum/connectors/aave/v3/helpers.sol
+++ b/contracts/arbitrum/connectors/aave/v3/helpers.sol
@@ -70,7 +70,7 @@ abstract contract Helpers is DSMath, Basic {
 	 * @param token token address of the asset
 	 * @param rateMode Debt type: stable-1, variable-2
 	 */
-	function getDTokenAddr(address token, uint16 rateMode)
+	function getDTokenAddr(address token, uint256 rateMode)
 		internal
 		view
 		returns(address dToken)
diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index fe040eee..926b4794 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -224,7 +224,7 @@ abstract contract AaveResolver is Events, Helpers {
 		setUint(setId, _amt);
 
 		_eventName = "LogBorrowOnBehalfOf(address,uint256,uint256,address,uint256,uint256)";
-		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
+		_eventParam = abi.encode(token, _amt, rateMode, onBehalfOf, getId, setId);
 	}
 
 	/**
@@ -409,29 +409,41 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @dev Approve Delegation
 	 * @notice Gives approval to delegate debt tokens
 	 * @param token The address of token
+	 * @param amount The amount
 	 * @param rateMode The type of borrow debt
 	 * @param delegateTo The address to whom the user is delegating
-	 * @param amount The amount 
+	 * @param getId ID to retrieve amt.
+	 * @param setId ID stores the amount of tokens deposited.
 	 */
-	function approveDelegation(address token, , uint256 amount, uint256 rateMode, address delegateTo)
+	function delegateBorrow(
+		address token,
+		uint256 amount,
+		uint256 rateMode,
+		address delegateTo,
+		uint256 getId,
+		uint256 setId
+	)
 		external
 		payable
 		returns (string memory _eventName, bytes memory _eventParam)
 	{
 		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
+		uint256 _amt = getUint(getId, amount);
 
 		bool isEth = token == ethAddr;
 		address _token = isEth ? wethAddr : token;
 
 		address _dToken = getDTokenAddr(_token, rateMode);
-		DTokenInterface(_dToken).approveDelegation(delegateTo, amount);
+		DTokenInterface(_dToken).approveDelegation(delegateTo, _amt);
 
-		_eventName = "LogApproveDelegation(address,uint16,address,uint256)";
-		_eventParam = abi.encode(token, rateMode, delegateTo, amount);
+		setUint(setId, _amt);
+
+		_eventName = "LogDelegateBorrow(address,uint256,uint256,address,uint256,uint256)";
+		_eventParam = abi.encode(token, _amt, rateMode, delegateTo, getId, setId);
 
 	}
 }
 
 contract ConnectV2AaveV3Arbitrum is AaveResolver {
-	string public constant name = "AaveV3-v1.1";
+	string public constant name = "AaveV3-v1.2";
 }

From b566e34cd3f2120ddb672e1cd7d8d183b53abc21 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 27 Apr 2022 18:24:52 +0400
Subject: [PATCH 17/33] rateMode updated

---
 contracts/arbitrum/connectors/aave/v3/events.sol  | 2 +-
 contracts/arbitrum/connectors/aave/v3/main.sol    | 1 -
 contracts/avalanche/connectors/aave/v3/events.sol | 4 ++--
 contracts/avalanche/connectors/aave/v3/main.sol   | 3 +--
 contracts/fantom/connectors/aave/v3/events.sol    | 2 +-
 contracts/mainnet/connectors/aave/v3/events.sol   | 2 +-
 contracts/optimism/connectors/aave/v3/events.sol  | 2 +-
 contracts/optimism/connectors/aave/v3/main.sol    | 3 +--
 contracts/polygon/connectors/aave/v3/events.sol   | 2 +-
 contracts/polygon/connectors/aave/v3/main.sol     | 1 -
 10 files changed, 9 insertions(+), 13 deletions(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/events.sol b/contracts/arbitrum/connectors/aave/v3/events.sol
index 32926b9a..800c7873 100644
--- a/contracts/arbitrum/connectors/aave/v3/events.sol
+++ b/contracts/arbitrum/connectors/aave/v3/events.sol
@@ -35,7 +35,7 @@ contract Events {
 	event LogDelegateBorrow(
 		address token,
 		uint256 amount,
-		uint16 rateMode,
+		uint256 rateMode,
 		address delegateTo,
 		uint256 getId,
 		uint256 setId
diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index 926b4794..cc27988d 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -440,7 +440,6 @@ abstract contract AaveResolver is Events, Helpers {
 
 		_eventName = "LogDelegateBorrow(address,uint256,uint256,address,uint256,uint256)";
 		_eventParam = abi.encode(token, _amt, rateMode, delegateTo, getId, setId);
-
 	}
 }
 
diff --git a/contracts/avalanche/connectors/aave/v3/events.sol b/contracts/avalanche/connectors/aave/v3/events.sol
index 6c0f0451..800c7873 100644
--- a/contracts/avalanche/connectors/aave/v3/events.sol
+++ b/contracts/avalanche/connectors/aave/v3/events.sol
@@ -32,10 +32,10 @@ contract Events {
 	event LogDisableCollateral(address[] tokens);
 	event LogSwapRateMode(address indexed token, uint256 rateMode);
 	event LogSetUserEMode(uint8 categoryId);
-	event LogApproveDelegation(
+	event LogDelegateBorrow(
 		address token,
 		uint256 amount,
-		uint16 rateMode,
+		uint256 rateMode,
 		address delegateTo,
 		uint256 getId,
 		uint256 setId
diff --git a/contracts/avalanche/connectors/aave/v3/main.sol b/contracts/avalanche/connectors/aave/v3/main.sol
index b28873ba..1eff3505 100644
--- a/contracts/avalanche/connectors/aave/v3/main.sol
+++ b/contracts/avalanche/connectors/aave/v3/main.sol
@@ -437,9 +437,8 @@ abstract contract AaveResolver is Events, Helpers {
 
 		setUint(setId, _amt);
 
-		_eventName = "LogApproveDelegation(address,uint256,uint256,address,uint256,uint256)";
+		_eventName = "LogDelegateBorrow(address,uint256,uint256,address,uint256,uint256)";
 		_eventParam = abi.encode(token, _amt, rateMode, delegateTo, getId, setId);
-
 	}
 }
 
diff --git a/contracts/fantom/connectors/aave/v3/events.sol b/contracts/fantom/connectors/aave/v3/events.sol
index 32926b9a..800c7873 100644
--- a/contracts/fantom/connectors/aave/v3/events.sol
+++ b/contracts/fantom/connectors/aave/v3/events.sol
@@ -35,7 +35,7 @@ contract Events {
 	event LogDelegateBorrow(
 		address token,
 		uint256 amount,
-		uint16 rateMode,
+		uint256 rateMode,
 		address delegateTo,
 		uint256 getId,
 		uint256 setId
diff --git a/contracts/mainnet/connectors/aave/v3/events.sol b/contracts/mainnet/connectors/aave/v3/events.sol
index d3b6d186..07888419 100644
--- a/contracts/mainnet/connectors/aave/v3/events.sol
+++ b/contracts/mainnet/connectors/aave/v3/events.sol
@@ -34,7 +34,7 @@ contract Events {
 	event LogDelegateBorrow(
 		address token,
 		uint256 amount,
-		uint16 rateMode,
+		uint256 rateMode,
 		address delegateTo,
 		uint256 getId,
 		uint256 setId
diff --git a/contracts/optimism/connectors/aave/v3/events.sol b/contracts/optimism/connectors/aave/v3/events.sol
index 32926b9a..800c7873 100644
--- a/contracts/optimism/connectors/aave/v3/events.sol
+++ b/contracts/optimism/connectors/aave/v3/events.sol
@@ -35,7 +35,7 @@ contract Events {
 	event LogDelegateBorrow(
 		address token,
 		uint256 amount,
-		uint16 rateMode,
+		uint256 rateMode,
 		address delegateTo,
 		uint256 getId,
 		uint256 setId
diff --git a/contracts/optimism/connectors/aave/v3/main.sol b/contracts/optimism/connectors/aave/v3/main.sol
index 772d92c6..f24914b0 100644
--- a/contracts/optimism/connectors/aave/v3/main.sol
+++ b/contracts/optimism/connectors/aave/v3/main.sol
@@ -441,10 +441,9 @@ abstract contract AaveResolver is Events, Helpers {
 
 		_eventName = "LogDelegateBorrow(address,uint256,uint256,address,uint256,uint256)";
 		_eventParam = abi.encode(token, _amt, rateMode, delegateTo, getId, setId);
-
 	}
 }
 
 contract ConnectV2AaveV3Optimism is AaveResolver {
-	string public constant name = "AaveV3-v1.1";
+	string public constant name = "AaveV3-v1.2";
 }
diff --git a/contracts/polygon/connectors/aave/v3/events.sol b/contracts/polygon/connectors/aave/v3/events.sol
index 32926b9a..800c7873 100644
--- a/contracts/polygon/connectors/aave/v3/events.sol
+++ b/contracts/polygon/connectors/aave/v3/events.sol
@@ -35,7 +35,7 @@ contract Events {
 	event LogDelegateBorrow(
 		address token,
 		uint256 amount,
-		uint16 rateMode,
+		uint256 rateMode,
 		address delegateTo,
 		uint256 getId,
 		uint256 setId
diff --git a/contracts/polygon/connectors/aave/v3/main.sol b/contracts/polygon/connectors/aave/v3/main.sol
index 2a166a7d..2d25f255 100644
--- a/contracts/polygon/connectors/aave/v3/main.sol
+++ b/contracts/polygon/connectors/aave/v3/main.sol
@@ -441,7 +441,6 @@ abstract contract AaveResolver is Events, Helpers {
 
 		_eventName = "LogDelegateBorrow(address,uint256,uint256,address,uint256,uint256)";
 		_eventParam = abi.encode(token, _amt, rateMode, delegateTo, getId, setId);
-
 	}
 }
 

From be1cf065c95de4f41a504b5910d7a3a6f8b6e062 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <47134275+shriyatyagii@users.noreply.github.com>
Date: Thu, 28 Apr 2022 00:47:25 +0400
Subject: [PATCH 18/33] updated comments

Co-authored-by: Thrilok kumar <thrilok2000@gmail.com>
---
 contracts/arbitrum/connectors/aave/v3/main.sol | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index cc27988d..83ab1141 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -64,7 +64,7 @@ abstract contract AaveResolver is Events, Helpers {
 	}
 
 	/**
-	 * @dev Deposit ETH/ERC20_Token.
+	 * @dev Deposit ETH/ERC20_Token without collateral
 	 * @notice Deposit a token to Aave v3 for lending / collaterization.
 	 * @param token The address of the token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)

From 3a6a864d8ff7e7a1641143ed2155ec29d21e8a8c Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <47134275+shriyatyagii@users.noreply.github.com>
Date: Thu, 28 Apr 2022 00:47:37 +0400
Subject: [PATCH 19/33] updated comments

Co-authored-by: Thrilok kumar <thrilok2000@gmail.com>
---
 contracts/arbitrum/connectors/aave/v3/main.sol | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index 83ab1141..be42dd55 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -65,7 +65,7 @@ abstract contract AaveResolver is Events, Helpers {
 
 	/**
 	 * @dev Deposit ETH/ERC20_Token without collateral
-	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 * @notice Deposit a token to Aave v3 without enabling it as collateral.
 	 * @param token The address of the token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
 	 * @param getId ID to retrieve amt.

From 390bacaa01185016fb6daaf5361a27246568b679 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Thu, 28 Apr 2022 00:53:56 +0400
Subject: [PATCH 20/33] updated comments for all chains

---
 contracts/avalanche/connectors/aave/v3/main.sol | 4 ++--
 contracts/fantom/connectors/aave/v3/main.sol    | 4 ++--
 contracts/mainnet/connectors/aave/v3/main.sol   | 4 ++--
 contracts/optimism/connectors/aave/v3/main.sol  | 4 ++--
 contracts/polygon/connectors/aave/v3/main.sol   | 4 ++--
 5 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/contracts/avalanche/connectors/aave/v3/main.sol b/contracts/avalanche/connectors/aave/v3/main.sol
index 1eff3505..675a04ac 100644
--- a/contracts/avalanche/connectors/aave/v3/main.sol
+++ b/contracts/avalanche/connectors/aave/v3/main.sol
@@ -64,8 +64,8 @@ abstract contract AaveResolver is Events, Helpers {
 	}
 
 	/**
-	 * @dev Deposit avax/ERC20_Token.
-	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 * @dev Deposit ETH/ERC20_Token without collateral
+	 * @notice Deposit a token to Aave v3 without enabling it as collateral.
 	 * @param token The address of the token to deposit.(For avax: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
 	 * @param getId ID to retrieve amt.
diff --git a/contracts/fantom/connectors/aave/v3/main.sol b/contracts/fantom/connectors/aave/v3/main.sol
index 47284485..4d1b4500 100644
--- a/contracts/fantom/connectors/aave/v3/main.sol
+++ b/contracts/fantom/connectors/aave/v3/main.sol
@@ -64,8 +64,8 @@ abstract contract AaveResolver is Events, Helpers {
 	}
 
 	/**
-	 * @dev Deposit Ftm/ERC20_Token.
-	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 * @dev Deposit ETH/ERC20_Token without collateral
+	 * @notice Deposit a token to Aave v3 without enabling it as collateral.
 	 * @param token The address of the token to deposit.(For FTM: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
 	 * @param getId ID to retrieve amt.
diff --git a/contracts/mainnet/connectors/aave/v3/main.sol b/contracts/mainnet/connectors/aave/v3/main.sol
index 895a3619..cc46cb9b 100644
--- a/contracts/mainnet/connectors/aave/v3/main.sol
+++ b/contracts/mainnet/connectors/aave/v3/main.sol
@@ -64,8 +64,8 @@ abstract contract AaveResolver is Events, Helpers {
 	}
 
 	/**
-	 * @dev Deposit ETH/ERC20_Token.
-	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 * @dev Deposit ETH/ERC20_Token without collateral
+	 * @notice Deposit a token to Aave v3 without enabling it as collateral.
 	 * @param token The address of the token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
 	 * @param getId ID to retrieve amt.
diff --git a/contracts/optimism/connectors/aave/v3/main.sol b/contracts/optimism/connectors/aave/v3/main.sol
index f24914b0..60f534e3 100644
--- a/contracts/optimism/connectors/aave/v3/main.sol
+++ b/contracts/optimism/connectors/aave/v3/main.sol
@@ -64,8 +64,8 @@ abstract contract AaveResolver is Events, Helpers {
 	}
 
 	/**
-	 * @dev Deposit ETH/ERC20_Token.
-	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 * @dev Deposit ETH/ERC20_Token without collateral
+	 * @notice Deposit a token to Aave v3 without enabling it as collateral.
 	 * @param token The address of the token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
 	 * @param getId ID to retrieve amt.
diff --git a/contracts/polygon/connectors/aave/v3/main.sol b/contracts/polygon/connectors/aave/v3/main.sol
index 2d25f255..b05cd1b5 100644
--- a/contracts/polygon/connectors/aave/v3/main.sol
+++ b/contracts/polygon/connectors/aave/v3/main.sol
@@ -64,8 +64,8 @@ abstract contract AaveResolver is Events, Helpers {
 	}
 
 	/**
-	 * @dev Deposit Matic/ERC20_Token.
-	 * @notice Deposit a token to Aave v3 for lending / collaterization.
+	 ** @dev Deposit ETH/ERC20_Token without collateral
+	 * @notice Deposit a token to Aave v3 without enabling it as collateral.
 	 * @param token The address of the token to deposit.(For Matic: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
 	 * @param getId ID to retrieve amt.

From ba6f368b725083bf01cce1fa1ec8dfa1174bda1e Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Thu, 28 Apr 2022 21:34:54 +0400
Subject: [PATCH 21/33] minor updates

---
 contracts/arbitrum/connectors/aave/v3/main.sol  | 2 +-
 contracts/avalanche/connectors/aave/v3/main.sol | 4 ++--
 contracts/fantom/connectors/aave/v3/main.sol    | 4 ++--
 contracts/mainnet/connectors/aave/v3/main.sol   | 2 +-
 contracts/optimism/connectors/aave/v3/main.sol  | 3 +--
 contracts/polygon/connectors/aave/v3/main.sol   | 2 +-
 6 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index be42dd55..1bdda4a5 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -219,7 +219,7 @@ abstract contract AaveResolver is Events, Helpers {
 		address _token = isEth ? wethAddr : token;
 
 		aave.borrow(_token, _amt, rateMode, referralCode, onBehalfOf);
-		convertEthToWeth(isEth, TokenInterface(_token), _amt);
+		convertWethToEth(isEth, TokenInterface(_token), _amt);
 
 		setUint(setId, _amt);
 
diff --git a/contracts/avalanche/connectors/aave/v3/main.sol b/contracts/avalanche/connectors/aave/v3/main.sol
index 675a04ac..19087d5f 100644
--- a/contracts/avalanche/connectors/aave/v3/main.sol
+++ b/contracts/avalanche/connectors/aave/v3/main.sol
@@ -64,7 +64,7 @@ abstract contract AaveResolver is Events, Helpers {
 	}
 
 	/**
-	 * @dev Deposit ETH/ERC20_Token without collateral
+	 * @dev Deposit avax/ERC20_Token without collateral
 	 * @notice Deposit a token to Aave v3 without enabling it as collateral.
 	 * @param token The address of the token to deposit.(For avax: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
@@ -219,7 +219,7 @@ abstract contract AaveResolver is Events, Helpers {
 		address _token = isAVAX ? wavaxAddr : token;
 
 		aave.borrow(_token, _amt, rateMode, referralCode, onBehalfOf);
-		convertAvaxToWavax(isAVAX, TokenInterface(_token), _amt);
+		convertWavaxToAvax(isAVAX, TokenInterface(_token), _amt);
 
 		setUint(setId, _amt);
 
diff --git a/contracts/fantom/connectors/aave/v3/main.sol b/contracts/fantom/connectors/aave/v3/main.sol
index 4d1b4500..ca0accf7 100644
--- a/contracts/fantom/connectors/aave/v3/main.sol
+++ b/contracts/fantom/connectors/aave/v3/main.sol
@@ -64,7 +64,7 @@ abstract contract AaveResolver is Events, Helpers {
 	}
 
 	/**
-	 * @dev Deposit ETH/ERC20_Token without collateral
+	 * @dev Deposit Ftm/ERC20_Token without collateral
 	 * @notice Deposit a token to Aave v3 without enabling it as collateral.
 	 * @param token The address of the token to deposit.(For FTM: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)
@@ -219,7 +219,7 @@ abstract contract AaveResolver is Events, Helpers {
 		address _token = isFTM ? wftmAddr : token;
 
 		aave.borrow(_token, _amt, rateMode, referralCode, onBehalfOf);
-		convertFtmToWftm(isFTM, TokenInterface(_token), _amt);
+		convertWftmToFtm(isFTM, TokenInterface(_token), _amt);
 
 		setUint(setId, _amt);
 
diff --git a/contracts/mainnet/connectors/aave/v3/main.sol b/contracts/mainnet/connectors/aave/v3/main.sol
index cc46cb9b..16f58258 100644
--- a/contracts/mainnet/connectors/aave/v3/main.sol
+++ b/contracts/mainnet/connectors/aave/v3/main.sol
@@ -219,7 +219,7 @@ abstract contract AaveResolver is Events, Helpers {
 		address _token = isEth ? wethAddr : token;
 
 		aave.borrow(_token, _amt, rateMode, referralCode, onBehalfOf);
-		convertEthToWeth(isEth, TokenInterface(_token), _amt);
+		convertWethToEth(isEth, TokenInterface(_token), _amt);
 
 		setUint(setId, _amt);
 
diff --git a/contracts/optimism/connectors/aave/v3/main.sol b/contracts/optimism/connectors/aave/v3/main.sol
index 60f534e3..518032ed 100644
--- a/contracts/optimism/connectors/aave/v3/main.sol
+++ b/contracts/optimism/connectors/aave/v3/main.sol
@@ -219,7 +219,7 @@ abstract contract AaveResolver is Events, Helpers {
 		address _token = isEth ? wethAddr : token;
 
 		aave.borrow(_token, _amt, rateMode, referralCode, onBehalfOf);
-		convertEthToWeth(isEth, TokenInterface(_token), _amt);
+		convertWethToEth(isEth, TokenInterface(_token), _amt);
 
 		setUint(setId, _amt);
 
@@ -430,7 +430,6 @@ abstract contract AaveResolver is Events, Helpers {
 		require(rateMode == 1 || rateMode == 2, "Invalid debt type");
 		uint256 _amt = getUint(getId, amount);
 
-
 		bool isEth = token == ethAddr;
 		address _token = isEth ? wethAddr : token;
 
diff --git a/contracts/polygon/connectors/aave/v3/main.sol b/contracts/polygon/connectors/aave/v3/main.sol
index b05cd1b5..5ff5f53d 100644
--- a/contracts/polygon/connectors/aave/v3/main.sol
+++ b/contracts/polygon/connectors/aave/v3/main.sol
@@ -64,7 +64,7 @@ abstract contract AaveResolver is Events, Helpers {
 	}
 
 	/**
-	 ** @dev Deposit ETH/ERC20_Token without collateral
+	 ** @dev Deposit Matic/ERC20_Token without collateral
 	 * @notice Deposit a token to Aave v3 without enabling it as collateral.
 	 * @param token The address of the token to deposit.(For Matic: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to deposit. (For max: `uint256(-1)`)

From 07af126574d5d9bb99d5349ac1d4736000bfe71d Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Thu, 28 Apr 2022 22:24:56 +0400
Subject: [PATCH 22/33] paybackOnBehalfOf added- Polygon

---
 .../polygon/connectors/aave/v3/events.sol     |  8 ++++
 .../polygon/connectors/aave/v3/helpers.sol    | 21 +++++++--
 contracts/polygon/connectors/aave/v3/main.sol | 45 +++++++++++++++++++
 3 files changed, 71 insertions(+), 3 deletions(-)

diff --git a/contracts/polygon/connectors/aave/v3/events.sol b/contracts/polygon/connectors/aave/v3/events.sol
index 800c7873..0324edcd 100644
--- a/contracts/polygon/connectors/aave/v3/events.sol
+++ b/contracts/polygon/connectors/aave/v3/events.sol
@@ -54,4 +54,12 @@ contract Events {
 		uint256 getId,
 		uint256 setId
 	);
+	event LogPaybackOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
+	);
 }
diff --git a/contracts/polygon/connectors/aave/v3/helpers.sol b/contracts/polygon/connectors/aave/v3/helpers.sol
index 4b2d239b..1f21db85 100644
--- a/contracts/polygon/connectors/aave/v3/helpers.sol
+++ b/contracts/polygon/connectors/aave/v3/helpers.sol
@@ -25,7 +25,7 @@ abstract contract Helpers is DSMath, Basic {
 
 	/**
 	 * @dev Checks if collateral is enabled for an asset
-	 * @param token token address of the asset.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param token token address of the asset.(For matic: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 */
 
 	function getIsColl(address token) internal view returns (bool isCol) {
@@ -37,7 +37,7 @@ abstract contract Helpers is DSMath, Basic {
 
 	/**
 	 * @dev Get total debt balance & fee for an asset
-	 * @param token token address of the debt.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param token token address of the debt.(For matic: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param rateMode Borrow rate mode (Stable = 1, Variable = 2)
 	 */
 	function getPaybackBalance(address token, uint256 rateMode)
@@ -50,9 +50,24 @@ 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)
+	 * @param token token address of the collateral.(For matic: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 */
 	function getCollateralBalance(address token)
 		internal
diff --git a/contracts/polygon/connectors/aave/v3/main.sol b/contracts/polygon/connectors/aave/v3/main.sol
index 5ff5f53d..a1336a8e 100644
--- a/contracts/polygon/connectors/aave/v3/main.sol
+++ b/contracts/polygon/connectors/aave/v3/main.sol
@@ -313,6 +313,51 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 
+	/**
+	 * @dev Payback borrowed matic/ERC20_Token on behalf os a user.
+	 * @notice Payback debt owed on behalf os a user.
+	 * @param token The address of the token to payback.(For matic: 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.getPool());
+
+		bool isMatic = token == maticAddr;
+		address _token = isMatic ? wmaticAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		_amt = _amt == uint256(-1) ? getOnBehalfOfPaybackBalance(_token, rateMode, onBehalfOf) : _amt;
+
+		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

From a65d9dd7a6279e76e5a91d528942e800049f008e Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Fri, 29 Apr 2022 01:31:18 +0400
Subject: [PATCH 23/33] added paybackOnBehalfOf() - Optimism

---
 .../optimism/connectors/aave/v3/events.sol    |  8 ++++
 .../optimism/connectors/aave/v3/helpers.sol   | 15 +++++++
 .../optimism/connectors/aave/v3/main.sol      | 45 +++++++++++++++++++
 contracts/polygon/connectors/aave/v3/main.sol |  2 +-
 4 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/contracts/optimism/connectors/aave/v3/events.sol b/contracts/optimism/connectors/aave/v3/events.sol
index 800c7873..0324edcd 100644
--- a/contracts/optimism/connectors/aave/v3/events.sol
+++ b/contracts/optimism/connectors/aave/v3/events.sol
@@ -54,4 +54,12 @@ contract Events {
 		uint256 getId,
 		uint256 setId
 	);
+	event LogPaybackOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
+	);
 }
diff --git a/contracts/optimism/connectors/aave/v3/helpers.sol b/contracts/optimism/connectors/aave/v3/helpers.sol
index 5e66f60e..35cebed8 100644
--- a/contracts/optimism/connectors/aave/v3/helpers.sol
+++ b/contracts/optimism/connectors/aave/v3/helpers.sol
@@ -50,6 +50,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 ETH: 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/optimism/connectors/aave/v3/main.sol b/contracts/optimism/connectors/aave/v3/main.sol
index 518032ed..8d7e1f59 100644
--- a/contracts/optimism/connectors/aave/v3/main.sol
+++ b/contracts/optimism/connectors/aave/v3/main.sol
@@ -313,6 +313,51 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 
+	/**
+	 * @dev Payback borrowed ETH/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 ETH: 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.getPool());
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		_amt = _amt == uint256(-1) ? getOnBehalfOfPaybackBalance(_token, rateMode, onBehalfOf) : _amt;
+
+		if (isEth) convertEthToWeth(isEth, 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
diff --git a/contracts/polygon/connectors/aave/v3/main.sol b/contracts/polygon/connectors/aave/v3/main.sol
index a1336a8e..d60d1b21 100644
--- a/contracts/polygon/connectors/aave/v3/main.sol
+++ b/contracts/polygon/connectors/aave/v3/main.sol
@@ -314,7 +314,7 @@ abstract contract AaveResolver is Events, Helpers {
 	}
 
 	/**
-	 * @dev Payback borrowed matic/ERC20_Token on behalf os a user.
+	 * @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 matic: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to payback. (For max: `uint256(-1)`)

From 9255d1a77e922a31aa24a1ebabd1c406872693c1 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Fri, 29 Apr 2022 01:35:31 +0400
Subject: [PATCH 24/33] paybackOnBehalfOf added - Mainnet

---
 .../mainnet/connectors/aave/v3/events.sol     |  8 ++++
 .../mainnet/connectors/aave/v3/helpers.sol    | 15 ++++++
 contracts/mainnet/connectors/aave/v3/main.sol | 46 +++++++++++++++++++
 3 files changed, 69 insertions(+)

diff --git a/contracts/mainnet/connectors/aave/v3/events.sol b/contracts/mainnet/connectors/aave/v3/events.sol
index 07888419..e60aaa12 100644
--- a/contracts/mainnet/connectors/aave/v3/events.sol
+++ b/contracts/mainnet/connectors/aave/v3/events.sol
@@ -53,4 +53,12 @@ contract Events {
 		uint256 getId,
 		uint256 setId
 	);
+	event LogPaybackOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
+	);
 }
diff --git a/contracts/mainnet/connectors/aave/v3/helpers.sol b/contracts/mainnet/connectors/aave/v3/helpers.sol
index ed7f03a2..1927aaa5 100644
--- a/contracts/mainnet/connectors/aave/v3/helpers.sol
+++ b/contracts/mainnet/connectors/aave/v3/helpers.sol
@@ -50,6 +50,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 ETH: 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/mainnet/connectors/aave/v3/main.sol b/contracts/mainnet/connectors/aave/v3/main.sol
index 16f58258..09c5493b 100644
--- a/contracts/mainnet/connectors/aave/v3/main.sol
+++ b/contracts/mainnet/connectors/aave/v3/main.sol
@@ -313,6 +313,52 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 
+	/**
+	 * @dev Payback borrowed ETH/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 ETH: 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.getPool());
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		_amt = _amt == uint256(-1) ? getOnBehalfOfPaybackBalance(_token, rateMode, onBehalfOf) : _amt;
+
+		if (isEth) convertEthToWeth(isEth, 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

From a3e48cc909bf3e2ad32e53045e1e7c373c812eb2 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Fri, 29 Apr 2022 01:39:06 +0400
Subject: [PATCH 25/33] paybackOnBehalfOf added - Fantom

---
 .../fantom/connectors/aave/v3/events.sol      |  8 ++++
 .../fantom/connectors/aave/v3/helpers.sol     | 21 +++++++--
 contracts/fantom/connectors/aave/v3/main.sol  | 45 +++++++++++++++++++
 3 files changed, 71 insertions(+), 3 deletions(-)

diff --git a/contracts/fantom/connectors/aave/v3/events.sol b/contracts/fantom/connectors/aave/v3/events.sol
index 800c7873..0324edcd 100644
--- a/contracts/fantom/connectors/aave/v3/events.sol
+++ b/contracts/fantom/connectors/aave/v3/events.sol
@@ -54,4 +54,12 @@ contract Events {
 		uint256 getId,
 		uint256 setId
 	);
+	event LogPaybackOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
+	);
 }
diff --git a/contracts/fantom/connectors/aave/v3/helpers.sol b/contracts/fantom/connectors/aave/v3/helpers.sol
index a5a57c81..e0605c8d 100644
--- a/contracts/fantom/connectors/aave/v3/helpers.sol
+++ b/contracts/fantom/connectors/aave/v3/helpers.sol
@@ -25,7 +25,7 @@ abstract contract Helpers is DSMath, Basic {
 
 	/**
 	 * @dev Checks if collateral is enabled for an asset
-	 * @param token token address of the asset.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param token token address of the asset.(For Ftm: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 */
 
 	function getIsColl(address token) internal view returns (bool isCol) {
@@ -37,7 +37,7 @@ abstract contract Helpers is DSMath, Basic {
 
 	/**
 	 * @dev Get total debt balance & fee for an asset
-	 * @param token token address of the debt.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param token token address of the debt.(For Ftm: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param rateMode Borrow rate mode (Stable = 1, Variable = 2)
 	 */
 	function getPaybackBalance(address token, uint256 rateMode)
@@ -50,9 +50,24 @@ 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 Ftm: 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)
+	 * @param token token address of the collateral.(For Ftm: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 */
 	function getCollateralBalance(address token)
 		internal
diff --git a/contracts/fantom/connectors/aave/v3/main.sol b/contracts/fantom/connectors/aave/v3/main.sol
index ca0accf7..eb767a46 100644
--- a/contracts/fantom/connectors/aave/v3/main.sol
+++ b/contracts/fantom/connectors/aave/v3/main.sol
@@ -313,6 +313,51 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 
+	/**
+	 * @dev Payback borrowed ftm/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 ftm: 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.getPool());
+
+		bool isFTM = token == ftmAddr;
+		address _token = isFTM ? wftmAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		_amt = _amt == uint256(-1) ? getOnBehalfOfPaybackBalance(_token, rateMode, onBehalfOf) : _amt;
+
+		if (isFTM) convertFtmToWftm(isFTM, 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

From dc02452a224b333b89d75b1c2ed168003628040e Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Fri, 29 Apr 2022 01:43:56 +0400
Subject: [PATCH 26/33] paybackOnBehalfOf added - Avalanche

---
 .../avalanche/connectors/aave/v3/events.sol   |  8 ++++
 .../avalanche/connectors/aave/v3/helpers.sol  | 21 +++++++--
 .../avalanche/connectors/aave/v3/main.sol     | 45 +++++++++++++++++++
 3 files changed, 71 insertions(+), 3 deletions(-)

diff --git a/contracts/avalanche/connectors/aave/v3/events.sol b/contracts/avalanche/connectors/aave/v3/events.sol
index 800c7873..0324edcd 100644
--- a/contracts/avalanche/connectors/aave/v3/events.sol
+++ b/contracts/avalanche/connectors/aave/v3/events.sol
@@ -54,4 +54,12 @@ contract Events {
 		uint256 getId,
 		uint256 setId
 	);
+	event LogPaybackOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
+	);
 }
diff --git a/contracts/avalanche/connectors/aave/v3/helpers.sol b/contracts/avalanche/connectors/aave/v3/helpers.sol
index 0fa43646..08c68889 100644
--- a/contracts/avalanche/connectors/aave/v3/helpers.sol
+++ b/contracts/avalanche/connectors/aave/v3/helpers.sol
@@ -25,7 +25,7 @@ abstract contract Helpers is DSMath, Basic {
 
 	/**
 	 * @dev Checks if collateral is enabled for an asset
-	 * @param token token address of the asset.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param token token address of the asset.(For avax: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 */
 
 	function getIsColl(address token) internal view returns (bool isCol) {
@@ -37,7 +37,7 @@ abstract contract Helpers is DSMath, Basic {
 
 	/**
 	 * @dev Get total debt balance & fee for an asset
-	 * @param token token address of the debt.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param token token address of the debt.(For avax: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param rateMode Borrow rate mode (Stable = 1, Variable = 2)
 	 */
 	function getPaybackBalance(address token, uint256 rateMode)
@@ -50,9 +50,24 @@ 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 ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
+	 * @param token token address of the collateral.(For avax: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 */
 	function getCollateralBalance(address token)
 		internal
diff --git a/contracts/avalanche/connectors/aave/v3/main.sol b/contracts/avalanche/connectors/aave/v3/main.sol
index 19087d5f..842195b3 100644
--- a/contracts/avalanche/connectors/aave/v3/main.sol
+++ b/contracts/avalanche/connectors/aave/v3/main.sol
@@ -313,6 +313,51 @@ 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.getPool());
+
+		bool isAVAX = token == avaxAddr;
+		address _token = isAVAX ? wavaxAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		_amt = _amt == uint256(-1) ? getOnBehalfOfPaybackBalance(_token, rateMode, onBehalfOf) : _amt;
+
+		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

From c1351601f00437ee8785d9a53f1f7652a38d30d2 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Fri, 29 Apr 2022 01:47:55 +0400
Subject: [PATCH 27/33] paybackOnBehalfOf added - Arbitrum

---
 .../arbitrum/connectors/aave/v3/events.sol    |  8 ++++
 .../arbitrum/connectors/aave/v3/helpers.sol   | 15 +++++++
 .../arbitrum/connectors/aave/v3/main.sol      | 45 +++++++++++++++++++
 3 files changed, 68 insertions(+)

diff --git a/contracts/arbitrum/connectors/aave/v3/events.sol b/contracts/arbitrum/connectors/aave/v3/events.sol
index 800c7873..0324edcd 100644
--- a/contracts/arbitrum/connectors/aave/v3/events.sol
+++ b/contracts/arbitrum/connectors/aave/v3/events.sol
@@ -54,4 +54,12 @@ contract Events {
 		uint256 getId,
 		uint256 setId
 	);
+	event LogPaybackOnBehalfOf(
+		address token,
+		uint256 amt,
+		uint256 rateMode,
+		address onBehalfOf,
+		uint256 getId,
+		uint256 setId
+	);
 }
diff --git a/contracts/arbitrum/connectors/aave/v3/helpers.sol b/contracts/arbitrum/connectors/aave/v3/helpers.sol
index f1cfb63b..61400738 100644
--- a/contracts/arbitrum/connectors/aave/v3/helpers.sol
+++ b/contracts/arbitrum/connectors/aave/v3/helpers.sol
@@ -50,6 +50,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 ETH: 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/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index 1bdda4a5..7f39fbcd 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -313,6 +313,51 @@ abstract contract AaveResolver is Events, Helpers {
 		_eventParam = abi.encode(token, _amt, rateMode, getId, setId);
 	}
 
+	/**
+	 * @dev Payback borrowed ETH/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 ETH: 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.getPool());
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		_amt = _amt == uint256(-1) ? getOnBehalfOfPaybackBalance(_token, rateMode, onBehalfOf) : _amt;
+
+		if (isEth) convertEthToWeth(isEth, 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

From a6a3d8438e968287fce5c428f96a23b0443e5b9e Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <47134275+shriyatyagii@users.noreply.github.com>
Date: Fri, 29 Apr 2022 02:05:59 +0400
Subject: [PATCH 28/33] Update contracts/arbitrum/connectors/aave/v3/main.sol

Co-authored-by: 0xPradyuman <63545809+pradyuman-verma@users.noreply.github.com>
---
 contracts/arbitrum/connectors/aave/v3/main.sol | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index 7f39fbcd..e8cd1ae6 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -194,7 +194,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Borrow a token using Aave v3 on behalf of a user
 	 * @param token The address of the token to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to borrow.
-	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param rateMode The type of debt. (For Stable: 1, Variable: 2)
 	 * @param onBehalfOf The user who will incur the debt
 	 * @param getId ID to retrieve amt.
 	 * @param setId ID stores the amount of tokens borrowed.

From bc622864aba276c5a6a0003f713c9bd6968671cb Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <47134275+shriyatyagii@users.noreply.github.com>
Date: Fri, 29 Apr 2022 02:06:55 +0400
Subject: [PATCH 29/33] Update contracts/arbitrum/connectors/aave/v3/main.sol

Co-authored-by: 0xPradyuman <63545809+pradyuman-verma@users.noreply.github.com>
---
 contracts/arbitrum/connectors/aave/v3/main.sol | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index e8cd1ae6..c8a64b4a 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -455,7 +455,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Gives approval to delegate debt tokens
 	 * @param token The address of token
 	 * @param amount The amount
-	 * @param rateMode The type of borrow debt
+	 * @param rateMode The type of debt
 	 * @param delegateTo The address to whom the user is delegating
 	 * @param getId ID to retrieve amt.
 	 * @param setId ID stores the amount of tokens deposited.

From 49f86dc29aff5fac9827b7c4b42756af04ce3dad Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <47134275+shriyatyagii@users.noreply.github.com>
Date: Fri, 29 Apr 2022 02:07:03 +0400
Subject: [PATCH 30/33] Update contracts/arbitrum/connectors/aave/v3/main.sol

Co-authored-by: 0xPradyuman <63545809+pradyuman-verma@users.noreply.github.com>
---
 contracts/arbitrum/connectors/aave/v3/main.sol | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index c8a64b4a..61608290 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -458,7 +458,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @param rateMode The type of debt
 	 * @param delegateTo The address to whom the user is delegating
 	 * @param getId ID to retrieve amt.
-	 * @param setId ID stores the amount of tokens deposited.
+	 * @param setId ID stores the amount of tokens delegated.
 	 */
 	function delegateBorrow(
 		address token,

From 9ec3f8d2c55f5514041c5d13c47ae1abad5c179b Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Fri, 29 Apr 2022 02:35:53 +0400
Subject: [PATCH 31/33] minor updates

---
 contracts/arbitrum/connectors/aave/v3/main.sol  | 2 +-
 contracts/avalanche/connectors/aave/v3/main.sol | 8 ++++----
 contracts/fantom/connectors/aave/v3/main.sol    | 8 ++++----
 contracts/mainnet/connectors/aave/v3/main.sol   | 8 ++++----
 contracts/optimism/connectors/aave/v3/main.sol  | 8 ++++----
 hardhat.config.ts                               | 2 +-
 6 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/contracts/arbitrum/connectors/aave/v3/main.sol b/contracts/arbitrum/connectors/aave/v3/main.sol
index 61608290..e7365567 100644
--- a/contracts/arbitrum/connectors/aave/v3/main.sol
+++ b/contracts/arbitrum/connectors/aave/v3/main.sol
@@ -158,7 +158,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Borrow a token using Aave v2
 	 * @param token The address of the token to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to borrow.
-	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param rateMode The type of debt. (For Stable: 1, Variable: 2)
 	 * @param getId ID to retrieve amt.
 	 * @param setId ID stores the amount of tokens borrowed.
 	 */
diff --git a/contracts/avalanche/connectors/aave/v3/main.sol b/contracts/avalanche/connectors/aave/v3/main.sol
index 842195b3..beec94a7 100644
--- a/contracts/avalanche/connectors/aave/v3/main.sol
+++ b/contracts/avalanche/connectors/aave/v3/main.sol
@@ -158,7 +158,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Borrow a token using Aave v3
 	 * @param token The address of the token to borrow.(For avax: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to borrow.
-	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param rateMode The type of debt. (For Stable: 1, Variable: 2)
 	 * @param getId ID to retrieve amt.
 	 * @param setId ID stores the amount of tokens borrowed.
 	 */
@@ -194,7 +194,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Borrow a token using Aave v3 on behalf of a user
 	 * @param token The address of the token to borrow.(For avax: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to borrow.
-	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param rateMode The type of debt. (For Stable: 1, Variable: 2)
 	 * @param onBehalfOf The user who will incur the debt
 	 * @param getId ID to retrieve amt.
 	 * @param setId ID stores the amount of tokens borrowed.
@@ -454,10 +454,10 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Gives approval to delegate debt tokens
 	 * @param token The address of token
 	 * @param amount The amount
-	 * @param rateMode The type of borrow debt
+	 * @param rateMode The type of debt
 	 * @param delegateTo The address to whom the user is delegating
 	 * @param getId ID to retrieve amt.
-	 * @param setId ID stores the amount of tokens deposited.
+	 * @param setId ID stores the amount of tokens delegated.
 	 */
 	function approveDelegation(
 		address token,
diff --git a/contracts/fantom/connectors/aave/v3/main.sol b/contracts/fantom/connectors/aave/v3/main.sol
index eb767a46..2a35f3dd 100644
--- a/contracts/fantom/connectors/aave/v3/main.sol
+++ b/contracts/fantom/connectors/aave/v3/main.sol
@@ -158,7 +158,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Borrow a token using Aave v3
 	 * @param token The address of the token to borrow.(For ftm: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to borrow.
-	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param rateMode The type of debt. (For Stable: 1, Variable: 2)
 	 * @param getId ID to retrieve amt.
 	 * @param setId ID stores the amount of tokens borrowed.
 	 */
@@ -194,7 +194,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Borrow a token using Aave v3 on behalf of a user
 	 * @param token The address of the token to borrow.(For FTM: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to borrow.
-	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param rateMode The type of debt. (For Stable: 1, Variable: 2)
 	 * @param onBehalfOf The user who will incur the debt
 	 * @param getId ID to retrieve amt.
 	 * @param setId ID stores the amount of tokens borrowed.
@@ -455,10 +455,10 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Gives approval to delegate debt tokens
 	 * @param token The address of token
 	 * @param amount The amount
-	 * @param rateMode The type of borrow debt
+	 * @param rateMode The type of debt
 	 * @param delegateTo The address to whom the user is delegating
 	 * @param getId ID to retrieve amt.
-	 * @param setId ID stores the amount of tokens deposited.
+	 * @param setId ID stores the amount of tokens delegated.
 	 */
 	function delegateBorrow(
 		address token,
diff --git a/contracts/mainnet/connectors/aave/v3/main.sol b/contracts/mainnet/connectors/aave/v3/main.sol
index 09c5493b..dd78cd6e 100644
--- a/contracts/mainnet/connectors/aave/v3/main.sol
+++ b/contracts/mainnet/connectors/aave/v3/main.sol
@@ -158,7 +158,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Borrow a token using Aave v3
 	 * @param token The address of the token to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to borrow.
-	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param rateMode The type of debt. (For Stable: 1, Variable: 2)
 	 * @param getId ID to retrieve amt.
 	 * @param setId ID stores the amount of tokens borrowed.
 	 */
@@ -194,7 +194,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Borrow a token using Aave v3 on behalf of a user
 	 * @param token The address of the token to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to borrow.
-	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param rateMode The type of debt. (For Stable: 1, Variable: 2)
 	 * @param onBehalfOf The user who will incur the debt
 	 * @param getId ID to retrieve amt.
 	 * @param setId ID stores the amount of tokens borrowed.
@@ -431,10 +431,10 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Gives approval to delegate debt tokens
 	 * @param token The address of token
 	 * @param amount The amount
-	 * @param rateMode The type of borrow debt
+	 * @param rateMode The type of debt
 	 * @param delegateTo The address to whom the user is delegating
 	 * @param getId ID to retrieve amt.
-	 * @param setId ID stores the amount of tokens deposited.
+	 * @param setId ID stores the amount of tokens delegated.
 	 */
 	function delegateBorrow(
 		address token,
diff --git a/contracts/optimism/connectors/aave/v3/main.sol b/contracts/optimism/connectors/aave/v3/main.sol
index 8d7e1f59..04992f43 100644
--- a/contracts/optimism/connectors/aave/v3/main.sol
+++ b/contracts/optimism/connectors/aave/v3/main.sol
@@ -158,7 +158,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Borrow a token using Aave v3
 	 * @param token The address of the token to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to borrow.
-	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param rateMode The type of debt. (For Stable: 1, Variable: 2)
 	 * @param getId ID to retrieve amt.
 	 * @param setId ID stores the amount of tokens borrowed.
 	 */
@@ -194,7 +194,7 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Borrow a token using Aave v3 on behalf of a user
 	 * @param token The address of the token to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
 	 * @param amt The amount of the token to borrow.
-	 * @param rateMode The type of borrow debt. (For Stable: 1, Variable: 2)
+	 * @param rateMode The type of debt. (For Stable: 1, Variable: 2)
 	 * @param onBehalfOf The user who will incur the debt
 	 * @param getId ID to retrieve amt.
 	 * @param setId ID stores the amount of tokens borrowed.
@@ -455,10 +455,10 @@ abstract contract AaveResolver is Events, Helpers {
 	 * @notice Gives approval to delegate debt tokens
 	 * @param token The address of token
 	 * @param amount The amount
-	 * @param rateMode The type of borrow debt
+	 * @param rateMode The type of debt
 	 * @param delegateTo The address to whom the user is delegating
 	 * @param getId ID to retrieve amt.
-	 * @param setId ID stores the amount of tokens deposited.
+	 * @param setId ID stores the amount of tokens delegated.
 	 */
 	function delegateBorrow(
 		address token,
diff --git a/hardhat.config.ts b/hardhat.config.ts
index 4a4e7a21..12280e70 100644
--- a/hardhat.config.ts
+++ b/hardhat.config.ts
@@ -40,7 +40,7 @@ const mnemonic = process.env.MNEMONIC ?? "test test test test test test test tes
 const networkGasPriceConfig: Record<string, number> = {
   mainnet: 100,
   polygon: 50,
-  avalanche: 30,
+  avalanche: 40,
   arbitrum: 1,
   optimism: 0.001,
   fantom: 300

From 963248d0d041c9aef34947df0ce4ea2b87f4dde6 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Sat, 30 Apr 2022 19:03:19 +0400
Subject: [PATCH 32/33] paybackOnBehalfOf added - Mainnet Aave V2

---
 .../mainnet/connectors/aave/v2/events.sol     |  8 ++++
 .../mainnet/connectors/aave/v2/helpers.sol    | 15 +++++++
 contracts/mainnet/connectors/aave/v2/main.sol | 45 +++++++++++++++++++
 3 files changed, 68 insertions(+)

diff --git a/contracts/mainnet/connectors/aave/v2/events.sol b/contracts/mainnet/connectors/aave/v2/events.sol
index a89e15e4..ab4df395 100644
--- a/contracts/mainnet/connectors/aave/v2/events.sol
+++ b/contracts/mainnet/connectors/aave/v2/events.sol
@@ -8,4 +8,12 @@ contract Events {
     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/mainnet/connectors/aave/v2/helpers.sol b/contracts/mainnet/connectors/aave/v2/helpers.sol
index 75242db2..edd8c462 100644
--- a/contracts/mainnet/connectors/aave/v2/helpers.sol
+++ b/contracts/mainnet/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 ETH: 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/mainnet/connectors/aave/v2/main.sol b/contracts/mainnet/connectors/aave/v2/main.sol
index 6319d10d..8044180f 100644
--- a/contracts/mainnet/connectors/aave/v2/main.sol
+++ b/contracts/mainnet/connectors/aave/v2/main.sol
@@ -164,6 +164,51 @@ abstract contract AaveResolver is Events, Helpers {
         _eventParam = abi.encode(token, _amt, rateMode, getId, setId);
     }
 
+    /**
+	 * @dev Payback borrowed ETH/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 ETH: 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 isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		_amt = _amt == uint256(-1) ? getOnBehalfOfPaybackBalance(_token, rateMode, onBehalfOf) : _amt;
+
+		if (isEth) convertEthToWeth(isEth, 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

From 8ebbeaae42ca913d9c22ede4e0d3b60ad4d4ecf4 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Sun, 1 May 2022 15:13:25 +0400
Subject: [PATCH 33/33] Revert "paybackOnBehalfOf added - Mainnet Aave V2"

This reverts commit 963248d0d041c9aef34947df0ce4ea2b87f4dde6.
---
 .../mainnet/connectors/aave/v2/events.sol     |  8 ----
 .../mainnet/connectors/aave/v2/helpers.sol    | 15 -------
 contracts/mainnet/connectors/aave/v2/main.sol | 45 -------------------
 3 files changed, 68 deletions(-)

diff --git a/contracts/mainnet/connectors/aave/v2/events.sol b/contracts/mainnet/connectors/aave/v2/events.sol
index ab4df395..a89e15e4 100644
--- a/contracts/mainnet/connectors/aave/v2/events.sol
+++ b/contracts/mainnet/connectors/aave/v2/events.sol
@@ -8,12 +8,4 @@ contract Events {
     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/mainnet/connectors/aave/v2/helpers.sol b/contracts/mainnet/connectors/aave/v2/helpers.sol
index edd8c462..75242db2 100644
--- a/contracts/mainnet/connectors/aave/v2/helpers.sol
+++ b/contracts/mainnet/connectors/aave/v2/helpers.sol
@@ -40,21 +40,6 @@ 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 ETH: 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/mainnet/connectors/aave/v2/main.sol b/contracts/mainnet/connectors/aave/v2/main.sol
index 8044180f..6319d10d 100644
--- a/contracts/mainnet/connectors/aave/v2/main.sol
+++ b/contracts/mainnet/connectors/aave/v2/main.sol
@@ -164,51 +164,6 @@ abstract contract AaveResolver is Events, Helpers {
         _eventParam = abi.encode(token, _amt, rateMode, getId, setId);
     }
 
-    /**
-	 * @dev Payback borrowed ETH/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 ETH: 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 isEth = token == ethAddr;
-		address _token = isEth ? wethAddr : token;
-
-		TokenInterface tokenContract = TokenInterface(_token);
-
-		_amt = _amt == uint256(-1) ? getOnBehalfOfPaybackBalance(_token, rateMode, onBehalfOf) : _amt;
-
-		if (isEth) convertEthToWeth(isEth, 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