mirror of
				https://github.com/Instadapp/dsa-connectors.git
				synced 2024-07-29 22:37:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			154 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
| //SPDX-License-Identifier: MIT
 | |
| pragma solidity ^0.7.6;
 | |
| pragma abicoder v2;
 | |
| 
 | |
| import { TokenInterface } from "../../../common/interfaces.sol";
 | |
| import { DSMath } from "../../../common/math.sol";
 | |
| import { Basic } from "../../../common/basic.sol";
 | |
| import "./interface.sol";
 | |
| 
 | |
| abstract contract Helpers is DSMath, Basic {
 | |
| 	/**
 | |
| 	 * @dev uniswap v3 Swap Router
 | |
| 	 */
 | |
| 	ISwapRouter02 constant swapRouter =
 | |
| 		ISwapRouter02(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);
 | |
| 
 | |
| 	struct BuyInfo {
 | |
| 		address buyAddr; //token to be bought
 | |
| 		address sellAddr; //token to be sold
 | |
| 		uint24 fee; //pool fees for buyAddr-sellAddr token pair
 | |
| 		uint256 unitAmt; //The unit amount of sellAmt/buyAmt with slippage
 | |
| 		uint256 buyAmt; //amount of token to be bought
 | |
| 	}
 | |
| 
 | |
| 	struct SellInfo {
 | |
| 		address buyAddr; //token to be bought
 | |
| 		address sellAddr; //token to be sold
 | |
| 		uint24 fee; //pool fees for buyAddr-sellAddr token pair
 | |
| 		uint256 unitAmt; //The unit amount of buyAmt/sellAmt with slippage.
 | |
| 		uint256 sellAmt; //amount of token to sell
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @dev Buy Function
 | |
| 	 * @notice Swap token(sellAddr) with token(buyAddr), buy token with minimum sell token
 | |
| 	 * @param buyData Data input for the buy action
 | |
| 	 * @param getId Id to get buyAmt
 | |
| 	 * @param setId Id to store sellAmt
 | |
| 	 */
 | |
| 	function _buy(
 | |
| 		BuyInfo memory buyData,
 | |
| 		uint256 getId,
 | |
| 		uint256 setId
 | |
| 	) internal returns (string memory _eventName, bytes memory _eventParam) {
 | |
| 		uint256 _buyAmt = getUint(getId, buyData.buyAmt);
 | |
| 
 | |
| 		(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(
 | |
| 			buyData.buyAddr,
 | |
| 			buyData.sellAddr
 | |
| 		);
 | |
| 
 | |
| 		uint256 _slippageAmt = convert18ToDec(
 | |
| 			_sellAddr.decimals(),
 | |
| 			wmul(buyData.unitAmt, convertTo18(_buyAddr.decimals(), _buyAmt))
 | |
| 		);
 | |
| 		bool isEth = address(buyData.sellAddr) == ethAddr;
 | |
| 		convertEthToWeth(isEth, _sellAddr, _slippageAmt);
 | |
| 		approve(_sellAddr, address(swapRouter), _slippageAmt);
 | |
| 
 | |
| 		ExactOutputSingleParams memory params = ExactOutputSingleParams({
 | |
| 			tokenIn: address(_sellAddr),
 | |
| 			tokenOut: address(_buyAddr),
 | |
| 			fee: buyData.fee,
 | |
| 			recipient: address(this),
 | |
| 			amountOut: _buyAmt,
 | |
| 			amountInMaximum: _slippageAmt, //require(_sellAmt <= amountInMaximum)
 | |
| 			sqrtPriceLimitX96: 0
 | |
| 		});
 | |
| 
 | |
| 		uint256 _sellAmt = swapRouter.exactOutputSingle(params);
 | |
| 		require(_slippageAmt >= _sellAmt, "Too much slippage");
 | |
| 
 | |
| 		if (_slippageAmt > _sellAmt) {
 | |
| 			convertEthToWeth(isEth, _sellAddr, _slippageAmt - _sellAmt);
 | |
| 			approve(_sellAddr, address(swapRouter), 0);
 | |
| 		}
 | |
| 		isEth = address(buyData.buyAddr) == ethAddr;
 | |
| 		convertWethToEth(isEth, _buyAddr, _buyAmt);
 | |
| 
 | |
| 		setUint(setId, _sellAmt);
 | |
| 
 | |
| 		_eventName = "LogBuy(address,address,uint256,uint256,uint256,uint256)";
 | |
| 		_eventParam = abi.encode(
 | |
| 			buyData.buyAddr,
 | |
| 			buyData.sellAddr,
 | |
| 			_buyAmt,
 | |
| 			_sellAmt,
 | |
| 			getId,
 | |
| 			setId
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @dev Sell Function
 | |
| 	 * @notice Swap token(sellAddr) with token(buyAddr), to get max buy tokens
 | |
| 	 * @param sellData Data input for the sell action
 | |
| 	 * @param getId Id to get buyAmt
 | |
| 	 * @param setId Id to store sellAmt
 | |
| 	 */
 | |
| 	function _sell(
 | |
| 		SellInfo memory sellData,
 | |
| 		uint256 getId,
 | |
| 		uint256 setId
 | |
| 	) internal returns (string memory _eventName, bytes memory _eventParam) {
 | |
| 		uint256 _sellAmt = getUint(getId, sellData.sellAmt);
 | |
| 		(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(
 | |
| 			sellData.buyAddr,
 | |
| 			sellData.sellAddr
 | |
| 		);
 | |
| 
 | |
| 		if (_sellAmt == uint256(-1)) {
 | |
| 			_sellAmt = sellData.sellAddr == ethAddr
 | |
| 				? address(this).balance
 | |
| 				: _sellAddr.balanceOf(address(this));
 | |
| 		}
 | |
| 
 | |
| 		uint256 _slippageAmt = convert18ToDec(
 | |
| 			_buyAddr.decimals(),
 | |
| 			wmul(sellData.unitAmt, convertTo18(_sellAddr.decimals(), _sellAmt))
 | |
| 		);
 | |
| 
 | |
| 		bool isEth = address(sellData.sellAddr) == ethAddr;
 | |
| 		convertEthToWeth(isEth, _sellAddr, _sellAmt);
 | |
| 		approve(_sellAddr, address(swapRouter), _sellAmt);
 | |
| 		ExactInputSingleParams memory params = ExactInputSingleParams({
 | |
| 			tokenIn: address(_sellAddr),
 | |
| 			tokenOut: address(_buyAddr),
 | |
| 			fee: sellData.fee,
 | |
| 			recipient: address(this),
 | |
| 			amountIn: _sellAmt,
 | |
| 			amountOutMinimum: _slippageAmt, //require(_buyAmt >= amountOutMinimum)
 | |
| 			sqrtPriceLimitX96: 0
 | |
| 		});
 | |
| 
 | |
| 		uint256 _buyAmt = swapRouter.exactInputSingle(params);
 | |
| 		require(_slippageAmt <= _buyAmt, "Too much slippage");
 | |
| 
 | |
| 		isEth = address(sellData.buyAddr) == ethAddr;
 | |
| 		convertWethToEth(isEth, _buyAddr, _buyAmt);
 | |
| 
 | |
| 		setUint(setId, _buyAmt);
 | |
| 
 | |
| 		_eventName = "LogSell(address,address,uint256,uint256,uint256,uint256)";
 | |
| 		_eventParam = abi.encode(
 | |
| 			sellData.buyAddr,
 | |
| 			sellData.sellAddr,
 | |
| 			_buyAmt,
 | |
| 			_sellAmt,
 | |
| 			getId,
 | |
| 			setId
 | |
| 		);
 | |
| 	}
 | |
| }
 | 
