mirror of
				https://github.com/Instadapp/dsa-connectors.git
				synced 2024-07-29 22:37:00 +00:00 
			
		
		
		
	updated check for slippage
This commit is contained in:
		
							parent
							
								
									e8bdf16774
								
							
						
					
					
						commit
						6c95281b8c
					
				| 
						 | 
				
			
			@ -18,10 +18,19 @@ abstract contract Helpers is DSMath, Basic {
 | 
			
		|||
		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 expectedAmt;	//The amount that is expected to be returned after the swap
 | 
			
		||||
		uint256 unitAmt;		//The unit amount of sellAmt/buyAmt with slippage
 | 
			
		||||
		uint256 buyAmt;			//amount of token to be bought
 | 
			
		||||
		uint256 getId;			//Id to get buyAmt
 | 
			
		||||
		uint256 setId;			//Id to store sellAmt
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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 be bought
 | 
			
		||||
		uint256 getId;			//Id to get buyAmt
 | 
			
		||||
		uint256 setId;			//Id to store sellAmt
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ import {Events} from "./events.sol";
 | 
			
		|||
import "./interface.sol";
 | 
			
		||||
 | 
			
		||||
abstract contract UniswapResolver is Helpers, Events {
 | 
			
		||||
	/**
 | 
			
		||||
    /**
 | 
			
		||||
	 * @dev Buy Function
 | 
			
		||||
	 * @notice Swap token(sellAddr) with token(buyAddr), buy token with minimum sell token
 | 
			
		||||
	 * @param buyData Data input for the buy action
 | 
			
		||||
| 
						 | 
				
			
			@ -26,22 +26,19 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
		returns (string memory _eventName, bytes memory _eventParam)
 | 
			
		||||
	{
 | 
			
		||||
		uint256 _buyAmt = getUint(buyData.getId, buyData.buyAmt);
 | 
			
		||||
		ISwapRouter.ExactOutputSingleParams memory params;
 | 
			
		||||
		
 | 
			
		||||
		(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(
 | 
			
		||||
			buyData.buyAddr,
 | 
			
		||||
			buyData.sellAddr
 | 
			
		||||
		);
 | 
			
		||||
		
 | 
			
		||||
		{
 | 
			
		||||
			uint _slippageAmt = convert18ToDec(_sellAddr.decimals(),
 | 
			
		||||
				wmul(buyData.unitAmt, convertTo18(_buyAddr.decimals(), _buyAmt))
 | 
			
		||||
			);
 | 
			
		||||
			require(_slippageAmt >= buyData.expectedAmt, "Too much slippage");
 | 
			
		||||
		}		
 | 
			
		||||
 | 
			
		||||
		uint _slippageAmt = convert18ToDec(_sellAddr.decimals(),
 | 
			
		||||
			wmul(buyData.unitAmt, convertTo18(_buyAddr.decimals(), _buyAmt))
 | 
			
		||||
		);		
 | 
			
		||||
		bool isEth = address(_sellAddr) == wethAddr;
 | 
			
		||||
		convertEthToWeth(isEth, _sellAddr, uint256(-1));
 | 
			
		||||
		approve(_sellAddr, address(swapRouter), uint256(-1));
 | 
			
		||||
		ISwapRouter.ExactOutputSingleParams memory params;
 | 
			
		||||
		convertEthToWeth(isEth, _sellAddr, _slippageAmt);
 | 
			
		||||
		approve(_sellAddr, address(swapRouter), _slippageAmt);
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			params = ISwapRouter.ExactOutputSingleParams({
 | 
			
		||||
| 
						 | 
				
			
			@ -51,12 +48,13 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
				recipient: address(this),
 | 
			
		||||
				deadline: block.timestamp + 1,
 | 
			
		||||
				amountOut: _buyAmt,
 | 
			
		||||
				amountInMaximum: buyData.expectedAmt,
 | 
			
		||||
				amountInMaximum: _slippageAmt,
 | 
			
		||||
				sqrtPriceLimitX96: 0
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint256 _sellAmt = swapRouter.exactOutputSingle(params);
 | 
			
		||||
		require(_slippageAmt >= _sellAmt, "Too much slippage");
 | 
			
		||||
 | 
			
		||||
		isEth = address(_buyAddr) == wethAddr;
 | 
			
		||||
		convertWethToEth(isEth, _buyAddr, _buyAmt);
 | 
			
		||||
| 
						 | 
				
			
			@ -76,42 +74,31 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Sell Function
 | 
			
		||||
	 * @notice Swap token(sellAddr) with token(buyAddr), sell token to get maximum amount of buy token
 | 
			
		||||
	 * @param buyAddr token to be bought
 | 
			
		||||
	 * @param sellAddr token to be sold
 | 
			
		||||
	 * @param fee pool fees for buyAddr-sellAddr token pair
 | 
			
		||||
	 * @param sellAmt amount of token to be sold
 | 
			
		||||
	 * @param getId Id to get sellAmount
 | 
			
		||||
	 * @param setId Id to store buyAmount
 | 
			
		||||
	 * @notice Swap token(sellAddr) with token(buyAddr), to get max buy tokens
 | 
			
		||||
	 * @param sellData Data input for the buy action
 | 
			
		||||
	 */
 | 
			
		||||
	function sell(
 | 
			
		||||
		address buyAddr,
 | 
			
		||||
		address sellAddr,
 | 
			
		||||
		uint24 fee,
 | 
			
		||||
		uint256 sellAmt,
 | 
			
		||||
		uint256 getId,
 | 
			
		||||
		uint256 setId
 | 
			
		||||
		SellInfo memory sellData
 | 
			
		||||
	)
 | 
			
		||||
		external
 | 
			
		||||
		payable
 | 
			
		||||
		returns (string memory _eventName, bytes memory _eventParam)
 | 
			
		||||
	{
 | 
			
		||||
		uint256 _sellAmt = getUint(getId, sellAmt);
 | 
			
		||||
		uint256 _sellAmt = getUint(sellData.getId, sellData.sellAmt);
 | 
			
		||||
		(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(
 | 
			
		||||
			buyAddr,
 | 
			
		||||
			sellAddr
 | 
			
		||||
			sellData.buyAddr,
 | 
			
		||||
			sellData.sellAddr
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		if (_sellAmt == uint256(-1)) {
 | 
			
		||||
			_sellAmt = sellAddr == ethAddr
 | 
			
		||||
		if (_sellAmt == uint256(-1)) {						//change uint256(-1)
 | 
			
		||||
			_sellAmt = sellData.sellAddr == ethAddr
 | 
			
		||||
				? address(this).balance
 | 
			
		||||
				: _sellAddr.balanceOf(address(this));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// uint _slippageAmt = convert18ToDec(_buyAddr.decimals(),
 | 
			
		||||
		//     wmul(unitAmt, convertTo18(_sellAddr.decimals(), _sellAmt))
 | 
			
		||||
		// );
 | 
			
		||||
		// require(_slippageAmt <= _expectedAmt, "Too much slippage");
 | 
			
		||||
		uint _slippageAmt = convert18ToDec(_buyAddr.decimals(),
 | 
			
		||||
		    wmul(sellData.unitAmt, convertTo18(_sellAddr.decimals(), _sellAmt))
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		bool isEth = address(_sellAddr) == wethAddr;
 | 
			
		||||
		convertEthToWeth(isEth, _sellAddr, _sellAmt);
 | 
			
		||||
| 
						 | 
				
			
			@ -120,32 +107,33 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
 | 
			
		||||
		{
 | 
			
		||||
			params = ISwapRouter.ExactInputSingleParams({
 | 
			
		||||
				tokenIn: sellAddr,
 | 
			
		||||
				tokenOut: buyAddr,
 | 
			
		||||
				fee: fee,
 | 
			
		||||
				tokenIn: sellData.sellAddr,
 | 
			
		||||
				tokenOut: sellData.buyAddr,
 | 
			
		||||
				fee: sellData.fee,
 | 
			
		||||
				recipient: address(this),
 | 
			
		||||
				deadline: block.timestamp + 1,
 | 
			
		||||
				amountIn: _sellAmt,
 | 
			
		||||
				amountOutMinimum: 0,
 | 
			
		||||
				amountOutMinimum: _slippageAmt,
 | 
			
		||||
				sqrtPriceLimitX96: 0
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint256 _buyAmt = swapRouter.exactInputSingle(params);
 | 
			
		||||
		require(_slippageAmt <= _buyAmt, "Too much slippage");
 | 
			
		||||
 | 
			
		||||
		isEth = address(_buyAddr) == wethAddr;
 | 
			
		||||
		convertWethToEth(isEth, _buyAddr, _buyAmt);
 | 
			
		||||
 | 
			
		||||
		setUint(setId, _buyAmt);
 | 
			
		||||
		setUint(sellData.setId, _buyAmt);
 | 
			
		||||
 | 
			
		||||
		_eventName = "LogSell(address,address,uint256,uint256,uint256,uint256)";
 | 
			
		||||
		_eventParam = abi.encode(
 | 
			
		||||
			buyAddr,
 | 
			
		||||
			sellAddr,
 | 
			
		||||
			sellData.buyAddr,
 | 
			
		||||
			sellData.sellAddr,
 | 
			
		||||
			_buyAmt,
 | 
			
		||||
			_sellAmt,
 | 
			
		||||
			getId,
 | 
			
		||||
			setId
 | 
			
		||||
			sellData.getId,
 | 
			
		||||
			sellData.setId
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,10 +18,19 @@ abstract contract Helpers is DSMath, Basic {
 | 
			
		|||
		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 expectedAmt;	//The amount that is expected to be returned after the swap
 | 
			
		||||
		uint256 unitAmt;		//The unit amount of sellAmt/buyAmt with slippage
 | 
			
		||||
		uint256 buyAmt;			//amount of token to be bought
 | 
			
		||||
		uint256 getId;			//Id to get buyAmt
 | 
			
		||||
		uint256 setId;			//Id to store sellAmt
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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 be bought
 | 
			
		||||
		uint256 getId;			//Id to get buyAmt
 | 
			
		||||
		uint256 setId;			//Id to store sellAmt
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ import {Events} from "./events.sol";
 | 
			
		|||
import "./interface.sol";
 | 
			
		||||
 | 
			
		||||
abstract contract UniswapResolver is Helpers, Events {
 | 
			
		||||
	/**
 | 
			
		||||
    /**
 | 
			
		||||
	 * @dev Buy Function
 | 
			
		||||
	 * @notice Swap token(sellAddr) with token(buyAddr), buy token with minimum sell token
 | 
			
		||||
	 * @param buyData Data input for the buy action
 | 
			
		||||
| 
						 | 
				
			
			@ -26,22 +26,21 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
		returns (string memory _eventName, bytes memory _eventParam)
 | 
			
		||||
	{
 | 
			
		||||
		uint256 _buyAmt = getUint(buyData.getId, buyData.buyAmt);
 | 
			
		||||
		uint _slippageAmt;
 | 
			
		||||
		bool isEth;
 | 
			
		||||
		ISwapRouter.ExactOutputSingleParams memory params;
 | 
			
		||||
		
 | 
			
		||||
		(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(
 | 
			
		||||
			buyData.buyAddr,
 | 
			
		||||
			buyData.sellAddr
 | 
			
		||||
		);
 | 
			
		||||
		
 | 
			
		||||
		{
 | 
			
		||||
			uint _slippageAmt = convert18ToDec(_sellAddr.decimals(),
 | 
			
		||||
				wmul(buyData.unitAmt, convertTo18(_buyAddr.decimals(), _buyAmt))
 | 
			
		||||
			);
 | 
			
		||||
			require(_slippageAmt >= buyData.expectedAmt, "Too much slippage");
 | 
			
		||||
		}		
 | 
			
		||||
 | 
			
		||||
		bool isEth = address(_sellAddr) == wethAddr;
 | 
			
		||||
		convertEthToWeth(isEth, _sellAddr, uint256(-1));
 | 
			
		||||
		approve(_sellAddr, address(swapRouter), uint256(-1));
 | 
			
		||||
		ISwapRouter.ExactOutputSingleParams memory params;
 | 
			
		||||
		_slippageAmt = convert18ToDec(_sellAddr.decimals(),
 | 
			
		||||
			wmul(buyData.unitAmt, convertTo18(_buyAddr.decimals(), _buyAmt))
 | 
			
		||||
		);		
 | 
			
		||||
		isEth = address(_sellAddr) == wethAddr;
 | 
			
		||||
		convertEthToWeth(isEth, _sellAddr, _slippageAmt);
 | 
			
		||||
		approve(_sellAddr, address(swapRouter), _slippageAmt);
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			params = ISwapRouter.ExactOutputSingleParams({
 | 
			
		||||
| 
						 | 
				
			
			@ -51,12 +50,13 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
				recipient: address(this),
 | 
			
		||||
				deadline: block.timestamp + 1,
 | 
			
		||||
				amountOut: _buyAmt,
 | 
			
		||||
				amountInMaximum: buyData.expectedAmt,
 | 
			
		||||
				amountInMaximum: _slippageAmt,
 | 
			
		||||
				sqrtPriceLimitX96: 0
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint256 _sellAmt = swapRouter.exactOutputSingle(params);
 | 
			
		||||
		require(_slippageAmt >= _sellAmt, "Too much slippage");
 | 
			
		||||
 | 
			
		||||
		isEth = address(_buyAddr) == wethAddr;
 | 
			
		||||
		convertWethToEth(isEth, _buyAddr, _buyAmt);
 | 
			
		||||
| 
						 | 
				
			
			@ -76,42 +76,31 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Sell Function
 | 
			
		||||
	 * @notice Swap token(sellAddr) with token(buyAddr), sell token to get maximum amount of buy token
 | 
			
		||||
	 * @param buyAddr token to be bought
 | 
			
		||||
	 * @param sellAddr token to be sold
 | 
			
		||||
	 * @param fee pool fees for buyAddr-sellAddr token pair
 | 
			
		||||
	 * @param sellAmt amount of token to be sold
 | 
			
		||||
	 * @param getId Id to get sellAmount
 | 
			
		||||
	 * @param setId Id to store buyAmount
 | 
			
		||||
	 * @notice Swap token(sellAddr) with token(buyAddr), to get max buy tokens
 | 
			
		||||
	 * @param sellData Data input for the buy action
 | 
			
		||||
	 */
 | 
			
		||||
	function sell(
 | 
			
		||||
		address buyAddr,
 | 
			
		||||
		address sellAddr,
 | 
			
		||||
		uint24 fee,
 | 
			
		||||
		uint256 sellAmt,
 | 
			
		||||
		uint256 getId,
 | 
			
		||||
		uint256 setId
 | 
			
		||||
		SellInfo memory sellData
 | 
			
		||||
	)
 | 
			
		||||
		external
 | 
			
		||||
		payable
 | 
			
		||||
		returns (string memory _eventName, bytes memory _eventParam)
 | 
			
		||||
	{
 | 
			
		||||
		uint256 _sellAmt = getUint(getId, sellAmt);
 | 
			
		||||
		uint256 _sellAmt = getUint(sellData.getId, sellData.sellAmt);
 | 
			
		||||
		(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(
 | 
			
		||||
			buyAddr,
 | 
			
		||||
			sellAddr
 | 
			
		||||
			sellData.buyAddr,
 | 
			
		||||
			sellData.sellAddr
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		if (_sellAmt == uint256(-1)) {
 | 
			
		||||
			_sellAmt = sellAddr == ethAddr
 | 
			
		||||
		if (_sellAmt == uint256(-1)) {						//change uint256(-1)
 | 
			
		||||
			_sellAmt = sellData.sellAddr == ethAddr
 | 
			
		||||
				? address(this).balance
 | 
			
		||||
				: _sellAddr.balanceOf(address(this));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// uint _slippageAmt = convert18ToDec(_buyAddr.decimals(),
 | 
			
		||||
		//     wmul(unitAmt, convertTo18(_sellAddr.decimals(), _sellAmt))
 | 
			
		||||
		// );
 | 
			
		||||
		// require(_slippageAmt <= _expectedAmt, "Too much slippage");
 | 
			
		||||
		uint _slippageAmt = convert18ToDec(_buyAddr.decimals(),
 | 
			
		||||
		    wmul(sellData.unitAmt, convertTo18(_sellAddr.decimals(), _sellAmt))
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		bool isEth = address(_sellAddr) == wethAddr;
 | 
			
		||||
		convertEthToWeth(isEth, _sellAddr, _sellAmt);
 | 
			
		||||
| 
						 | 
				
			
			@ -120,32 +109,33 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
 | 
			
		||||
		{
 | 
			
		||||
			params = ISwapRouter.ExactInputSingleParams({
 | 
			
		||||
				tokenIn: sellAddr,
 | 
			
		||||
				tokenOut: buyAddr,
 | 
			
		||||
				fee: fee,
 | 
			
		||||
				tokenIn: sellData.sellAddr,
 | 
			
		||||
				tokenOut: sellData.buyAddr,
 | 
			
		||||
				fee: sellData.fee,
 | 
			
		||||
				recipient: address(this),
 | 
			
		||||
				deadline: block.timestamp + 1,
 | 
			
		||||
				amountIn: _sellAmt,
 | 
			
		||||
				amountOutMinimum: 0,
 | 
			
		||||
				amountOutMinimum: _slippageAmt,
 | 
			
		||||
				sqrtPriceLimitX96: 0
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint256 _buyAmt = swapRouter.exactInputSingle(params);
 | 
			
		||||
		require(_slippageAmt <= _buyAmt, "Too much slippage");
 | 
			
		||||
 | 
			
		||||
		isEth = address(_buyAddr) == wethAddr;
 | 
			
		||||
		convertWethToEth(isEth, _buyAddr, _buyAmt);
 | 
			
		||||
 | 
			
		||||
		setUint(setId, _buyAmt);
 | 
			
		||||
		setUint(sellData.setId, _buyAmt);
 | 
			
		||||
 | 
			
		||||
		_eventName = "LogSell(address,address,uint256,uint256,uint256,uint256)";
 | 
			
		||||
		_eventParam = abi.encode(
 | 
			
		||||
			buyAddr,
 | 
			
		||||
			sellAddr,
 | 
			
		||||
			sellData.buyAddr,
 | 
			
		||||
			sellData.sellAddr,
 | 
			
		||||
			_buyAmt,
 | 
			
		||||
			_sellAmt,
 | 
			
		||||
			getId,
 | 
			
		||||
			setId
 | 
			
		||||
			sellData.getId,
 | 
			
		||||
			sellData.setId
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,10 +18,19 @@ abstract contract Helpers is DSMath, Basic {
 | 
			
		|||
		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 expectedAmt;	//The amount that is expected to be returned after the swap
 | 
			
		||||
		uint256 unitAmt;		//The unit amount of sellAmt/buyAmt with slippage
 | 
			
		||||
		uint256 buyAmt;			//amount of token to be bought
 | 
			
		||||
		uint256 getId;			//Id to get buyAmt
 | 
			
		||||
		uint256 setId;			//Id to store sellAmt
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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 sellAmt/buyAmt with slippage
 | 
			
		||||
		uint256 sellAmt;		//amount of token to be bought
 | 
			
		||||
		uint256 getId;			//Id to get buyAmt
 | 
			
		||||
		uint256 setId;			//Id to store sellAmt
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ import {Events} from "./events.sol";
 | 
			
		|||
import "./interface.sol";
 | 
			
		||||
 | 
			
		||||
abstract contract UniswapResolver is Helpers, Events {
 | 
			
		||||
	/**
 | 
			
		||||
    /**
 | 
			
		||||
	 * @dev Buy Function
 | 
			
		||||
	 * @notice Swap token(sellAddr) with token(buyAddr), buy token with minimum sell token
 | 
			
		||||
	 * @param buyData Data input for the buy action
 | 
			
		||||
| 
						 | 
				
			
			@ -26,22 +26,21 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
		returns (string memory _eventName, bytes memory _eventParam)
 | 
			
		||||
	{
 | 
			
		||||
		uint256 _buyAmt = getUint(buyData.getId, buyData.buyAmt);
 | 
			
		||||
		uint _slippageAmt;
 | 
			
		||||
		bool isEth;
 | 
			
		||||
		ISwapRouter.ExactOutputSingleParams memory params;
 | 
			
		||||
		
 | 
			
		||||
		(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(
 | 
			
		||||
			buyData.buyAddr,
 | 
			
		||||
			buyData.sellAddr
 | 
			
		||||
		);
 | 
			
		||||
		
 | 
			
		||||
		{
 | 
			
		||||
			uint _slippageAmt = convert18ToDec(_sellAddr.decimals(),
 | 
			
		||||
				wmul(buyData.unitAmt, convertTo18(_buyAddr.decimals(), _buyAmt))
 | 
			
		||||
			);
 | 
			
		||||
			require(_slippageAmt >= buyData.expectedAmt, "Too much slippage");
 | 
			
		||||
		}		
 | 
			
		||||
 | 
			
		||||
		bool isEth = address(_sellAddr) == wethAddr;
 | 
			
		||||
		convertEthToWeth(isEth, _sellAddr, uint256(-1));
 | 
			
		||||
		approve(_sellAddr, address(swapRouter), uint256(-1));
 | 
			
		||||
		ISwapRouter.ExactOutputSingleParams memory params;
 | 
			
		||||
		_slippageAmt = convert18ToDec(_sellAddr.decimals(),
 | 
			
		||||
			wmul(buyData.unitAmt, convertTo18(_buyAddr.decimals(), _buyAmt))
 | 
			
		||||
		);		
 | 
			
		||||
		isEth = address(_sellAddr) == wethAddr;
 | 
			
		||||
		convertEthToWeth(isEth, _sellAddr, _slippageAmt);
 | 
			
		||||
		approve(_sellAddr, address(swapRouter), _slippageAmt);
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			params = ISwapRouter.ExactOutputSingleParams({
 | 
			
		||||
| 
						 | 
				
			
			@ -51,12 +50,13 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
				recipient: address(this),
 | 
			
		||||
				deadline: block.timestamp + 1,
 | 
			
		||||
				amountOut: _buyAmt,
 | 
			
		||||
				amountInMaximum: buyData.expectedAmt,
 | 
			
		||||
				amountInMaximum: _slippageAmt,
 | 
			
		||||
				sqrtPriceLimitX96: 0
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint256 _sellAmt = swapRouter.exactOutputSingle(params);
 | 
			
		||||
		require(_slippageAmt >= _sellAmt, "Too much slippage");
 | 
			
		||||
 | 
			
		||||
		isEth = address(_buyAddr) == wethAddr;
 | 
			
		||||
		convertWethToEth(isEth, _buyAddr, _buyAmt);
 | 
			
		||||
| 
						 | 
				
			
			@ -76,42 +76,31 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Sell Function
 | 
			
		||||
	 * @notice Swap token(sellAddr) with token(buyAddr), sell token to get maximum amount of buy token
 | 
			
		||||
	 * @param buyAddr token to be bought
 | 
			
		||||
	 * @param sellAddr token to be sold
 | 
			
		||||
	 * @param fee pool fees for buyAddr-sellAddr token pair
 | 
			
		||||
	 * @param sellAmt amount of token to be sold
 | 
			
		||||
	 * @param getId Id to get sellAmount
 | 
			
		||||
	 * @param setId Id to store buyAmount
 | 
			
		||||
	 * @notice Swap token(sellAddr) with token(buyAddr), to get max buy tokens
 | 
			
		||||
	 * @param sellData Data input for the buy action
 | 
			
		||||
	 */
 | 
			
		||||
	function sell(
 | 
			
		||||
		address buyAddr,
 | 
			
		||||
		address sellAddr,
 | 
			
		||||
		uint24 fee,
 | 
			
		||||
		uint256 sellAmt,
 | 
			
		||||
		uint256 getId,
 | 
			
		||||
		uint256 setId
 | 
			
		||||
		SellInfo memory sellData
 | 
			
		||||
	)
 | 
			
		||||
		external
 | 
			
		||||
		payable
 | 
			
		||||
		returns (string memory _eventName, bytes memory _eventParam)
 | 
			
		||||
	{
 | 
			
		||||
		uint256 _sellAmt = getUint(getId, sellAmt);
 | 
			
		||||
		uint256 _sellAmt = getUint(sellData.getId, sellData.sellAmt);
 | 
			
		||||
		(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(
 | 
			
		||||
			buyAddr,
 | 
			
		||||
			sellAddr
 | 
			
		||||
			sellData.buyAddr,
 | 
			
		||||
			sellData.sellAddr
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		if (_sellAmt == uint256(-1)) {
 | 
			
		||||
			_sellAmt = sellAddr == ethAddr
 | 
			
		||||
		if (_sellAmt == uint256(-1)) {						//change uint256(-1)
 | 
			
		||||
			_sellAmt = sellData.sellAddr == ethAddr
 | 
			
		||||
				? address(this).balance
 | 
			
		||||
				: _sellAddr.balanceOf(address(this));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// uint _slippageAmt = convert18ToDec(_buyAddr.decimals(),
 | 
			
		||||
		//     wmul(unitAmt, convertTo18(_sellAddr.decimals(), _sellAmt))
 | 
			
		||||
		// );
 | 
			
		||||
		// require(_slippageAmt <= _expectedAmt, "Too much slippage");
 | 
			
		||||
		uint _slippageAmt = convert18ToDec(_buyAddr.decimals(),
 | 
			
		||||
		    wmul(sellData.unitAmt, convertTo18(_sellAddr.decimals(), _sellAmt))
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		bool isEth = address(_sellAddr) == wethAddr;
 | 
			
		||||
		convertEthToWeth(isEth, _sellAddr, _sellAmt);
 | 
			
		||||
| 
						 | 
				
			
			@ -120,32 +109,33 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
 | 
			
		||||
		{
 | 
			
		||||
			params = ISwapRouter.ExactInputSingleParams({
 | 
			
		||||
				tokenIn: sellAddr,
 | 
			
		||||
				tokenOut: buyAddr,
 | 
			
		||||
				fee: fee,
 | 
			
		||||
				tokenIn: sellData.sellAddr,
 | 
			
		||||
				tokenOut: sellData.buyAddr,
 | 
			
		||||
				fee: sellData.fee,
 | 
			
		||||
				recipient: address(this),
 | 
			
		||||
				deadline: block.timestamp + 1,
 | 
			
		||||
				amountIn: _sellAmt,
 | 
			
		||||
				amountOutMinimum: 0,
 | 
			
		||||
				amountOutMinimum: _slippageAmt,
 | 
			
		||||
				sqrtPriceLimitX96: 0
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint256 _buyAmt = swapRouter.exactInputSingle(params);
 | 
			
		||||
		require(_slippageAmt <= _buyAmt, "Too much slippage");
 | 
			
		||||
 | 
			
		||||
		isEth = address(_buyAddr) == wethAddr;
 | 
			
		||||
		convertWethToEth(isEth, _buyAddr, _buyAmt);
 | 
			
		||||
 | 
			
		||||
		setUint(setId, _buyAmt);
 | 
			
		||||
		setUint(sellData.setId, _buyAmt);
 | 
			
		||||
 | 
			
		||||
		_eventName = "LogSell(address,address,uint256,uint256,uint256,uint256)";
 | 
			
		||||
		_eventParam = abi.encode(
 | 
			
		||||
			buyAddr,
 | 
			
		||||
			sellAddr,
 | 
			
		||||
			sellData.buyAddr,
 | 
			
		||||
			sellData.sellAddr,
 | 
			
		||||
			_buyAmt,
 | 
			
		||||
			_sellAmt,
 | 
			
		||||
			getId,
 | 
			
		||||
			setId
 | 
			
		||||
			sellData.getId,
 | 
			
		||||
			sellData.setId
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,10 +18,19 @@ abstract contract Helpers is DSMath, Basic {
 | 
			
		|||
		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 expectedAmt;	//The amount that is expected to be returned after the swap
 | 
			
		||||
		uint256 unitAmt;		//The unit amount of sellAmt/buyAmt with slippage
 | 
			
		||||
		uint256 buyAmt;			//amount of token to be bought
 | 
			
		||||
		uint256 getId;			//Id to get buyAmt
 | 
			
		||||
		uint256 setId;			//Id to store sellAmt
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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 sellAmt/buyAmt with slippage
 | 
			
		||||
		uint256 sellAmt;		//amount of token to be bought
 | 
			
		||||
		uint256 getId;			//Id to get buyAmt
 | 
			
		||||
		uint256 setId;			//Id to store sellAmt
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -34,11 +34,10 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
		uint _slippageAmt = convert18ToDec(_sellAddr.decimals(),
 | 
			
		||||
		    wmul(buyData.unitAmt, convertTo18(_buyAddr.decimals(), _buyAmt))
 | 
			
		||||
		);
 | 
			
		||||
        require(_slippageAmt >= buyData.expectedAmt, "Too much slippage");
 | 
			
		||||
 | 
			
		||||
		bool isMatic = address(_sellAddr) == wmaticAddr;
 | 
			
		||||
		convertMaticToWmatic(isMatic, _sellAddr, uint256(-1));
 | 
			
		||||
		approve(_sellAddr, address(swapRouter), uint256(-1));
 | 
			
		||||
		convertMaticToWmatic(isMatic, _sellAddr, _slippageAmt);
 | 
			
		||||
		approve(_sellAddr, address(swapRouter), _slippageAmt);
 | 
			
		||||
		ISwapRouter.ExactOutputSingleParams memory params;
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -49,12 +48,13 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
				recipient: address(this),
 | 
			
		||||
				deadline: block.timestamp + 1,
 | 
			
		||||
				amountOut: _buyAmt,
 | 
			
		||||
				amountInMaximum: buyData.expectedAmt,
 | 
			
		||||
				amountInMaximum: _slippageAmt,
 | 
			
		||||
				sqrtPriceLimitX96: 0
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint256 _sellAmt = swapRouter.exactOutputSingle(params);
 | 
			
		||||
		require(_slippageAmt >= _sellAmt, "Too much slippage");
 | 
			
		||||
 | 
			
		||||
		isMatic = address(_buyAddr) == wmaticAddr;
 | 
			
		||||
		convertWmaticToMatic(isMatic, _buyAddr, _buyAmt);
 | 
			
		||||
| 
						 | 
				
			
			@ -74,38 +74,32 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Sell Function
 | 
			
		||||
	 * @notice Swap token(sellAddr) with token(buyAddr), sell token to get maximum amount of buy token
 | 
			
		||||
	 * @param buyAddr token to be bought
 | 
			
		||||
	 * @param sellAddr token to be sold
 | 
			
		||||
	 * @param fee pool fees for buyAddr-sellAddr token pair
 | 
			
		||||
	 * @param sellAmt amount of token to be sold
 | 
			
		||||
	 * @param getId Id to get sellAmount
 | 
			
		||||
	 * @param setId Id to store buyAmount
 | 
			
		||||
	 * @notice Swap token(sellAddr) with token(buyAddr), to get max buy tokens
 | 
			
		||||
	 * @param sellData Data input for the buy action
 | 
			
		||||
	 */
 | 
			
		||||
	function sell(
 | 
			
		||||
		address buyAddr,
 | 
			
		||||
		address sellAddr,
 | 
			
		||||
		uint24 fee,
 | 
			
		||||
		uint256 sellAmt,
 | 
			
		||||
		uint256 getId,
 | 
			
		||||
		uint256 setId
 | 
			
		||||
		SellInfo memory sellData
 | 
			
		||||
	)
 | 
			
		||||
		external
 | 
			
		||||
		payable
 | 
			
		||||
		returns (string memory _eventName, bytes memory _eventParam)
 | 
			
		||||
	{
 | 
			
		||||
		uint256 _sellAmt = getUint(getId, sellAmt);
 | 
			
		||||
		uint256 _sellAmt = getUint(sellData.getId, sellData.sellAmt);
 | 
			
		||||
		(
 | 
			
		||||
			TokenInterface _buyAddr,
 | 
			
		||||
			TokenInterface _sellAddr
 | 
			
		||||
		) = changeMaticAddress(buyAddr, sellAddr);
 | 
			
		||||
		) = changeMaticAddress(sellData.buyAddr, sellData.sellAddr);
 | 
			
		||||
 | 
			
		||||
		if (_sellAmt == uint256(-1)) {
 | 
			
		||||
			_sellAmt = sellAddr == maticAddr
 | 
			
		||||
		if (_sellAmt == uint256(-1)) {	
 | 
			
		||||
			_sellAmt = sellData.sellAddr == maticAddr
 | 
			
		||||
				? address(this).balance
 | 
			
		||||
				: _sellAddr.balanceOf(address(this));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint _slippageAmt = convert18ToDec(_buyAddr.decimals(),
 | 
			
		||||
		    wmul(sellData.unitAmt, convertTo18(_sellAddr.decimals(), _sellAmt))
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		bool isMatic = address(_sellAddr) == wmaticAddr;
 | 
			
		||||
		convertMaticToWmatic(isMatic, _sellAddr, _sellAmt);
 | 
			
		||||
		approve(_sellAddr, address(swapRouter), _sellAmt);
 | 
			
		||||
| 
						 | 
				
			
			@ -113,32 +107,33 @@ abstract contract UniswapResolver is Helpers, Events {
 | 
			
		|||
 | 
			
		||||
		{
 | 
			
		||||
			params = ISwapRouter.ExactInputSingleParams({
 | 
			
		||||
				tokenIn: sellAddr,
 | 
			
		||||
				tokenOut: buyAddr,
 | 
			
		||||
				fee: fee,
 | 
			
		||||
				tokenIn: sellData.sellAddr,
 | 
			
		||||
				tokenOut: sellData.buyAddr,
 | 
			
		||||
				fee: sellData.fee,
 | 
			
		||||
				recipient: address(this),
 | 
			
		||||
				deadline: block.timestamp + 1,
 | 
			
		||||
				amountIn: _sellAmt,
 | 
			
		||||
				amountOutMinimum: 0,
 | 
			
		||||
				amountOutMinimum: _slippageAmt,
 | 
			
		||||
				sqrtPriceLimitX96: 0
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint256 _buyAmt = swapRouter.exactInputSingle(params);
 | 
			
		||||
		require(_slippageAmt <= _buyAmt, "Too much slippage");
 | 
			
		||||
 | 
			
		||||
		isMatic = address(_buyAddr) == wmaticAddr;
 | 
			
		||||
		convertWmaticToMatic(isMatic, _buyAddr, _buyAmt);
 | 
			
		||||
 | 
			
		||||
		setUint(setId, _buyAmt);
 | 
			
		||||
		setUint(sellData.setId, _buyAmt);
 | 
			
		||||
 | 
			
		||||
		_eventName = "LogSell(address,address,uint256,uint256,uint256,uint256)";
 | 
			
		||||
		_eventParam = abi.encode(
 | 
			
		||||
			buyAddr,
 | 
			
		||||
			sellAddr,
 | 
			
		||||
			sellData.buyAddr,
 | 
			
		||||
			sellData.sellAddr,
 | 
			
		||||
			_buyAmt,
 | 
			
		||||
			_sellAmt,
 | 
			
		||||
			getId,
 | 
			
		||||
			setId
 | 
			
		||||
			sellData.getId,
 | 
			
		||||
			sellData.setId
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -122,247 +122,20 @@ describe("UniswapV3", function() {
 | 
			
		|||
  });
 | 
			
		||||
 | 
			
		||||
  describe("Main", function() {
 | 
			
		||||
    it("Should mint successfully", async function() {
 | 
			
		||||
      const ethAmount = ethers.utils.parseEther("0.1"); // 1 ETH
 | 
			
		||||
      const daiAmount = ethers.utils.parseEther("400"); // 1 ETH
 | 
			
		||||
      const usdtAmount = Number(ethers.utils.parseEther("400")) / Math.pow(10, 12); // 1 ETH
 | 
			
		||||
      const ethAddress = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
 | 
			
		||||
 | 
			
		||||
      const getIds = ["0", "0"];
 | 
			
		||||
      const setId = "0";
 | 
			
		||||
 | 
			
		||||
      const spells = [
 | 
			
		||||
        {
 | 
			
		||||
          connector: connectorName,
 | 
			
		||||
          method: "mint",
 | 
			
		||||
          args: [
 | 
			
		||||
            ethAddress,
 | 
			
		||||
            DAI_ADDR,
 | 
			
		||||
            FeeAmount.MEDIUM,
 | 
			
		||||
            getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]),
 | 
			
		||||
            getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]),
 | 
			
		||||
            ethAmount,
 | 
			
		||||
            daiAmount,
 | 
			
		||||
            "500000000000000000",
 | 
			
		||||
            getIds,
 | 
			
		||||
            setId,
 | 
			
		||||
          ],
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          connector: connectorName,
 | 
			
		||||
          method: "mint",
 | 
			
		||||
          args: [
 | 
			
		||||
            DAI_ADDR,
 | 
			
		||||
            USDT_ADDR,
 | 
			
		||||
            FeeAmount.MEDIUM,
 | 
			
		||||
            getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]),
 | 
			
		||||
            getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]),
 | 
			
		||||
            daiAmount,
 | 
			
		||||
            usdtAmount,
 | 
			
		||||
            "300000000000000000",
 | 
			
		||||
            getIds,
 | 
			
		||||
            setId,
 | 
			
		||||
          ],
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          connector: connectorName,
 | 
			
		||||
          method: "mint",
 | 
			
		||||
          args: [
 | 
			
		||||
            ethAddress,
 | 
			
		||||
            USDT_ADDR,
 | 
			
		||||
            FeeAmount.MEDIUM,
 | 
			
		||||
            getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]),
 | 
			
		||||
            getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]),
 | 
			
		||||
            ethAmount,
 | 
			
		||||
            usdtAmount,
 | 
			
		||||
            "300000000000000000",
 | 
			
		||||
            getIds,
 | 
			
		||||
            setId,
 | 
			
		||||
          ],
 | 
			
		||||
        },
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
      const tx = await dsaWallet0
 | 
			
		||||
        .connect(wallet0)
 | 
			
		||||
        .cast(...encodeSpells(spells), wallet1.address);
 | 
			
		||||
      let receipt = await tx.wait();
 | 
			
		||||
      let castEvent = new Promise((resolve, reject) => {
 | 
			
		||||
        dsaWallet0.on(
 | 
			
		||||
          "LogCast",
 | 
			
		||||
          (
 | 
			
		||||
            origin: any,
 | 
			
		||||
            sender: any,
 | 
			
		||||
            value: any,
 | 
			
		||||
            targetNames: any,
 | 
			
		||||
            targets: any,
 | 
			
		||||
            eventNames: any,
 | 
			
		||||
            eventParams: any,
 | 
			
		||||
            event: any
 | 
			
		||||
          ) => {
 | 
			
		||||
            const params = abiCoder.decode(
 | 
			
		||||
              ["uint256", "uint256", "uint256", "uint256", "int24", "int24"],
 | 
			
		||||
              eventParams[0]
 | 
			
		||||
            );
 | 
			
		||||
            const params1 = abiCoder.decode(
 | 
			
		||||
              ["uint256", "uint256", "uint256", "uint256", "int24", "int24"],
 | 
			
		||||
              eventParams[2]
 | 
			
		||||
            );
 | 
			
		||||
            tokenIds.push(params[0]);
 | 
			
		||||
            tokenIds.push(params1[0]);
 | 
			
		||||
            liquidities.push(params[1]);
 | 
			
		||||
            event.removeListener();
 | 
			
		||||
 | 
			
		||||
            resolve({
 | 
			
		||||
              eventNames,
 | 
			
		||||
            });
 | 
			
		||||
          }
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
          reject(new Error("timeout"));
 | 
			
		||||
        }, 60000);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      let event = await castEvent;
 | 
			
		||||
 | 
			
		||||
      const data = await nftManager.positions(tokenIds[0]);
 | 
			
		||||
 | 
			
		||||
      expect(data.liquidity).to.be.equals(liquidities[0]);
 | 
			
		||||
    }).timeout(10000000000);
 | 
			
		||||
 | 
			
		||||
    it("Should deposit successfully", async function() {
 | 
			
		||||
      const daiAmount = ethers.utils.parseEther("400"); // 1 ETH
 | 
			
		||||
      const ethAmount = ethers.utils.parseEther("0.1"); // 1 ETH
 | 
			
		||||
 | 
			
		||||
      const getIds = ["0", "0"];
 | 
			
		||||
      const setId = "0";
 | 
			
		||||
 | 
			
		||||
      const spells = [
 | 
			
		||||
        {
 | 
			
		||||
          connector: connectorName,
 | 
			
		||||
          method: "deposit",
 | 
			
		||||
          args: [
 | 
			
		||||
            tokenIds[0],
 | 
			
		||||
            daiAmount,
 | 
			
		||||
            ethAmount,
 | 
			
		||||
            "500000000000000000",
 | 
			
		||||
            getIds,
 | 
			
		||||
            setId,
 | 
			
		||||
          ],
 | 
			
		||||
        },
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
      const tx = await dsaWallet0
 | 
			
		||||
        .connect(wallet0)
 | 
			
		||||
        .cast(...encodeSpells(spells), wallet1.address);
 | 
			
		||||
      const receipt = await tx.wait();
 | 
			
		||||
 | 
			
		||||
      let castEvent = new Promise((resolve, reject) => {
 | 
			
		||||
        dsaWallet0.on(
 | 
			
		||||
          "LogCast",
 | 
			
		||||
          (
 | 
			
		||||
            origin: any,
 | 
			
		||||
            sender: any,
 | 
			
		||||
            value: any,
 | 
			
		||||
            targetNames: any,
 | 
			
		||||
            targets: any,
 | 
			
		||||
            eventNames: any,
 | 
			
		||||
            eventParams: any,
 | 
			
		||||
            event: any
 | 
			
		||||
          ) => {
 | 
			
		||||
            const params = abiCoder.decode(
 | 
			
		||||
              ["uint256", "uint256", "uint256", "uint256"],
 | 
			
		||||
              eventParams[0]
 | 
			
		||||
            );
 | 
			
		||||
            liquidities[0] = liquidities[0].add(params[1]);
 | 
			
		||||
            event.removeListener();
 | 
			
		||||
 | 
			
		||||
            resolve({
 | 
			
		||||
              eventNames,
 | 
			
		||||
            });
 | 
			
		||||
          }
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
          reject(new Error("timeout"));
 | 
			
		||||
        }, 60000);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      let event = await castEvent;
 | 
			
		||||
 | 
			
		||||
      const data = await nftManager.positions(tokenIds[0]);
 | 
			
		||||
      expect(data.liquidity).to.be.equals(liquidities[0]);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it("Should withdraw successfully", async function() {
 | 
			
		||||
      const getId = "0";
 | 
			
		||||
      const setIds = ["0", "0"];
 | 
			
		||||
 | 
			
		||||
      const data = await nftManager.positions(tokenIds[0]);
 | 
			
		||||
      let data1 = await nftManager.positions(tokenIds[1]);
 | 
			
		||||
 | 
			
		||||
      const spells = [
 | 
			
		||||
        {
 | 
			
		||||
          connector: connectorName,
 | 
			
		||||
          method: "withdraw",
 | 
			
		||||
          args: [tokenIds[0], data.liquidity, 0, 0, getId, setIds],
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          connector: connectorName,
 | 
			
		||||
          method: "withdraw",
 | 
			
		||||
          args: [0, data1.liquidity, 0, 0, getId, setIds],
 | 
			
		||||
        },
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
      const tx = await dsaWallet0
 | 
			
		||||
        .connect(wallet0)
 | 
			
		||||
        .cast(...encodeSpells(spells), wallet1.address);
 | 
			
		||||
      const receipt = await tx.wait();
 | 
			
		||||
 | 
			
		||||
      data1 = await nftManager.positions(tokenIds[1]);
 | 
			
		||||
      expect(data1.liquidity.toNumber()).to.be.equals(0);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it("Should collect successfully", async function() {
 | 
			
		||||
      const ethAmount = ethers.utils.parseEther("0.2"); // 1 ETH
 | 
			
		||||
      const daiAmount = ethers.utils.parseEther("800"); // 1 ETH
 | 
			
		||||
      const getIds = ["0", "0"];
 | 
			
		||||
      const setIds = ["0", "0"];
 | 
			
		||||
 | 
			
		||||
      const spells = [
 | 
			
		||||
        {
 | 
			
		||||
          connector: connectorName,
 | 
			
		||||
          method: "collect",
 | 
			
		||||
          args: [tokenIds[0], daiAmount, ethAmount, getIds, setIds],
 | 
			
		||||
        },
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
      const tx = await dsaWallet0
 | 
			
		||||
        .connect(wallet0)
 | 
			
		||||
        .cast(...encodeSpells(spells), wallet1.address);
 | 
			
		||||
      const receipt = await tx.wait();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it("Should burn successfully", async function() {
 | 
			
		||||
      const spells = [
 | 
			
		||||
        {
 | 
			
		||||
          connector: connectorName,
 | 
			
		||||
          method: "burn",
 | 
			
		||||
          args: [tokenIds[0]],
 | 
			
		||||
        },
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
      const tx = await dsaWallet0
 | 
			
		||||
        .connect(wallet0)
 | 
			
		||||
        .cast(...encodeSpells(spells), wallet1.address);
 | 
			
		||||
      const receipt = await tx.wait();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it("Should buy successfully", async function() {
 | 
			
		||||
      const daiAmount = ethers.utils.parseEther("400"); 
 | 
			
		||||
      const ethAddress = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
 | 
			
		||||
      const getId = "0";
 | 
			
		||||
      const setId = "0";
 | 
			
		||||
      // const _expectedAmt = 
 | 
			
		||||
      const data = {
 | 
			
		||||
        buyAddr: DAI_ADDR,
 | 
			
		||||
        sellAddr: ethAddress,
 | 
			
		||||
        fee: FeeAmount.MEDIUM,
 | 
			
		||||
        unitAmt: "0",
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const spells = [
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user