mirror of
https://github.com/Instadapp/aave-protocol-v2.git
synced 2024-07-29 21:47:30 +00:00
Added deadline, implemented deposit and repay withPermit functions
This commit is contained in:
parent
566f9b1a5d
commit
6810940c9f
|
@ -263,6 +263,7 @@ interface ILendingPool {
|
||||||
uint256 amount,
|
uint256 amount,
|
||||||
address onBehalfOf,
|
address onBehalfOf,
|
||||||
uint16 referralCode,
|
uint16 referralCode,
|
||||||
|
uint256 deadline,
|
||||||
uint8 permitV,
|
uint8 permitV,
|
||||||
bytes32 permitR,
|
bytes32 permitR,
|
||||||
bytes32 permitS
|
bytes32 permitS
|
||||||
|
@ -288,6 +289,7 @@ interface ILendingPool {
|
||||||
uint256 amount,
|
uint256 amount,
|
||||||
uint256 rateMode,
|
uint256 rateMode,
|
||||||
address onBehalfOf,
|
address onBehalfOf,
|
||||||
|
uint256 deadline,
|
||||||
uint8 permitV,
|
uint8 permitV,
|
||||||
bytes32 permitR,
|
bytes32 permitR,
|
||||||
bytes32 permitS
|
bytes32 permitS
|
||||||
|
|
|
@ -4,6 +4,7 @@ pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
import {SafeMath} from '../../dependencies/openzeppelin/contracts/SafeMath.sol';
|
import {SafeMath} from '../../dependencies/openzeppelin/contracts/SafeMath.sol';
|
||||||
import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol';
|
import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol';
|
||||||
|
import {IERC20WithPermit} from '../../interfaces/IERC20WithPermit.sol';
|
||||||
import {SafeERC20} from '../../dependencies/openzeppelin/contracts/SafeERC20.sol';
|
import {SafeERC20} from '../../dependencies/openzeppelin/contracts/SafeERC20.sol';
|
||||||
import {Address} from '../../dependencies/openzeppelin/contracts/Address.sol';
|
import {Address} from '../../dependencies/openzeppelin/contracts/Address.sol';
|
||||||
import {ILendingPoolAddressesProvider} from '../../interfaces/ILendingPoolAddressesProvider.sol';
|
import {ILendingPoolAddressesProvider} from '../../interfaces/ILendingPoolAddressesProvider.sol';
|
||||||
|
@ -107,25 +108,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
|
||||||
address onBehalfOf,
|
address onBehalfOf,
|
||||||
uint16 referralCode
|
uint16 referralCode
|
||||||
) external override whenNotPaused {
|
) external override whenNotPaused {
|
||||||
DataTypes.ReserveData storage reserve = _reserves[asset];
|
_executeDeposit(asset, amount, onBehalfOf, referralCode);
|
||||||
|
|
||||||
ValidationLogic.validateDeposit(reserve, amount);
|
|
||||||
|
|
||||||
address aToken = reserve.aTokenAddress;
|
|
||||||
|
|
||||||
reserve.updateState();
|
|
||||||
reserve.updateInterestRates(asset, aToken, amount, 0);
|
|
||||||
|
|
||||||
IERC20(asset).safeTransferFrom(msg.sender, aToken, amount);
|
|
||||||
|
|
||||||
bool isFirstDeposit = IAToken(aToken).mint(onBehalfOf, amount, reserve.liquidityIndex);
|
|
||||||
|
|
||||||
if (isFirstDeposit) {
|
|
||||||
_usersConfig[onBehalfOf].setUsingAsCollateral(reserve.id, true);
|
|
||||||
emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf);
|
|
||||||
}
|
|
||||||
|
|
||||||
emit Deposit(asset, msg.sender, onBehalfOf, amount, referralCode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -254,6 +237,63 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
|
||||||
emit Swap(asset, msg.sender, rateMode);
|
emit Swap(asset, msg.sender, rateMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @notice Deposit with transfer approval of asset to be deposited done via permit function
|
||||||
|
* see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713
|
||||||
|
* @param asset The address of the underlying asset to deposit
|
||||||
|
* @param amount The amount to be deposited
|
||||||
|
* @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user
|
||||||
|
* wants to receive them on his own wallet, or a different address if the beneficiary of aTokens
|
||||||
|
* is a different wallet
|
||||||
|
* @param referralCode Code used to register the integrator originating the operation, for potential rewards.
|
||||||
|
* 0 if the action is executed directly by the user, without any middle-man
|
||||||
|
* @param permitV V parameter of ERC712 permit sig
|
||||||
|
* @param permitR R parameter of ERC712 permit sig
|
||||||
|
* @param permitS S parameter of ERC712 permit sig
|
||||||
|
**/
|
||||||
|
function depositWithPermit(
|
||||||
|
address asset,
|
||||||
|
uint256 amount,
|
||||||
|
address onBehalfOf,
|
||||||
|
uint16 referralCode,
|
||||||
|
uint256 deadline,
|
||||||
|
uint8 permitV,
|
||||||
|
bytes32 permitR,
|
||||||
|
bytes32 permitS
|
||||||
|
) external override {
|
||||||
|
IERC20WithPermit(asset).permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS);
|
||||||
|
_executeDeposit(asset, amount, onBehalfOf, referralCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @notice Repay with transfer approval of asset to be repaid done via permit function
|
||||||
|
* see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713
|
||||||
|
* @param asset The address of the borrowed underlying asset previously borrowed
|
||||||
|
* @param amount The amount to repay
|
||||||
|
* - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode`
|
||||||
|
* @param rateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable
|
||||||
|
* @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the
|
||||||
|
* user calling the function if he wants to reduce/remove his own debt, or the address of any other
|
||||||
|
* other borrower whose debt should be removed
|
||||||
|
* @param permitV V parameter of ERC712 permit sig
|
||||||
|
* @param permitR R parameter of ERC712 permit sig
|
||||||
|
* @param permitS S parameter of ERC712 permit sig
|
||||||
|
* @return The final amount repaid
|
||||||
|
**/
|
||||||
|
function repayWithPermit(
|
||||||
|
address asset,
|
||||||
|
uint256 amount,
|
||||||
|
uint256 rateMode,
|
||||||
|
address onBehalfOf,
|
||||||
|
uint256 deadline,
|
||||||
|
uint8 permitV,
|
||||||
|
bytes32 permitR,
|
||||||
|
bytes32 permitS
|
||||||
|
) external override returns (uint256) {
|
||||||
|
IERC20WithPermit(asset).permit(msg.sender, address(this), amount, deadline, permitV, permitR, permitS);
|
||||||
|
return _executeRepay(asset, amount, rateMode, onBehalfOf);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dev Rebalances the stable interest rate of a user to the current stable rate defined on the reserve.
|
* @dev Rebalances the stable interest rate of a user to the current stable rate defined on the reserve.
|
||||||
* - Users can be rebalanced if the following conditions are satisfied:
|
* - Users can be rebalanced if the following conditions are satisfied:
|
||||||
|
@ -845,6 +885,33 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function _executeDeposit(
|
||||||
|
address asset,
|
||||||
|
uint256 amount,
|
||||||
|
address onBehalfOf,
|
||||||
|
uint16 referralCode
|
||||||
|
) internal {
|
||||||
|
DataTypes.ReserveData storage reserve = _reserves[asset];
|
||||||
|
|
||||||
|
ValidationLogic.validateDeposit(reserve, amount);
|
||||||
|
|
||||||
|
address aToken = reserve.aTokenAddress;
|
||||||
|
|
||||||
|
reserve.updateState();
|
||||||
|
reserve.updateInterestRates(asset, aToken, amount, 0);
|
||||||
|
|
||||||
|
IERC20(asset).safeTransferFrom(msg.sender, aToken, amount);
|
||||||
|
|
||||||
|
bool isFirstDeposit = IAToken(aToken).mint(onBehalfOf, amount, reserve.liquidityIndex);
|
||||||
|
|
||||||
|
if (isFirstDeposit) {
|
||||||
|
_usersConfig[onBehalfOf].setUsingAsCollateral(reserve.id, true);
|
||||||
|
emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf);
|
||||||
|
}
|
||||||
|
|
||||||
|
emit Deposit(asset, msg.sender, onBehalfOf, amount, referralCode);
|
||||||
|
}
|
||||||
|
|
||||||
function _executeWithdraw(
|
function _executeWithdraw(
|
||||||
address asset,
|
address asset,
|
||||||
uint256 amount,
|
uint256 amount,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user