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); | ||||
|     } | ||||
| 
 | ||||
|     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( | ||||
|         address buyAddr, | ||||
|         address sellAddr, | ||||
|  | @ -173,6 +189,40 @@ contract UniswapHelpers is Helpers { | |||
|         amtA = wmul(_tokenA.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; | ||||
|     } | ||||
| 
 | ||||
|     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
	 Mubaris NK
						Mubaris NK