mirror of
https://github.com/Instadapp/dsa-connectors.git
synced 2024-07-29 22:37:00 +00:00
swap connectors for uniswapV3 mainnet
This commit is contained in:
parent
3cd689a12b
commit
b12e5231de
|
@ -32,4 +32,22 @@ contract Events {
|
||||||
);
|
);
|
||||||
|
|
||||||
event LogBurnPosition(uint256 tokenId);
|
event LogBurnPosition(uint256 tokenId);
|
||||||
|
|
||||||
|
event LogBuy(
|
||||||
|
address indexed buyToken,
|
||||||
|
address indexed sellToken,
|
||||||
|
uint256 buyAmt,
|
||||||
|
uint256 sellAmt,
|
||||||
|
uint256 getId,
|
||||||
|
uint256 setId
|
||||||
|
);
|
||||||
|
|
||||||
|
event LogSell(
|
||||||
|
address indexed buyToken,
|
||||||
|
address indexed sellToken,
|
||||||
|
uint256 buyAmt,
|
||||||
|
uint256 sellAmt,
|
||||||
|
uint256 getId,
|
||||||
|
uint256 setId
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,16 @@ interface ISwapRouter is IUniswapV3SwapCallback {
|
||||||
uint256 amountOutMinimum;
|
uint256 amountOutMinimum;
|
||||||
uint160 sqrtPriceLimitX96;
|
uint160 sqrtPriceLimitX96;
|
||||||
}
|
}
|
||||||
|
struct ExactOutputSingleParams {
|
||||||
|
address tokenIn;
|
||||||
|
address tokenOut;
|
||||||
|
uint24 fee;
|
||||||
|
address recipient;
|
||||||
|
uint256 deadline;
|
||||||
|
uint256 amountOut;
|
||||||
|
uint256 amountInMaximum;
|
||||||
|
uint160 sqrtPriceLimitX96;
|
||||||
|
}
|
||||||
|
|
||||||
/// @notice Swaps `amountIn` of one token for as much as possible of another token
|
/// @notice Swaps `amountIn` of one token for as much as possible of another token
|
||||||
/// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
|
/// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
|
||||||
|
@ -61,17 +71,6 @@ interface ISwapRouter is IUniswapV3SwapCallback {
|
||||||
payable
|
payable
|
||||||
returns (uint256 amountOut);
|
returns (uint256 amountOut);
|
||||||
|
|
||||||
struct ExactOutputSingleParams {
|
|
||||||
address tokenIn;
|
|
||||||
address tokenOut;
|
|
||||||
uint24 fee;
|
|
||||||
address recipient;
|
|
||||||
uint256 deadline;
|
|
||||||
uint256 amountOut;
|
|
||||||
uint256 amountInMaximum;
|
|
||||||
uint160 sqrtPriceLimitX96;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @notice Swaps as little as possible of one token for `amountOut` of another token
|
/// @notice Swaps as little as possible of one token for `amountOut` of another token
|
||||||
/// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
|
/// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
|
||||||
/// @return amountIn The amount of the input token
|
/// @return amountIn The amount of the input token
|
||||||
|
|
|
@ -9,6 +9,7 @@ pragma abicoder v2;
|
||||||
|
|
||||||
import {TokenInterface} from "../../../common/interfaces.sol";
|
import {TokenInterface} from "../../../common/interfaces.sol";
|
||||||
import {Helpers} from "./helpers.sol";
|
import {Helpers} from "./helpers.sol";
|
||||||
|
import "./interface.sol";
|
||||||
import {Events} from "./events.sol";
|
import {Events} from "./events.sol";
|
||||||
|
|
||||||
abstract contract UniswapResolver is Helpers, Events {
|
abstract contract UniswapResolver is Helpers, Events {
|
||||||
|
@ -204,6 +205,103 @@ abstract contract UniswapResolver is Helpers, Events {
|
||||||
_eventName = "LogBurnPosition(uint256)";
|
_eventName = "LogBurnPosition(uint256)";
|
||||||
_eventParam = abi.encode(tokenId);
|
_eventParam = abi.encode(tokenId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function buy(
|
||||||
|
address buyAddr,
|
||||||
|
address sellAddr,
|
||||||
|
uint24 fee,
|
||||||
|
uint256 buyAmt,
|
||||||
|
uint256 unitAmt,
|
||||||
|
uint256 getId,
|
||||||
|
uint256 setId
|
||||||
|
) external payable returns (string memory _eventName, bytes memory _eventParam) {
|
||||||
|
uint _buyAmt = getUint(getId, buyAmt);
|
||||||
|
(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(buyAddr, sellAddr);
|
||||||
|
|
||||||
|
// uint _slippageAmt = convert18ToDec(_sellAddr.decimals(),
|
||||||
|
// wmul(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;
|
||||||
|
|
||||||
|
{
|
||||||
|
params = ISwapRouter.ExactOutputSingleParams({
|
||||||
|
tokenIn: sellAddr,
|
||||||
|
tokenOut: buyAddr,
|
||||||
|
fee: fee,
|
||||||
|
recipient: address(this),
|
||||||
|
deadline: block.timestamp + 1,
|
||||||
|
amountOut: _buyAmt,
|
||||||
|
amountInMaximum: uint256(-1),
|
||||||
|
sqrtPriceLimitX96: 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
uint _sellAmt = swapRouter.exactOutputSingle(params);
|
||||||
|
|
||||||
|
isEth = address(_buyAddr) == wethAddr;
|
||||||
|
convertWethToEth(isEth, _buyAddr, _buyAmt);
|
||||||
|
|
||||||
|
setUint(setId, _sellAmt);
|
||||||
|
|
||||||
|
_eventName = "LogBuy(address,address,uint256,uint256,uint256,uint256)";
|
||||||
|
_eventParam = abi.encode(buyAddr, sellAddr, _buyAmt, _sellAmt, getId, setId);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sell(
|
||||||
|
address buyAddr,
|
||||||
|
address sellAddr,
|
||||||
|
uint24 fee,
|
||||||
|
uint256 sellAmt,
|
||||||
|
uint256 unitAmt,
|
||||||
|
uint256 getId,
|
||||||
|
uint256 setId
|
||||||
|
) external payable returns (string memory _eventName, bytes memory _eventParam) {
|
||||||
|
uint _sellAmt = getUint(getId, sellAmt);
|
||||||
|
(TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(buyAddr, sellAddr);
|
||||||
|
|
||||||
|
if (_sellAmt == uint(-1)) {
|
||||||
|
_sellAmt = 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");
|
||||||
|
|
||||||
|
bool isEth = address(_sellAddr) == wethAddr;
|
||||||
|
convertEthToWeth(isEth, _sellAddr, _sellAmt);
|
||||||
|
approve(_sellAddr, address(swapRouter), _sellAmt);
|
||||||
|
ISwapRouter.ExactInputSingleParams memory params;
|
||||||
|
|
||||||
|
{
|
||||||
|
params = ISwapRouter.ExactInputSingleParams({
|
||||||
|
tokenIn: sellAddr,
|
||||||
|
tokenOut: buyAddr,
|
||||||
|
fee: fee,
|
||||||
|
recipient: address(this),
|
||||||
|
deadline: block.timestamp + 1,
|
||||||
|
amountIn: _sellAmt,
|
||||||
|
amountOutMinimum: 0,
|
||||||
|
sqrtPriceLimitX96: 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
uint _buyAmt = swapRouter.exactInputSingle(params);
|
||||||
|
|
||||||
|
isEth = address(_buyAddr) == wethAddr;
|
||||||
|
convertWethToEth(isEth, _buyAddr, _buyAmt);
|
||||||
|
|
||||||
|
setUint(setId, _buyAmt);
|
||||||
|
|
||||||
|
_eventName = "LogSell(address,address,uint256,uint256,uint256,uint256)";
|
||||||
|
_eventParam = abi.encode(buyAddr, sellAddr, _buyAmt, _sellAmt, getId, setId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
contract ConnectV2UniswapV3 is UniswapResolver {
|
contract ConnectV2UniswapV3 is UniswapResolver {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user