mirror of
https://github.com/Instadapp/aave-protocol-v2.git
synced 2024-07-29 21:47:30 +00:00
Add view method to estimate swaps outputs
This commit is contained in:
parent
96e74cf707
commit
e5d37e1a8c
|
@ -42,6 +42,48 @@ contract BaseUniswapAdapter {
|
||||||
uniswapRouter = _uniswapRouter;
|
uniswapRouter = _uniswapRouter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Given an input asset amount, returns the maximum output amount of the other asset
|
||||||
|
* @param amountIn Amount of reserveIn
|
||||||
|
* @param reserveIn Address of the asset to be swap from
|
||||||
|
* @param reserveOut Address of the asset to be swap to
|
||||||
|
* @return uint256 amountOut
|
||||||
|
*/
|
||||||
|
function getAmountOut(uint256 amountIn, address reserveIn, address reserveOut)
|
||||||
|
public
|
||||||
|
view
|
||||||
|
returns (uint256)
|
||||||
|
{
|
||||||
|
address[] memory path = new address[](2);
|
||||||
|
path[0] = reserveIn;
|
||||||
|
path[1] = reserveOut;
|
||||||
|
|
||||||
|
uint256[] memory amounts = uniswapRouter.getAmountsOut(amountIn, path);
|
||||||
|
|
||||||
|
return amounts[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Returns the minimum input asset amount required to buy the given output asset amount
|
||||||
|
* @param amountOut Amount of reserveOut
|
||||||
|
* @param reserveIn Address of the asset to be swap from
|
||||||
|
* @param reserveOut Address of the asset to be swap to
|
||||||
|
* @return uint256 amountIn
|
||||||
|
*/
|
||||||
|
function getAmountIn(uint256 amountOut, address reserveIn, address reserveOut)
|
||||||
|
public
|
||||||
|
view
|
||||||
|
returns (uint256)
|
||||||
|
{
|
||||||
|
address[] memory path = new address[](2);
|
||||||
|
path[0] = reserveIn;
|
||||||
|
path[1] = reserveOut;
|
||||||
|
|
||||||
|
uint256[] memory amounts = uniswapRouter.getAmountsIn(amountOut, path);
|
||||||
|
|
||||||
|
return amounts[0];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dev Swaps an `amountToSwap` of an asset to another
|
* @dev Swaps an `amountToSwap` of an asset to another
|
||||||
* @param assetToSwapFrom Origin asset
|
* @param assetToSwapFrom Origin asset
|
||||||
|
@ -191,7 +233,27 @@ contract BaseUniswapAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dev Take action with the swap left overs as configured in the parameters
|
* @dev Pull the ATokens from the user
|
||||||
|
* @param reserve address of the asset
|
||||||
|
* @param user address
|
||||||
|
* @param amount of tokens to be transferred to the contract
|
||||||
|
*/
|
||||||
|
function pullAToken(
|
||||||
|
address reserve,
|
||||||
|
address user,
|
||||||
|
uint256 amount
|
||||||
|
) internal {
|
||||||
|
address reserveAToken = getAToken(reserve);
|
||||||
|
|
||||||
|
// transfer from user to adapter
|
||||||
|
IERC20(reserveAToken).safeTransferFrom(user, address(this), amount);
|
||||||
|
|
||||||
|
// withdraw reserve
|
||||||
|
pool.withdraw(reserve, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev Pull the ATokens from the user and use them to repay the flashloan
|
||||||
* @param reserve address of the asset
|
* @param reserve address of the asset
|
||||||
* @param user address
|
* @param user address
|
||||||
* @param flashLoanDebt need to be repaid
|
* @param flashLoanDebt need to be repaid
|
||||||
|
@ -201,13 +263,7 @@ contract BaseUniswapAdapter {
|
||||||
address user,
|
address user,
|
||||||
uint256 flashLoanDebt
|
uint256 flashLoanDebt
|
||||||
) internal {
|
) internal {
|
||||||
address reserveAToken = getAToken(reserve);
|
pullAToken(reserve, user, flashLoanDebt);
|
||||||
|
|
||||||
// transfer from user to adapter
|
|
||||||
IERC20(reserveAToken).safeTransferFrom(user, address(this), flashLoanDebt);
|
|
||||||
|
|
||||||
// withdraw reserve
|
|
||||||
pool.withdraw(reserve, flashLoanDebt);
|
|
||||||
|
|
||||||
// Repay flashloan
|
// Repay flashloan
|
||||||
IERC20(reserve).approve(address(pool), flashLoanDebt);
|
IERC20(reserve).approve(address(pool), flashLoanDebt);
|
||||||
|
|
|
@ -17,4 +17,8 @@ interface IUniswapV2Router02 {
|
||||||
address to,
|
address to,
|
||||||
uint deadline
|
uint deadline
|
||||||
) external returns (uint256[] memory amounts);
|
) external returns (uint256[] memory amounts);
|
||||||
|
|
||||||
|
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
|
||||||
|
|
||||||
|
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@ import {MintableERC20} from '../tokens/MintableERC20.sol';
|
||||||
contract MockUniswapV2Router02 is IUniswapV2Router02 {
|
contract MockUniswapV2Router02 is IUniswapV2Router02 {
|
||||||
uint256 internal _amountToReturn;
|
uint256 internal _amountToReturn;
|
||||||
uint256 internal _amountToSwap;
|
uint256 internal _amountToSwap;
|
||||||
|
mapping(address => mapping(address => mapping(uint256 => uint256))) internal _amountsIn;
|
||||||
|
mapping(address => mapping(address => mapping(uint256 => uint256))) internal _amountsOut;
|
||||||
|
|
||||||
function setAmountToReturn(uint256 amount) public {
|
function setAmountToReturn(uint256 amount) public {
|
||||||
_amountToReturn = amount;
|
_amountToReturn = amount;
|
||||||
|
@ -35,8 +37,8 @@ contract MockUniswapV2Router02 is IUniswapV2Router02 {
|
||||||
}
|
}
|
||||||
|
|
||||||
function swapTokensForExactTokens(
|
function swapTokensForExactTokens(
|
||||||
uint amountOut,
|
uint /* amountOut */,
|
||||||
uint amountInMax,
|
uint /* amountInMax */,
|
||||||
address[] calldata path,
|
address[] calldata path,
|
||||||
address to,
|
address to,
|
||||||
uint /* deadline */
|
uint /* deadline */
|
||||||
|
@ -50,4 +52,26 @@ contract MockUniswapV2Router02 is IUniswapV2Router02 {
|
||||||
amounts[0] = _amountToSwap;
|
amounts[0] = _amountToSwap;
|
||||||
amounts[1] = _amountToReturn;
|
amounts[1] = _amountToReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setAmountOut(uint amountIn, address reserveIn, address reserveOut, uint amountOut) public {
|
||||||
|
_amountsOut[reserveIn][reserveOut][amountIn] = amountOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setAmountIn(uint amountOut, address reserveIn, address reserveOut, uint amountIn) public {
|
||||||
|
_amountsIn[reserveIn][reserveOut][amountOut] = amountIn;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAmountsOut(uint amountIn, address[] calldata path) external view override returns (uint[] memory) {
|
||||||
|
uint256[] memory amounts = new uint256[](2);
|
||||||
|
amounts[0] = amountIn;
|
||||||
|
amounts[1] = _amountsOut[path[0]][path[1]][amountIn];
|
||||||
|
return amounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAmountsIn(uint amountOut, address[] calldata path) external view override returns (uint[] memory) {
|
||||||
|
uint256[] memory amounts = new uint256[](2);
|
||||||
|
amounts[0] = _amountsIn[path[0]][path[1]][amountOut];
|
||||||
|
amounts[1] = amountOut;
|
||||||
|
return amounts;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user