fix issues

This commit is contained in:
cryptoDev222 2021-08-12 17:12:11 -05:00
parent 77bcdb8049
commit 04a26554b7
4 changed files with 118 additions and 110 deletions

View File

@ -1,27 +1,27 @@
pragma solidity ^0.7.0; pragma solidity ^0.7.0;
contract Events { contract Events {
event LogNewPositionMint( event LogMint(
uint256 indexed tokenId,
uint256 amtA,
uint256 amtB,
uint256 liquidity
);
event LogAddLiquidity(
uint256 indexed tokenId,
uint256 amtA,
uint256 amtB,
uint256 liquidity
);
event LogDecreaseLiquidity(
uint256 indexed tokenId, uint256 indexed tokenId,
uint256 liquidity, uint256 liquidity,
uint256 amtA, uint256 amtA,
uint256 amtB uint256 amtB
); );
event LogDeposit(
uint256 indexed tokenId,
uint256 liquidity,
uint256 amountA,
uint256 amountB
);
event LogWithdraw(
uint256 indexed tokenId,
uint256 liquidity,
uint256 amountA,
uint256 amountB
);
event Swap( event Swap(
address indexed tokenIn, address indexed tokenIn,
address indexed tokenOut, address indexed tokenOut,
@ -29,5 +29,5 @@ contract Events {
uint256 amtOut uint256 amtOut
); );
event BurnPosition(uint256 tokenId); event LogBurn(uint256 tokenId);
} }

View File

@ -30,6 +30,19 @@ abstract contract Helpers is DSMath, Basic {
uint256 slippage; uint256 slippage;
} }
/**
* @dev Get Last NFT Index
* @param user: User address
*/
function _getLastNftId(address user)
internal
view
returns (uint256 tokenId)
{
uint256 len = nftManager.balanceOf(user);
tokenId = nftManager.tokenOfOwnerByIndex(user, len - 1);
}
function getMinAmount( function getMinAmount(
TokenInterface token, TokenInterface token,
uint256 amt, uint256 amt,
@ -48,8 +61,8 @@ abstract contract Helpers is DSMath, Basic {
returns ( returns (
uint256 tokenId, uint256 tokenId,
uint128 liquidity, uint128 liquidity,
uint256 amount0, uint256 amountA,
uint256 amount1 uint256 amountB
) )
{ {
(TokenInterface _token0, TokenInterface _token1) = changeEthAddress( (TokenInterface _token0, TokenInterface _token1) = changeEthAddress(
@ -64,10 +77,8 @@ abstract contract Helpers is DSMath, Basic {
? getTokenBal(TokenInterface(params.tokenB)) ? getTokenBal(TokenInterface(params.tokenB))
: params.amtB; : params.amtB;
uint256 isEth = address(_token0) == wethAddr ? 0 : 2; convertEthToWeth(address(_token0) == wethAddr, _token0, _amount0);
isEth = address(_token1) == wethAddr ? 1 : 2; convertEthToWeth(address(_token1) == wethAddr, _token1, _amount1);
convertEthToWeth(isEth == 0, _token0, _amount0);
convertEthToWeth(isEth == 1, _token1, _amount1);
approve(_token0, address(nftManager), _amount0); approve(_token0, address(nftManager), _amount0);
approve(_token1, address(nftManager), _amount1); approve(_token1, address(nftManager), _amount1);
@ -90,7 +101,7 @@ abstract contract Helpers is DSMath, Basic {
block.timestamp block.timestamp
); );
(tokenId, liquidity, amount0, amount1) = nftManager.mint(params); (tokenId, liquidity, amountA, amountB) = nftManager.mint(params);
} }
/** /**
@ -103,10 +114,10 @@ abstract contract Helpers is DSMath, Basic {
) internal { ) internal {
(, , address token0, address token1, , , , , , , , ) = nftManager (, , address token0, address token1, , , , , , , , ) = nftManager
.positions(_tokenId); .positions(_tokenId);
uint256 isEth = token0 == wethAddr ? 0 : 2; bool isEth0 = token0 == wethAddr;
isEth = token1 == wethAddr ? 1 : 2; bool isEth1 = token1 == wethAddr;
convertEthToWeth(isEth == 0, TokenInterface(token0), _amount0); convertEthToWeth(isEth0, TokenInterface(token0), _amount0);
convertEthToWeth(isEth == 1, TokenInterface(token1), _amount1); convertEthToWeth(isEth1, TokenInterface(token1), _amount1);
approve(TokenInterface(token0), address(nftManager), _amount0); approve(TokenInterface(token0), address(nftManager), _amount0);
approve(TokenInterface(token1), address(nftManager), _amount1); approve(TokenInterface(token1), address(nftManager), _amount1);
} }
@ -118,8 +129,7 @@ abstract contract Helpers is DSMath, Basic {
uint256 _tokenId, uint256 _tokenId,
uint256 _amount0, uint256 _amount0,
uint256 _amount1, uint256 _amount1,
uint256 _amount0Min, uint256 _slippage
uint256 _amount1Min
) )
internal internal
returns ( returns (
@ -129,6 +139,20 @@ abstract contract Helpers is DSMath, Basic {
) )
{ {
_checkETH(_tokenId, _amount0, _amount1); _checkETH(_tokenId, _amount0, _amount1);
(, , address _token0, address _token1, , , , , , , , ) = nftManager
.positions(_tokenId);
uint256 _amount0Min = getMinAmount(
TokenInterface(_token0),
_amount0,
_slippage
);
uint256 _amount1Min = getMinAmount(
TokenInterface(_token1),
_amount1,
_slippage
);
INonfungiblePositionManager.IncreaseLiquidityParams INonfungiblePositionManager.IncreaseLiquidityParams
memory params = INonfungiblePositionManager.IncreaseLiquidityParams( memory params = INonfungiblePositionManager.IncreaseLiquidityParams(
_tokenId, _tokenId,
@ -167,15 +191,15 @@ abstract contract Helpers is DSMath, Basic {
*/ */
function _collect( function _collect(
uint256 _tokenId, uint256 _tokenId,
uint256 _amount0Max, uint128 _amount0Max,
uint256 _amount1Max uint128 _amount1Max
) internal returns (uint256 amount0, uint256 amount1) { ) internal returns (uint256 amount0, uint256 amount1) {
INonfungiblePositionManager.CollectParams INonfungiblePositionManager.CollectParams
memory params = INonfungiblePositionManager.CollectParams( memory params = INonfungiblePositionManager.CollectParams(
_tokenId, _tokenId,
address(this), address(this),
uint128(_amount0Max), _amount0Max,
uint128(_amount1Max) _amount1Max
); );
(amount0, amount1) = nftManager.collect(params); (amount0, amount1) = nftManager.collect(params);
} }

View File

@ -11,7 +11,6 @@ import {Helpers} from "./helpers.sol";
import {Events} from "./events.sol"; import {Events} from "./events.sol";
abstract contract UniswapResolver is Helpers, Events { abstract contract UniswapResolver is Helpers, Events {
uint256 private _lastMintIndex = 1;
/** /**
* @dev Mint New Position * @dev Mint New Position
* @param params: parameter for mint. * @param params: parameter for mint.
@ -33,15 +32,21 @@ abstract contract UniswapResolver is Helpers, Events {
( (
uint256 _tokenId, uint256 _tokenId,
uint256 liquidity, uint256 liquidity,
uint256 _amtA, uint256 amountA,
uint256 _amtB uint256 amountB
) = _mint(params); ) = _mint(params);
setUint(setId, liquidity); setUint(setId, liquidity);
_lastMintIndex = _tokenId; _eventName = "LogMint(uint256,uint256,uint256,uint256,int24,int24)";
_eventParam = abi.encode(
_eventName = "LogNewPositionMint(uint256,uint256,uint256,uint256)"; _tokenId,
_eventParam = abi.encode(_tokenId, _amtA, _amtB, liquidity); liquidity,
amountA,
amountB,
params.tickLower,
params.tickUpper
);
} }
/** /**
@ -49,17 +54,15 @@ abstract contract UniswapResolver is Helpers, Events {
* @param tokenId: NFT LP Token ID. * @param tokenId: NFT LP Token ID.
* @param amountA: tokenA amounts. * @param amountA: tokenA amounts.
* @param amountB: tokenB amounts. * @param amountB: tokenB amounts.
* @param amountAMin: Min amount of tokenA. * @param slippage: slippage.
* @param amountBMin: Min amount of tokenB.
* @param getIds: IDs to retrieve token amounts * @param getIds: IDs to retrieve token amounts
* @param setId: stores the amount of LP token * @param setId: stores the liquidity amount
*/ */
function addLiquidity( function deposit(
uint256 tokenId, uint256 tokenId,
uint256 amountA, uint256 amountA,
uint256 amountB, uint256 amountB,
uint256 amountAMin, uint256 slippage,
uint256 amountBMin,
uint256[] calldata getIds, uint256[] calldata getIds,
uint256 setId uint256 setId
) )
@ -67,7 +70,7 @@ abstract contract UniswapResolver is Helpers, Events {
payable payable
returns (string memory _eventName, bytes memory _eventParam) returns (string memory _eventName, bytes memory _eventParam)
{ {
if (tokenId == 0) tokenId = _lastMintIndex; if (tokenId == 0) tokenId = _getLastNftId(address(this));
amountA = getUint(getIds[0], amountA); amountA = getUint(getIds[0], amountA);
amountB = getUint(getIds[1], amountB); amountB = getUint(getIds[1], amountB);
@ -75,13 +78,12 @@ abstract contract UniswapResolver is Helpers, Events {
tokenId, tokenId,
amountA, amountA,
amountB, amountB,
amountAMin, slippage
amountBMin
); );
setUint(setId, _liquidity); setUint(setId, _liquidity);
_eventName = "LogAddLiquidity(uint256,uint256,uint256,uint256)"; _eventName = "LogDeposit(uint256,uint256,uint256,uint256)";
_eventParam = abi.encode(tokenId, _amtA, _amtB, _liquidity); _eventParam = abi.encode(tokenId, _liquidity, _amtA, _amtB);
} }
/** /**
@ -93,9 +95,9 @@ abstract contract UniswapResolver is Helpers, Events {
* @param getId: ID to retrieve LP token amounts * @param getId: ID to retrieve LP token amounts
* @param setIds: stores the amount of output tokens * @param setIds: stores the amount of output tokens
*/ */
function decreaseLiquidity( function withdraw(
uint256 tokenId, uint256 tokenId,
uint128 liquidity, uint256 liquidity,
uint256 amountAMin, uint256 amountAMin,
uint256 amountBMin, uint256 amountBMin,
uint256 getId, uint256 getId,
@ -105,7 +107,7 @@ abstract contract UniswapResolver is Helpers, Events {
payable payable
returns (string memory _eventName, bytes memory _eventParam) returns (string memory _eventName, bytes memory _eventParam)
{ {
if (tokenId == 0) tokenId = _lastMintIndex; if (tokenId == 0) tokenId = _getLastNftId(address(this));
uint128 _liquidity = uint128(getUint(getId, liquidity)); uint128 _liquidity = uint128(getUint(getId, liquidity));
(uint256 _amtA, uint256 _amtB) = _decreaseLiquidity( (uint256 _amtA, uint256 _amtB) = _decreaseLiquidity(
@ -118,45 +120,10 @@ abstract contract UniswapResolver is Helpers, Events {
setUint(setIds[0], _amtA); setUint(setIds[0], _amtA);
setUint(setIds[1], _amtB); setUint(setIds[1], _amtB);
_eventName = "LogDecreaseLiquidity(uint256,uint256,uint256,uint256)"; _eventName = "LogWithdraw(uint256,uint256,uint256,uint256)";
_eventParam = abi.encode(tokenId, _liquidity, _amtA, _amtB); _eventParam = abi.encode(tokenId, _liquidity, _amtA, _amtB);
} }
/**
* @dev Swap Function
* @param tokenIn: Token Address for input
* @param tokenOut: Token Address for output
* @param fee: Fee amount
* @param amountIn: Amount for input
* @param getId: ID to retrieve amountIn
* @param setId: stores the amount of Out token
*/
function swapToken(
address tokenIn,
address tokenOut,
uint24 fee,
uint256 amountIn,
uint256 getId,
uint256 setId
)
external
payable
returns (string memory _eventName, bytes memory _eventParam)
{
uint256 _amountIn = getUint(getId, amountIn);
uint256 amountOut = _exactInputSingle(
tokenIn,
tokenOut,
fee,
_amountIn
);
setUint(setId, amountOut);
_eventName = "Swap(address,address,uint256,uint256)";
_eventParam = abi.encode(tokenIn, tokenOut, _amountIn, amountOut);
}
/** /**
* @dev Collect function * @dev Collect function
* @param tokenId: NFT LP Token ID. * @param tokenId: NFT LP Token ID.
@ -167,8 +134,8 @@ abstract contract UniswapResolver is Helpers, Events {
*/ */
function collect( function collect(
uint256 tokenId, uint256 tokenId,
uint128 amount0Max, uint256 amount0Max,
uint128 amount1Max, uint256 amount1Max,
uint256[] calldata getIds, uint256[] calldata getIds,
uint256[] calldata setIds uint256[] calldata setIds
) )
@ -176,7 +143,7 @@ abstract contract UniswapResolver is Helpers, Events {
payable payable
returns (string memory _eventName, bytes memory _eventParam) returns (string memory _eventName, bytes memory _eventParam)
{ {
if (tokenId == 0) tokenId = _lastMintIndex; if (tokenId == 0) tokenId = _getLastNftId(address(this));
uint128 _amount0Max = uint128(getUint(getIds[0], amount0Max)); uint128 _amount0Max = uint128(getUint(getIds[0], amount0Max));
uint128 _amount1Max = uint128(getUint(getIds[1], amount1Max)); uint128 _amount1Max = uint128(getUint(getIds[1], amount1Max));
(uint256 amount0, uint256 amount1) = _collect( (uint256 amount0, uint256 amount1) = _collect(
@ -187,21 +154,21 @@ abstract contract UniswapResolver is Helpers, Events {
setUint(setIds[0], amount0); setUint(setIds[0], amount0);
setUint(setIds[1], amount1); setUint(setIds[1], amount1);
_eventName = "Collect(uint256,uint256,uint256)"; _eventName = "LogCollect(uint256,uint256,uint256)";
_eventParam = abi.encode(tokenId, amount0, amount1); _eventParam = abi.encode(tokenId, amount0, amount1);
} }
/** /**
* @dev Burn Function * @dev Burn Function
*/ */
function burnNFT(uint256 tokenId) function burn(uint256 tokenId)
external external
payable payable
returns (string memory _eventName, bytes memory _eventParam) returns (string memory _eventName, bytes memory _eventParam)
{ {
if (tokenId == 0) tokenId = _lastMintIndex; if (tokenId == 0) tokenId = _getLastNftId(address(this));
_burn(tokenId); _burn(tokenId);
_eventName = "BurnPosition(uint256)"; _eventName = "LogBurnPosition(uint256)";
_eventParam = abi.encode(tokenId); _eventParam = abi.encode(tokenId);
} }
} }

View File

@ -131,8 +131,8 @@ describe("UniswapV3", function () {
method: "mint", method: "mint",
args: [ args: [
{ {
tokenB: USDT_ADDR,
tokenA: DAI_ADDR, tokenA: DAI_ADDR,
tokenB: USDT_ADDR,
fee: FeeAmount.MEDIUM, fee: FeeAmount.MEDIUM,
tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]),
tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]),
@ -143,6 +143,24 @@ describe("UniswapV3", function () {
getIds, getIds,
setId setId
], ],
},
{
connector: connectorName,
method: "mint",
args: [
{
tokenA: ethAddress,
tokenB: USDT_ADDR,
fee: FeeAmount.MEDIUM,
tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]),
tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]),
amtA: ethAmount,
amtB: usdtAmount,
slippage: "300000000000000000"
},
getIds,
setId
],
} }
] ]
@ -150,11 +168,11 @@ describe("UniswapV3", function () {
let receipt = await tx.wait() let receipt = await tx.wait()
let castEvent = new Promise((resolve, reject) => { let castEvent = new Promise((resolve, reject) => {
dsaWallet0.on('LogCast', (origin, sender, value, targetNames, targets, eventNames, eventParams, event) => { dsaWallet0.on('LogCast', (origin, sender, value, targetNames, targets, eventNames, eventParams, event) => {
const params = abiCoder.decode(["uint256", "uint256", "uint256", "uint256"], eventParams[0]); const params = abiCoder.decode(["uint256", "uint256", "uint256", "uint256", "int24", "int24"], eventParams[0]);
const params1 = abiCoder.decode(["uint256", "uint256", "uint256", "uint256"], eventParams[1]); const params1 = abiCoder.decode(["uint256", "uint256", "uint256", "uint256", "int24", "int24"], eventParams[2]);
tokenIds.push(params[0]); tokenIds.push(params[0]);
tokenIds.push(params1[0]); tokenIds.push(params1[0]);
liquidities.push(params[3]); liquidities.push(params[1]);
event.removeListener(); event.removeListener();
resolve({ resolve({
@ -174,7 +192,7 @@ describe("UniswapV3", function () {
expect(data.liquidity).to.be.equals(liquidities[0]); expect(data.liquidity).to.be.equals(liquidities[0]);
}) })
it("Should increaseLiquidity successfully", async function () { it("Should deposit successfully", async function () {
const daiAmount = ethers.utils.parseEther("400") // 1 ETH const daiAmount = ethers.utils.parseEther("400") // 1 ETH
const ethAmount = ethers.utils.parseEther("0.1") // 1 ETH const ethAmount = ethers.utils.parseEther("0.1") // 1 ETH
const usdtAmount = ethers.utils.parseEther("400") / Math.pow(10, 12) // 1 ETH const usdtAmount = ethers.utils.parseEther("400") / Math.pow(10, 12) // 1 ETH
@ -186,13 +204,12 @@ describe("UniswapV3", function () {
const spells = [ const spells = [
{ {
connector: connectorName, connector: connectorName,
method: "addLiquidity", method: "deposit",
args: [ args: [
tokenIds[0], tokenIds[0],
daiAmount, daiAmount,
ethAmount, ethAmount,
0, "500000000000000000",
0,
getIds, getIds,
setId setId
], ],
@ -205,7 +222,7 @@ describe("UniswapV3", function () {
let castEvent = new Promise((resolve, reject) => { let castEvent = new Promise((resolve, reject) => {
dsaWallet0.on('LogCast', (origin, sender, value, targetNames, targets, eventNames, eventParams, event) => { dsaWallet0.on('LogCast', (origin, sender, value, targetNames, targets, eventNames, eventParams, event) => {
const params = abiCoder.decode(["uint256", "uint256", "uint256", "uint256"], eventParams[0]); const params = abiCoder.decode(["uint256", "uint256", "uint256", "uint256"], eventParams[0]);
liquidities[0] = liquidities[0].add(params[3]); liquidities[0] = liquidities[0].add(params[1]);
event.removeListener(); event.removeListener();
resolve({ resolve({
@ -224,7 +241,7 @@ describe("UniswapV3", function () {
expect(data.liquidity).to.be.equals(liquidities[0]); expect(data.liquidity).to.be.equals(liquidities[0]);
}) })
it("Should decreaseLiquidity successfully", async function () { it("Should withdraw successfully", async function () {
const getId = "0" const getId = "0"
const setIds = ["0", "0"] const setIds = ["0", "0"]
@ -235,7 +252,7 @@ describe("UniswapV3", function () {
const spells = [ const spells = [
{ {
connector: connectorName, connector: connectorName,
method: "decreaseLiquidity", method: "withdraw",
args: [ args: [
tokenIds[0], tokenIds[0],
data.liquidity, data.liquidity,
@ -247,7 +264,7 @@ describe("UniswapV3", function () {
}, },
{ {
connector: connectorName, connector: connectorName,
method: "decreaseLiquidity", method: "withdraw",
args: [ args: [
0, 0,
data1.liquidity, data1.liquidity,
@ -296,7 +313,7 @@ describe("UniswapV3", function () {
const spells = [ const spells = [
{ {
connector: connectorName, connector: connectorName,
method: "burnNFT", method: "burn",
args: [ args: [
tokenIds[0] tokenIds[0]
], ],