From 3c63d3369b728e3197f9a13208f9103524adbeb6 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Thu, 21 May 2020 00:17:14 +0530 Subject: [PATCH 01/14] Almost done with aave connector --- contracts/connectors/aave.sol | 200 ++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 contracts/connectors/aave.sol diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol new file mode 100644 index 0000000..2200515 --- /dev/null +++ b/contracts/connectors/aave.sol @@ -0,0 +1,200 @@ +pragma solidity ^0.6.0; + +// import files from common directory +import { TokenInterface , MemoryInterface, EventInterface} from "../common/interfaces.sol"; +import { Stores } from "../common/stores.sol"; +import { DSMath } from "../common/math.sol"; + +interface AaveInterface { + function deposit(address _reserve, uint256 _amount, uint16 _referralCode) external payable; + function redeemUnderlying( + address _reserve, + address payable _user, + uint256 _amount, + uint256 _aTokenBalanceAfterRedeem + ) external; + function setUserUseReserveAsCollateral(address _reserve, bool _useAsCollateral) external; + function getUserReserveData(address _reserve, address _user) external view returns ( + uint256 currentATokenBalance, + uint256 currentBorrowBalance, + uint256 principalBorrowBalance, + uint256 borrowRateMode, + uint256 borrowRate, + uint256 liquidityRate, + uint256 originationFee, + uint256 variableBorrowIndex, + uint256 lastUpdateTimestamp, + bool usageAsCollateralEnabled + ); + function borrow(address _reserve, uint256 _amount, uint256 _interestRateMode, uint16 _referralCode) external; + function repay(address _reserve, uint256 _amount, address payable _onBehalfOf) external payable; +} + +interface AaveProviderInterface { + function getLendingPool() external view returns (address); + function getLendingPoolCore() external view returns (address); +} + +interface AaveCoreInterface { + function getReserveATokenAddress(address _reserve) external view returns (address); +} + +interface ATokenInterface { + function redeem(uint256 _amount) external; + function balanceOf(address _user) external view returns(uint256); + function principalBalanceOf(address _user) external view returns(uint256); +} + +contract AaveHelpers is DSMath, Stores { + /** + * @dev get Aave Address + */ + function getAaveProviderAddress() internal pure returns (address) { + // return 0x24a42fD28C976A61Df5D00D0599C34c4f90748c8; //mainnet + // return 0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5; //kovan + return 0x1c8756FD2B28e9426CDBDcC7E3c4d64fa9A54728; //ropsten + } + + function getWithdrawBalance(address token) internal view returns (uint bal) { + AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); + AaveInterface aave = AaveInterface(lendingProviderPool.getLendingPool()); + (bal, , , , , , , , , ) = aave.getUserReserveData(token, msg.sender); + } + + function getPaybackBalance(address token) internal view returns (uint bal) { + AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); + AaveInterface aave = AaveInterface(lendingProviderPool.getLendingPool()); + (, bal, , , , , , , , ) = aave.getUserReserveData(token, msg.sender); + } +} + + +contract BasicResolver is AaveHelpers { + event LogDeposit(address indexed token, uint256 tokenAmt, uint256 getId, uint256 setId); + event LogWithdraw(address indexed token, uint256 tokenAmt, uint256 getId, uint256 setId); + event LogBorrow(address indexed token, uint256 tokenAmt, uint256 getId, uint256 setId); + event LogPayback(address indexed token, uint256 tokenAmt, uint256 getId, uint256 setId); + + /** + * @dev Deposit ETH/ERC20_Token. + * @param token token address to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param amt token amount to deposit. + * @param getId Get token amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. + */ + function deposit(address token, uint amt, uint getId, uint setId) external payable{ + uint _amt = getUint(getId, amt); + AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); + AaveInterface aave = AaveInterface(lendingProviderPool.getLendingPool()); + + uint ethAmt; + if (token == getEthAddr()) { + require(_amt == msg.value, "not-enought-eth"); + ethAmt = _amt; + } else { + TokenInterface tokenContract = TokenInterface(token); + require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); + tokenContract.approve(lendingProviderPool.getLendingPoolCore(), _amt); + } + + aave.deposit.value(ethAmt)(token, amt, 0); // TODO - need to set referralCode; + aave.setUserUseReserveAsCollateral(token, true); + setUint(setId, _amt); + + emit LogDeposit(token, _amt, getId, setId); + bytes32 _eventCode = keccak256("LogDeposit(address,uint256,uint256,uint256)"); + bytes memory _eventParam = abi.encode(token, _amt, getId, setId); + (uint _type, uint _id) = connectorID(); + EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); + } + + /** + * @dev Withdraw ETH/ERC20_Token. + * @param token token address to withdraw.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param amt token amount to withdraw. + * @param getId Get token amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. + */ + function withdraw(address token, uint amt, uint getId, uint setId) external payable{ + uint _amt = getUint(getId, amt); + AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); + AaveCoreInterface aaveCore = AaveCoreInterface(lendingProviderPool.getLendingPoolCore()); + ATokenInterface atoken = ATokenInterface(aaveCore.getReserveATokenAddress(token)); + + uint totalBal = atoken.balanceOf(address(this)); + + _amt = _amt >= totalBal ? totalBal : _amt; + + uint initialBal = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this)); + atoken.redeem(_amt); + uint finialBal = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this)); + uint withdrawnAmt = sub(finialBal, initialBal); + require(withdrawnAmt >= _amt, "withdraw-error"); + setUint(setId, _amt); + + emit LogWithdraw(token, _amt, getId, setId); + bytes32 _eventCode = keccak256("LogWithdraw(address,uint256,uint256,uint256)"); + bytes memory _eventParam = abi.encode(token, _amt, getId, setId); + (uint _type, uint _id) = connectorID(); + EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); + } + + /** + * @dev Borrow ETH/ERC20_Token. + * @param token token address to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param amt token amount to borrow. + * @param getId Get token amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. + */ + function borrow(address token, uint amt, uint getId, uint setId) external payable { + uint _amt = getUint(getId, amt); + AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); + AaveInterface aave = AaveInterface(lendingProviderPool.getLendingPool()); + aave.borrow(token, amt, 2, 0); // TODO - need to set referralCode; + setUint(setId, _amt); + + emit LogBorrow(token, _amt, getId, setId); + bytes32 _eventCode = keccak256("LogBorrow(address,uint256,uint256,uint256)"); + bytes memory _eventParam = abi.encode(token, _amt, getId, setId); + (uint _type, uint _id) = connectorID(); + EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); + } + + /** + * @dev Payback borrowed ETH/ERC20_Token. + * @param token token address to payback.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param amt token amount to payback. + * @param getId Get token amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. + */ + function payback(address token, uint amt, uint getId, uint setId) external payable { + uint _amt = getUint(getId, amt); + AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); + AaveInterface aave = AaveInterface(lendingProviderPool.getLendingPool()); + _amt = _amt == uint(-1) ? getPaybackBalance(token) : _amt; + + uint ethAmt; + if (token == getEthAddr()) { + require(address(this).balance >= _amt, "not-enough-eth"); + ethAmt = _amt; + } else { + TokenInterface tokenContract = TokenInterface(token); + require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); + tokenContract.approve(lendingProviderPool.getLendingPoolCore(), _amt); + } + + aave.repay.value(ethAmt)(token, amt, payable(address(this))); + + setUint(setId, _amt); + + emit LogPayback(token, _amt, getId, setId); + bytes32 _eventCode = keccak256("LogPayback(address,uint256,uint256,uint256)"); + bytes memory _eventParam = abi.encode(token, _amt, getId, setId); + (uint _type, uint _id) = connectorID(); + EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); + } +} + +contract ConnectAave is BasicResolver { + string public name = "Aave-v1"; +} \ No newline at end of file From 96346543b9ee412dd63ed0972efd0da203ccbbb6 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Thu, 21 May 2020 02:51:58 +0530 Subject: [PATCH 02/14] done with aave connector --- contracts/connectors/aave.sol | 67 +++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index 2200515..bc451db 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -49,22 +49,30 @@ contract AaveHelpers is DSMath, Stores { /** * @dev get Aave Address */ - function getAaveProviderAddress() internal pure returns (address) { + function getAaveAddress() internal pure returns (address) { // return 0x24a42fD28C976A61Df5D00D0599C34c4f90748c8; //mainnet - // return 0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5; //kovan - return 0x1c8756FD2B28e9426CDBDcC7E3c4d64fa9A54728; //ropsten + return 0x580D4Fdc4BF8f9b5ae2fb9225D584fED4AD5375c; //kovan + } + + /** + * @dev get Aave Core Address + */ + function getAaveCoreAddress() internal pure returns (address) { + // return 0x24a42fD28C976A61Df5D00D0599C34c4f90748c8; //mainnet + return 0x95D1189Ed88B380E319dF73fF00E479fcc4CFa45; //kovan + } + + function getIsColl(AaveInterface aave, address token) internal view returns (bool isCol) { + (, , , , , , , , , isCol) = aave.getUserReserveData(token, address(this)); } function getWithdrawBalance(address token) internal view returns (uint bal) { - AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); - AaveInterface aave = AaveInterface(lendingProviderPool.getLendingPool()); - (bal, , , , , , , , , ) = aave.getUserReserveData(token, msg.sender); + AaveInterface aave = AaveInterface(getAaveAddress()); + (bal, , , , , , , , , ) = aave.getUserReserveData(token, address(this)); } - function getPaybackBalance(address token) internal view returns (uint bal) { - AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); - AaveInterface aave = AaveInterface(lendingProviderPool.getLendingPool()); - (, bal, , , , , , , , ) = aave.getUserReserveData(token, msg.sender); + function getPaybackBalance(AaveInterface aave, address token) internal view returns (uint bal) { + (, bal, , , , , , , , ) = aave.getUserReserveData(token, address(this)); } } @@ -84,21 +92,24 @@ contract BasicResolver is AaveHelpers { */ function deposit(address token, uint amt, uint getId, uint setId) external payable{ uint _amt = getUint(getId, amt); - AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); - AaveInterface aave = AaveInterface(lendingProviderPool.getLendingPool()); + AaveInterface aave = AaveInterface(getAaveAddress()); uint ethAmt; if (token == getEthAddr()) { require(_amt == msg.value, "not-enought-eth"); + _amt = _amt == uint(-1) ? address(this).balance : _amt; ethAmt = _amt; } else { TokenInterface tokenContract = TokenInterface(token); + _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); - tokenContract.approve(lendingProviderPool.getLendingPoolCore(), _amt); + tokenContract.approve(getAaveCoreAddress(), _amt); } - aave.deposit.value(ethAmt)(token, amt, 0); // TODO - need to set referralCode; - aave.setUserUseReserveAsCollateral(token, true); + aave.deposit.value(ethAmt)(token, _amt, 0); // TODO - need to set referralCode; + + if (!getIsColl(aave, token)) aave.setUserUseReserveAsCollateral(token, true); + setUint(setId, _amt); emit LogDeposit(token, _amt, getId, setId); @@ -117,19 +128,16 @@ contract BasicResolver is AaveHelpers { */ function withdraw(address token, uint amt, uint getId, uint setId) external payable{ uint _amt = getUint(getId, amt); - AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); - AaveCoreInterface aaveCore = AaveCoreInterface(lendingProviderPool.getLendingPoolCore()); + AaveCoreInterface aaveCore = AaveCoreInterface(getAaveCoreAddress()); ATokenInterface atoken = ATokenInterface(aaveCore.getReserveATokenAddress(token)); - uint totalBal = atoken.balanceOf(address(this)); - - _amt = _amt >= totalBal ? totalBal : _amt; + _amt = _amt == uint(-1) ? atoken.balanceOf(address(this)) : _amt; uint initialBal = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this)); atoken.redeem(_amt); uint finialBal = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this)); - uint withdrawnAmt = sub(finialBal, initialBal); - require(withdrawnAmt >= _amt, "withdraw-error"); + + _amt = sub(finialBal, initialBal); setUint(setId, _amt); emit LogWithdraw(token, _amt, getId, setId); @@ -148,9 +156,8 @@ contract BasicResolver is AaveHelpers { */ function borrow(address token, uint amt, uint getId, uint setId) external payable { uint _amt = getUint(getId, amt); - AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); - AaveInterface aave = AaveInterface(lendingProviderPool.getLendingPool()); - aave.borrow(token, amt, 2, 0); // TODO - need to set referralCode; + AaveInterface aave = AaveInterface(getAaveAddress()); + aave.borrow(token, _amt, 2, 0); // TODO - need to set referralCode; setUint(setId, _amt); emit LogBorrow(token, _amt, getId, setId); @@ -169,9 +176,9 @@ contract BasicResolver is AaveHelpers { */ function payback(address token, uint amt, uint getId, uint setId) external payable { uint _amt = getUint(getId, amt); - AaveProviderInterface lendingProviderPool = AaveProviderInterface(getAaveProviderAddress()); - AaveInterface aave = AaveInterface(lendingProviderPool.getLendingPool()); - _amt = _amt == uint(-1) ? getPaybackBalance(token) : _amt; + AaveInterface aave = AaveInterface(getAaveAddress()); + + _amt = _amt == uint(-1) ? getPaybackBalance(aave, token) : _amt; uint ethAmt; if (token == getEthAddr()) { @@ -180,10 +187,10 @@ contract BasicResolver is AaveHelpers { } else { TokenInterface tokenContract = TokenInterface(token); require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); - tokenContract.approve(lendingProviderPool.getLendingPoolCore(), _amt); + tokenContract.approve(getAaveCoreAddress(), _amt); } - aave.repay.value(ethAmt)(token, amt, payable(address(this))); + aave.repay.value(ethAmt)(token, _amt, payable(address(this))); setUint(setId, _amt); From 9ec4a5a0bbadaed2bccbad25484e6ab0cf0fb3b6 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Fri, 22 May 2020 01:02:30 +0530 Subject: [PATCH 03/14] Fixed repay issue --- contracts/connectors/aave.sol | 39 +++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index bc451db..9920ec0 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -131,8 +131,6 @@ contract BasicResolver is AaveHelpers { AaveCoreInterface aaveCore = AaveCoreInterface(getAaveCoreAddress()); ATokenInterface atoken = ATokenInterface(aaveCore.getReserveATokenAddress(token)); - _amt = _amt == uint(-1) ? atoken.balanceOf(address(this)) : _amt; - uint initialBal = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this)); atoken.redeem(_amt); uint finialBal = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this)); @@ -178,19 +176,34 @@ contract BasicResolver is AaveHelpers { uint _amt = getUint(getId, amt); AaveInterface aave = AaveInterface(getAaveAddress()); - _amt = _amt == uint(-1) ? getPaybackBalance(aave, token) : _amt; - - uint ethAmt; - if (token == getEthAddr()) { - require(address(this).balance >= _amt, "not-enough-eth"); - ethAmt = _amt; + if (_amt == uint(-1)) { + if (token == getEthAddr()) { + uint ethAmt = getPaybackBalance(aave, token) + 100000000; + require(address(this).balance >= ethAmt, "not-enough-eth"); + aave.repay.value(ethAmt)(token, ethAmt, payable(address(this))); + } else { + TokenInterface tokenContract = TokenInterface(token); + require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); + tokenContract.approve(getAaveCoreAddress(), uint(-1)); + uint initalBal = tokenContract.balanceOf(address(this)); + aave.repay(token, uint(-1), payable(address(this))); + uint finalBal = tokenContract.balanceOf(address(this)); + tokenContract.approve(getAaveCoreAddress(), 0); + _amt = sub(initalBal, finalBal); + } } else { - TokenInterface tokenContract = TokenInterface(token); - require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); - tokenContract.approve(getAaveCoreAddress(), _amt); + uint ethAmt; + if (token == getEthAddr()) { + require(address(this).balance >= _amt, "not-enough-eth"); + ethAmt = _amt; + } else { + TokenInterface tokenContract = TokenInterface(token); + require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); + tokenContract.approve(getAaveCoreAddress(), _amt); + } + aave.repay.value(ethAmt)(token, _amt, payable(address(this))); } - - aave.repay.value(ethAmt)(token, _amt, payable(address(this))); + setUint(setId, _amt); From 0fd86b7e6d31c69a0f8357b27bb5557ba04afe26 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Sat, 23 May 2020 03:23:25 +0530 Subject: [PATCH 04/14] Fixed payback issue --- contracts/connectors/aave.sol | 40 ++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index 9920ec0..cfb8c80 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -71,8 +71,8 @@ contract AaveHelpers is DSMath, Stores { (bal, , , , , , , , , ) = aave.getUserReserveData(token, address(this)); } - function getPaybackBalance(AaveInterface aave, address token) internal view returns (uint bal) { - (, bal, , , , , , , , ) = aave.getUserReserveData(token, address(this)); + function getPaybackBalance(AaveInterface aave, address token) internal view returns (uint bal, uint fee) { + (, bal, , , , , fee, , , ) = aave.getUserReserveData(token, address(this)); } } @@ -176,11 +176,45 @@ contract BasicResolver is AaveHelpers { uint _amt = getUint(getId, amt); AaveInterface aave = AaveInterface(getAaveAddress()); + if (_amt == uint(-1)) { + uint fee; + (_amt, fee) = getPaybackBalance(aave, token); + _amt = add(_amt, fee); + } + uint ethAmt; + if (token == getEthAddr()) { + ethAmt = _amt; + require(address(this).balance >= _amt, "not-enough-eth"); + } else { + TokenInterface tokenContract = TokenInterface(token); + require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); + tokenContract.approve(getAaveCoreAddress(), _amt); + } + + aave.repay.value(ethAmt)(token, _amt, payable(address(this))); + + setUint(setId, _amt); + + emit LogPayback(token, _amt, getId, setId); + bytes32 _eventCode = keccak256("LogPayback(address,uint256,uint256,uint256)"); + bytes memory _eventParam = abi.encode(token, _amt, getId, setId); + (uint _type, uint _id) = connectorID(); + EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); + } + + function payback2(address token, uint amt, uint getId, uint setId) external payable { + uint _amt = getUint(getId, amt); + AaveInterface aave = AaveInterface(getAaveAddress()); + if (_amt == uint(-1)) { if (token == getEthAddr()) { - uint ethAmt = getPaybackBalance(aave, token) + 100000000; + (uint ethAmt, uint fee) = getPaybackBalance(aave, token); + ethAmt += fee; + uint initalBal = address(this).balance; require(address(this).balance >= ethAmt, "not-enough-eth"); aave.repay.value(ethAmt)(token, ethAmt, payable(address(this))); + uint finalBal = address(this).balance; + _amt = sub(initalBal, finalBal); } else { TokenInterface tokenContract = TokenInterface(token); require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); From ff390f88fc4b9f0d07ca1eb71233ccd870a08627 Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Sat, 23 May 2020 20:50:59 +1000 Subject: [PATCH 05/14] (deposit) bug fix - removed msg.value == _amt --- contracts/connectors/aave.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index cfb8c80..4cd9366 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -96,7 +96,6 @@ contract BasicResolver is AaveHelpers { uint ethAmt; if (token == getEthAddr()) { - require(_amt == msg.value, "not-enought-eth"); _amt = _amt == uint(-1) ? address(this).balance : _amt; ethAmt = _amt; } else { @@ -107,9 +106,9 @@ contract BasicResolver is AaveHelpers { } aave.deposit.value(ethAmt)(token, _amt, 0); // TODO - need to set referralCode; - + if (!getIsColl(aave, token)) aave.setUserUseReserveAsCollateral(token, true); - + setUint(setId, _amt); emit LogDeposit(token, _amt, getId, setId); From d9f86e3b689aa936a2f3123c0af7594627838e4a Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Sat, 23 May 2020 20:52:48 +1000 Subject: [PATCH 06/14] removed unnecessary require statement --- contracts/connectors/aave.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index 4cd9366..c35c64a 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -101,7 +101,6 @@ contract BasicResolver is AaveHelpers { } else { TokenInterface tokenContract = TokenInterface(token); _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; - require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); tokenContract.approve(getAaveCoreAddress(), _amt); } From 09a6932acc84fbb7ba79fd0df40f382ae6d643a7 Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Sat, 23 May 2020 22:08:06 +1000 Subject: [PATCH 07/14] code restruturing --- contracts/connectors/aave.sol | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index c35c64a..1b305f8 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -15,16 +15,16 @@ interface AaveInterface { ) external; function setUserUseReserveAsCollateral(address _reserve, bool _useAsCollateral) external; function getUserReserveData(address _reserve, address _user) external view returns ( - uint256 currentATokenBalance, - uint256 currentBorrowBalance, - uint256 principalBorrowBalance, - uint256 borrowRateMode, - uint256 borrowRate, - uint256 liquidityRate, - uint256 originationFee, - uint256 variableBorrowIndex, - uint256 lastUpdateTimestamp, - bool usageAsCollateralEnabled + uint256 currentATokenBalance, + uint256 currentBorrowBalance, + uint256 principalBorrowBalance, + uint256 borrowRateMode, + uint256 borrowRate, + uint256 liquidityRate, + uint256 originationFee, + uint256 variableBorrowIndex, + uint256 lastUpdateTimestamp, + bool usageAsCollateralEnabled ); function borrow(address _reserve, uint256 _amount, uint256 _interestRateMode, uint16 _referralCode) external; function repay(address _reserve, uint256 _amount, address payable _onBehalfOf) external payable; @@ -90,7 +90,7 @@ contract BasicResolver is AaveHelpers { * @param getId Get token amount at this ID from `InstaMemory` Contract. * @param setId Set token amount at this ID in `InstaMemory` Contract. */ - function deposit(address token, uint amt, uint getId, uint setId) external payable{ + function deposit(address token, uint amt, uint getId, uint setId) external payable { uint _amt = getUint(getId, amt); AaveInterface aave = AaveInterface(getAaveAddress()); @@ -124,7 +124,7 @@ contract BasicResolver is AaveHelpers { * @param getId Get token amount at this ID from `InstaMemory` Contract. * @param setId Set token amount at this ID in `InstaMemory` Contract. */ - function withdraw(address token, uint amt, uint getId, uint setId) external payable{ + function withdraw(address token, uint amt, uint getId, uint setId) external payable { uint _amt = getUint(getId, amt); AaveCoreInterface aaveCore = AaveCoreInterface(getAaveCoreAddress()); ATokenInterface atoken = ATokenInterface(aaveCore.getReserveATokenAddress(token)); @@ -188,7 +188,7 @@ contract BasicResolver is AaveHelpers { require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); tokenContract.approve(getAaveCoreAddress(), _amt); } - + aave.repay.value(ethAmt)(token, _amt, payable(address(this))); setUint(setId, _amt); @@ -235,7 +235,6 @@ contract BasicResolver is AaveHelpers { } aave.repay.value(ethAmt)(token, _amt, payable(address(this))); } - setUint(setId, _amt); From 9a931a40366a283c85474575227fd6053b2bd0bc Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Sat, 23 May 2020 22:08:22 +1000 Subject: [PATCH 08/14] removed unnecessary require statements --- contracts/connectors/aave.sol | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index 1b305f8..2c2c8ae 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -182,11 +182,8 @@ contract BasicResolver is AaveHelpers { uint ethAmt; if (token == getEthAddr()) { ethAmt = _amt; - require(address(this).balance >= _amt, "not-enough-eth"); } else { - TokenInterface tokenContract = TokenInterface(token); - require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); - tokenContract.approve(getAaveCoreAddress(), _amt); + TokenInterface(token).approve(getAaveCoreAddress(), _amt); } aave.repay.value(ethAmt)(token, _amt, payable(address(this))); From eb62198a10d7f447035aaeb77de8bf8f436e04b0 Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Sat, 23 May 2020 22:09:25 +1000 Subject: [PATCH 09/14] fixed typo --- contracts/connectors/aave.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index 2c2c8ae..640cee6 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -131,9 +131,9 @@ contract BasicResolver is AaveHelpers { uint initialBal = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this)); atoken.redeem(_amt); - uint finialBal = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this)); + uint finalBal = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this)); - _amt = sub(finialBal, initialBal); + _amt = sub(finalBal, initialBal); setUint(setId, _amt); emit LogWithdraw(token, _amt, getId, setId); From 4feda4a6cbb4f9525d6fb6e486d2f6c64b2aec2d Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Sat, 23 May 2020 23:48:01 +1000 Subject: [PATCH 10/14] withdraw token interface repeating fixed --- contracts/connectors/aave.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index 640cee6..eb1b243 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -128,10 +128,11 @@ contract BasicResolver is AaveHelpers { uint _amt = getUint(getId, amt); AaveCoreInterface aaveCore = AaveCoreInterface(getAaveCoreAddress()); ATokenInterface atoken = ATokenInterface(aaveCore.getReserveATokenAddress(token)); + TokenInterface tokenContract = TokenInterface(token); - uint initialBal = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this)); + uint initialBal = token == getEthAddr() ? address(this).balance : tokenContract.balanceOf(address(this)); atoken.redeem(_amt); - uint finalBal = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this)); + uint finalBal = token == getEthAddr() ? address(this).balance : tokenContract.balanceOf(address(this)); _amt = sub(finalBal, initialBal); setUint(setId, _amt); From 42e38682cae94cec1f9300fa2b19116074d660c0 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Tue, 26 May 2020 00:34:04 +0530 Subject: [PATCH 11/14] Done with aave connector --- contracts/connectors/aave.sol | 56 ++++++----------------------------- 1 file changed, 9 insertions(+), 47 deletions(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index eb1b243..8f6faa2 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -62,6 +62,13 @@ contract AaveHelpers is DSMath, Stores { return 0x95D1189Ed88B380E319dF73fF00E479fcc4CFa45; //kovan } + /** + * @dev get Referral Code + */ + function getReferralCode() internal pure returns (uint16) { + return 3228; + } + function getIsColl(AaveInterface aave, address token) internal view returns (bool isCol) { (, , , , , , , , , isCol) = aave.getUserReserveData(token, address(this)); } @@ -104,7 +111,7 @@ contract BasicResolver is AaveHelpers { tokenContract.approve(getAaveCoreAddress(), _amt); } - aave.deposit.value(ethAmt)(token, _amt, 0); // TODO - need to set referralCode; + aave.deposit.value(ethAmt)(token, _amt, getReferralCode()); // TODO - need to set referralCode; if (!getIsColl(aave, token)) aave.setUserUseReserveAsCollateral(token, true); @@ -154,7 +161,7 @@ contract BasicResolver is AaveHelpers { function borrow(address token, uint amt, uint getId, uint setId) external payable { uint _amt = getUint(getId, amt); AaveInterface aave = AaveInterface(getAaveAddress()); - aave.borrow(token, _amt, 2, 0); // TODO - need to set referralCode; + aave.borrow(token, _amt, 2, getReferralCode()); setUint(setId, _amt); emit LogBorrow(token, _amt, getId, setId); @@ -197,51 +204,6 @@ contract BasicResolver is AaveHelpers { (uint _type, uint _id) = connectorID(); EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); } - - function payback2(address token, uint amt, uint getId, uint setId) external payable { - uint _amt = getUint(getId, amt); - AaveInterface aave = AaveInterface(getAaveAddress()); - - if (_amt == uint(-1)) { - if (token == getEthAddr()) { - (uint ethAmt, uint fee) = getPaybackBalance(aave, token); - ethAmt += fee; - uint initalBal = address(this).balance; - require(address(this).balance >= ethAmt, "not-enough-eth"); - aave.repay.value(ethAmt)(token, ethAmt, payable(address(this))); - uint finalBal = address(this).balance; - _amt = sub(initalBal, finalBal); - } else { - TokenInterface tokenContract = TokenInterface(token); - require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); - tokenContract.approve(getAaveCoreAddress(), uint(-1)); - uint initalBal = tokenContract.balanceOf(address(this)); - aave.repay(token, uint(-1), payable(address(this))); - uint finalBal = tokenContract.balanceOf(address(this)); - tokenContract.approve(getAaveCoreAddress(), 0); - _amt = sub(initalBal, finalBal); - } - } else { - uint ethAmt; - if (token == getEthAddr()) { - require(address(this).balance >= _amt, "not-enough-eth"); - ethAmt = _amt; - } else { - TokenInterface tokenContract = TokenInterface(token); - require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); - tokenContract.approve(getAaveCoreAddress(), _amt); - } - aave.repay.value(ethAmt)(token, _amt, payable(address(this))); - } - - setUint(setId, _amt); - - emit LogPayback(token, _amt, getId, setId); - bytes32 _eventCode = keccak256("LogPayback(address,uint256,uint256,uint256)"); - bytes memory _eventParam = abi.encode(token, _amt, getId, setId); - (uint _type, uint _id) = connectorID(); - EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); - } } contract ConnectAave is BasicResolver { From 9e438743733e69ed3fb22a5bc0e2fc1cafc6e983 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Sun, 31 May 2020 03:38:43 +0530 Subject: [PATCH 12/14] Minor changes --- contracts/connectors/aave.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index 8f6faa2..220236b 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -111,7 +111,7 @@ contract BasicResolver is AaveHelpers { tokenContract.approve(getAaveCoreAddress(), _amt); } - aave.deposit.value(ethAmt)(token, _amt, getReferralCode()); // TODO - need to set referralCode; + aave.deposit.value(ethAmt)(token, _amt, getReferralCode()); if (!getIsColl(aave, token)) aave.setUserUseReserveAsCollateral(token, true); From 3e3bb2b090da6ea9a68320921f7667ea82918685 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Sun, 31 May 2020 03:40:45 +0530 Subject: [PATCH 13/14] Added mainnet address --- contracts/connectors/aave.sol | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index 220236b..bf30bb1 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -50,16 +50,16 @@ contract AaveHelpers is DSMath, Stores { * @dev get Aave Address */ function getAaveAddress() internal pure returns (address) { - // return 0x24a42fD28C976A61Df5D00D0599C34c4f90748c8; //mainnet - return 0x580D4Fdc4BF8f9b5ae2fb9225D584fED4AD5375c; //kovan + return 0x398eC7346DcD622eDc5ae82352F02bE94C62d119; //mainnet + // return 0x580D4Fdc4BF8f9b5ae2fb9225D584fED4AD5375c; //kovan } /** * @dev get Aave Core Address */ function getAaveCoreAddress() internal pure returns (address) { - // return 0x24a42fD28C976A61Df5D00D0599C34c4f90748c8; //mainnet - return 0x95D1189Ed88B380E319dF73fF00E479fcc4CFa45; //kovan + return 0x3dfd23A6c5E8BbcFc9581d2E864a68feb6a076d3; //mainnet + // return 0x95D1189Ed88B380E319dF73fF00E479fcc4CFa45; //kovan } /** @@ -120,8 +120,7 @@ contract BasicResolver is AaveHelpers { emit LogDeposit(token, _amt, getId, setId); bytes32 _eventCode = keccak256("LogDeposit(address,uint256,uint256,uint256)"); bytes memory _eventParam = abi.encode(token, _amt, getId, setId); - (uint _type, uint _id) = connectorID(); - EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); + emitEvent(_eventCode, _eventParam); } /** @@ -147,8 +146,7 @@ contract BasicResolver is AaveHelpers { emit LogWithdraw(token, _amt, getId, setId); bytes32 _eventCode = keccak256("LogWithdraw(address,uint256,uint256,uint256)"); bytes memory _eventParam = abi.encode(token, _amt, getId, setId); - (uint _type, uint _id) = connectorID(); - EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); + emitEvent(_eventCode, _eventParam); } /** @@ -167,8 +165,7 @@ contract BasicResolver is AaveHelpers { emit LogBorrow(token, _amt, getId, setId); bytes32 _eventCode = keccak256("LogBorrow(address,uint256,uint256,uint256)"); bytes memory _eventParam = abi.encode(token, _amt, getId, setId); - (uint _type, uint _id) = connectorID(); - EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); + emitEvent(_eventCode, _eventParam); } /** @@ -201,8 +198,7 @@ contract BasicResolver is AaveHelpers { emit LogPayback(token, _amt, getId, setId); bytes32 _eventCode = keccak256("LogPayback(address,uint256,uint256,uint256)"); bytes memory _eventParam = abi.encode(token, _amt, getId, setId); - (uint _type, uint _id) = connectorID(); - EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); + emitEvent(_eventCode, _eventParam); } } From e9f6b3932e50cd696234d929ebf65aabd03d8288 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Mon, 1 Jun 2020 04:16:24 +0530 Subject: [PATCH 14/14] Done with aave connector --- contracts/connectors/aave.sol | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/contracts/connectors/aave.sol b/contracts/connectors/aave.sol index bf30bb1..86aec7f 100644 --- a/contracts/connectors/aave.sol +++ b/contracts/connectors/aave.sol @@ -46,20 +46,13 @@ interface ATokenInterface { } contract AaveHelpers is DSMath, Stores { - /** - * @dev get Aave Address - */ - function getAaveAddress() internal pure returns (address) { - return 0x398eC7346DcD622eDc5ae82352F02bE94C62d119; //mainnet - // return 0x580D4Fdc4BF8f9b5ae2fb9225D584fED4AD5375c; //kovan - } /** - * @dev get Aave Core Address + * @dev get Aave Provider */ - function getAaveCoreAddress() internal pure returns (address) { - return 0x3dfd23A6c5E8BbcFc9581d2E864a68feb6a076d3; //mainnet - // return 0x95D1189Ed88B380E319dF73fF00E479fcc4CFa45; //kovan + function getAaveProvider() internal pure returns (AaveProviderInterface) { + return AaveProviderInterface(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8); //mainnet + // return AaveProviderInterface(0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5); //kovan } /** @@ -74,7 +67,7 @@ contract AaveHelpers is DSMath, Stores { } function getWithdrawBalance(address token) internal view returns (uint bal) { - AaveInterface aave = AaveInterface(getAaveAddress()); + AaveInterface aave = AaveInterface(getAaveProvider().getLendingPool()); (bal, , , , , , , , , ) = aave.getUserReserveData(token, address(this)); } @@ -99,7 +92,7 @@ contract BasicResolver is AaveHelpers { */ function deposit(address token, uint amt, uint getId, uint setId) external payable { uint _amt = getUint(getId, amt); - AaveInterface aave = AaveInterface(getAaveAddress()); + AaveInterface aave = AaveInterface(getAaveProvider().getLendingPool()); uint ethAmt; if (token == getEthAddr()) { @@ -108,7 +101,7 @@ contract BasicResolver is AaveHelpers { } else { TokenInterface tokenContract = TokenInterface(token); _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; - tokenContract.approve(getAaveCoreAddress(), _amt); + tokenContract.approve(getAaveProvider().getLendingPoolCore(), _amt); } aave.deposit.value(ethAmt)(token, _amt, getReferralCode()); @@ -132,7 +125,7 @@ contract BasicResolver is AaveHelpers { */ function withdraw(address token, uint amt, uint getId, uint setId) external payable { uint _amt = getUint(getId, amt); - AaveCoreInterface aaveCore = AaveCoreInterface(getAaveCoreAddress()); + AaveCoreInterface aaveCore = AaveCoreInterface(getAaveProvider().getLendingPoolCore()); ATokenInterface atoken = ATokenInterface(aaveCore.getReserveATokenAddress(token)); TokenInterface tokenContract = TokenInterface(token); @@ -158,7 +151,7 @@ contract BasicResolver is AaveHelpers { */ function borrow(address token, uint amt, uint getId, uint setId) external payable { uint _amt = getUint(getId, amt); - AaveInterface aave = AaveInterface(getAaveAddress()); + AaveInterface aave = AaveInterface(getAaveProvider().getLendingPool()); aave.borrow(token, _amt, 2, getReferralCode()); setUint(setId, _amt); @@ -177,7 +170,7 @@ contract BasicResolver is AaveHelpers { */ function payback(address token, uint amt, uint getId, uint setId) external payable { uint _amt = getUint(getId, amt); - AaveInterface aave = AaveInterface(getAaveAddress()); + AaveInterface aave = AaveInterface(getAaveProvider().getLendingPool()); if (_amt == uint(-1)) { uint fee; @@ -188,7 +181,7 @@ contract BasicResolver is AaveHelpers { if (token == getEthAddr()) { ethAmt = _amt; } else { - TokenInterface(token).approve(getAaveCoreAddress(), _amt); + TokenInterface(token).approve(getAaveProvider().getLendingPoolCore(), _amt); } aave.repay.value(ethAmt)(token, _amt, payable(address(this)));