mirror of
https://github.com/Instadapp/dsa-resolvers-deprecated.git
synced 2024-07-29 22:38:16 +00:00
Add uniswap v2 path finder algo
This commit is contained in:
parent
0911656f59
commit
191b0d0931
|
@ -85,6 +85,22 @@ contract UniswapHelpers is Helpers {
|
||||||
_sell = sell == getEthAddr() ? TokenInterface(getAddressWETH()) : TokenInterface(sell);
|
_sell = sell == getEthAddr() ? TokenInterface(getAddressWETH()) : TokenInterface(sell);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function checkPaths(
|
||||||
|
IUniswapV2Router02 router,
|
||||||
|
address[] memory paths
|
||||||
|
) internal view returns(bool isValid) {
|
||||||
|
isValid = true;
|
||||||
|
for (uint i; i < paths.length - 1; i++) {
|
||||||
|
if (paths[i] == paths[i + 1]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
address pair = IUniswapV2Factory(router.factory()).getPair(paths[i], paths[i + 1]);
|
||||||
|
if (pair == address(0)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function getExpectedBuyAmt(
|
function getExpectedBuyAmt(
|
||||||
address buyAddr,
|
address buyAddr,
|
||||||
address sellAddr,
|
address sellAddr,
|
||||||
|
@ -173,6 +189,40 @@ contract UniswapHelpers is Helpers {
|
||||||
amtA = wmul(_tokenA.balanceOf(exchangeAddr), share);
|
amtA = wmul(_tokenA.balanceOf(exchangeAddr), share);
|
||||||
amtB = wmul(_tokenB.balanceOf(exchangeAddr), share);
|
amtB = wmul(_tokenB.balanceOf(exchangeAddr), share);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function _getExpectedBuyAmtByPath(
|
||||||
|
address[] memory paths,
|
||||||
|
uint sellAmt
|
||||||
|
) internal view returns(uint buyAmt) {
|
||||||
|
IUniswapV2Router02 router = IUniswapV2Router02(getUniswapAddr());
|
||||||
|
|
||||||
|
if (checkPaths(router, paths)) {
|
||||||
|
uint[] memory amts = router.getAmountsOut(
|
||||||
|
sellAmt,
|
||||||
|
paths
|
||||||
|
);
|
||||||
|
buyAmt = amts[amts.length - 1];
|
||||||
|
} else {
|
||||||
|
buyAmt = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _getExpectedSellAmtByPath(
|
||||||
|
address[] memory paths,
|
||||||
|
uint buyAmt
|
||||||
|
) internal view returns(uint sellAmt) {
|
||||||
|
IUniswapV2Router02 router = IUniswapV2Router02(getUniswapAddr());
|
||||||
|
|
||||||
|
if (checkPaths(router, paths)) {
|
||||||
|
uint[] memory amts = router.getAmountsIn(
|
||||||
|
buyAmt,
|
||||||
|
paths
|
||||||
|
);
|
||||||
|
sellAmt = amts[0];
|
||||||
|
} else {
|
||||||
|
sellAmt = uint(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -293,6 +343,134 @@ contract Resolver is UniswapHelpers {
|
||||||
}
|
}
|
||||||
return poolData;
|
return poolData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getOptimalSellPath(
|
||||||
|
address buyAddr,
|
||||||
|
address sellAddr,
|
||||||
|
address[] memory tokens,
|
||||||
|
uint sellAmt,
|
||||||
|
uint slippage
|
||||||
|
) public view returns (address[] memory paths, uint buyAmt, uint unitAmt)
|
||||||
|
{
|
||||||
|
(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(buyAddr, sellAddr);
|
||||||
|
|
||||||
|
address[] memory _path = new address[](2);
|
||||||
|
_path[0] = address(_sellAddr);
|
||||||
|
_path[1] = address(_buyAddr);
|
||||||
|
|
||||||
|
paths = _path;
|
||||||
|
buyAmt = _getExpectedBuyAmtByPath(_path, sellAmt);
|
||||||
|
|
||||||
|
_path = new address[](3);
|
||||||
|
_path[0] = address(_sellAddr);
|
||||||
|
_path[2] = address(_buyAddr);
|
||||||
|
|
||||||
|
uint i;
|
||||||
|
uint j;
|
||||||
|
uint _buyAmt;
|
||||||
|
|
||||||
|
for(i = 0; i < tokens.length; i++) {
|
||||||
|
_path[1] = tokens[i];
|
||||||
|
|
||||||
|
_buyAmt = _getExpectedBuyAmtByPath(_path, sellAmt);
|
||||||
|
|
||||||
|
if (_buyAmt > buyAmt) {
|
||||||
|
buyAmt = _buyAmt;
|
||||||
|
paths = new address[](3);
|
||||||
|
paths[0] = _path[0];
|
||||||
|
paths[1] = _path[1];
|
||||||
|
paths[2] = _path[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_path = new address[](4);
|
||||||
|
_path[0] = address(_sellAddr);
|
||||||
|
_path[3] = address(_buyAddr);
|
||||||
|
|
||||||
|
for(i = 0; i < tokens.length; i++) {
|
||||||
|
for(j = 0; j < tokens.length; j++) {
|
||||||
|
_path[1] = tokens[i];
|
||||||
|
_path[2] = tokens[j];
|
||||||
|
|
||||||
|
_buyAmt = _getExpectedBuyAmtByPath(_path, sellAmt);
|
||||||
|
|
||||||
|
if (_buyAmt > buyAmt) {
|
||||||
|
buyAmt = _buyAmt;
|
||||||
|
paths = new address[](4);
|
||||||
|
paths[0] = _path[0];
|
||||||
|
paths[1] = _path[1];
|
||||||
|
paths[2] = _path[2];
|
||||||
|
paths[3] = _path[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unitAmt = getBuyUnitAmt(_buyAddr, buyAmt, _sellAddr, sellAmt, slippage);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOptimalBuyPath(
|
||||||
|
address buyAddr,
|
||||||
|
address sellAddr,
|
||||||
|
address[] memory tokens,
|
||||||
|
uint buyAmt,
|
||||||
|
uint slippage
|
||||||
|
) public view returns (address[] memory paths, uint sellAmt, uint unitAmt)
|
||||||
|
{
|
||||||
|
(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(buyAddr, sellAddr);
|
||||||
|
|
||||||
|
address[] memory _path = new address[](2);
|
||||||
|
_path[0] = address(_sellAddr);
|
||||||
|
_path[1] = address(_buyAddr);
|
||||||
|
|
||||||
|
paths = _path;
|
||||||
|
sellAmt = _getExpectedSellAmtByPath(_path, buyAmt);
|
||||||
|
|
||||||
|
_path = new address[](3);
|
||||||
|
_path[0] = address(_sellAddr);
|
||||||
|
_path[2] = address(_buyAddr);
|
||||||
|
|
||||||
|
uint i;
|
||||||
|
uint j;
|
||||||
|
uint _sellAmt;
|
||||||
|
|
||||||
|
for(i = 0; i < tokens.length; i++) {
|
||||||
|
_path[1] = tokens[i];
|
||||||
|
|
||||||
|
_sellAmt = _getExpectedSellAmtByPath(_path, buyAmt);
|
||||||
|
|
||||||
|
if (_sellAmt < sellAmt) {
|
||||||
|
sellAmt = _sellAmt;
|
||||||
|
paths = new address[](3);
|
||||||
|
paths[0] = _path[0];
|
||||||
|
paths[1] = _path[1];
|
||||||
|
paths[2] = _path[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_path = new address[](4);
|
||||||
|
_path[0] = address(_sellAddr);
|
||||||
|
_path[3] = address(_buyAddr);
|
||||||
|
|
||||||
|
for(i = 0; i < tokens.length; i++) {
|
||||||
|
for(j = 0; j < tokens.length; j++) {
|
||||||
|
_path[1] = tokens[i];
|
||||||
|
_path[2] = tokens[j];
|
||||||
|
|
||||||
|
_sellAmt = _getExpectedSellAmtByPath(_path, buyAmt);
|
||||||
|
|
||||||
|
if (_sellAmt < sellAmt) {
|
||||||
|
sellAmt = _sellAmt;
|
||||||
|
paths = new address[](4);
|
||||||
|
paths[0] = _path[0];
|
||||||
|
paths[1] = _path[1];
|
||||||
|
paths[2] = _path[2];
|
||||||
|
paths[3] = _path[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unitAmt = getSellUnitAmt(_sellAddr, sellAmt, _buyAddr, buyAmt, slippage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user