From 282ae5cd0d6748a1a04e99bbe6d564df42955b48 Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Wed, 9 Jun 2021 02:43:29 +0530 Subject: [PATCH 01/11] add Gelato Uniswap v3 resolver --- .../protocols/mainnet/GelatoUniV3pool.sol | 159 ++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 contracts/protocols/mainnet/GelatoUniV3pool.sol diff --git a/contracts/protocols/mainnet/GelatoUniV3pool.sol b/contracts/protocols/mainnet/GelatoUniV3pool.sol new file mode 100644 index 0000000..8f76300 --- /dev/null +++ b/contracts/protocols/mainnet/GelatoUniV3pool.sol @@ -0,0 +1,159 @@ +pragma solidity ^0.6.0; +pragma experimental ABIEncoderV2; + + +interface IERC20 { + +} + +interface IGUniPool { + function token0() external view returns (IERC20); + + function token1() external view returns (IERC20); + + // function pool() external view returns (IUniswapV3Pool); + + function totalSupply() external view returns (uint256); + + function balanceOf(address account) external view returns (uint256); + + // function mint(uint256 mintAmount, address receiver) + // external + // returns ( + // uint256 amount0, + // uint256 amount1, + // uint128 liquidityMinted + // ); + + // function burn(uint256 burnAmount, address receiver) + // external + // returns ( + // uint256 amount0, + // uint256 amount1, + // uint128 liquidityBurned + // ); + + // function getMintAmounts(uint256 amount0Max, uint256 amount1Max) + // external + // view + // returns ( + // uint256 amount0, + // uint256 amount1, + // uint256 mintAmount + // ); + + // function getPositionID() external view returns (bytes32 positionID); +} + +interface IGUniRouter { + + function getPoolUnderlyingBalances(IGUniPool pool) + external + view + returns (uint256 amount0, uint256 amount1); + + function getUnderlyingBalances( + IGUniPool pool, + address account, + uint256 balance + ) external view returns (uint256 amount0, uint256 amount1); + +} + +struct StakingRewardsInfo { + address stakingRewards; + uint rewardAmount; +} +interface StakingFactoryInterface { + + function stakingRewardsInfoByStakingToken(address) external view returns(StakingRewardsInfo memory); + +} + +interface StakingInterface { + function balanceOf(address account) external view returns (uint256); + function earned(address account) external view returns (uint256); + function rewardPerToken() external view returns (uint256); +} + + +contract DSMath { + + function add(uint x, uint y) internal pure returns (uint z) { + require((z = x + y) >= x, "math-not-safe"); + } + + function mul(uint x, uint y) internal pure returns (uint z) { + require(y == 0 || (z = x * y) / y == x, "math-not-safe"); + } + + uint constant WAD = 10 ** 18; + + function wmul(uint x, uint y) internal pure returns (uint z) { + z = add(mul(x, y), WAD / 2) / WAD; + } + + function wdiv(uint x, uint y) internal pure returns (uint z) { + z = add(mul(x, WAD), y / 2) / y; + } + + function sub(uint x, uint y) internal pure returns (uint z) { + require((z = x - y) <= x, "ds-math-sub-underflow"); + } + +} + +contract Helpers is DSMath { + + StakingFactoryInterface public constant getStakingFactory = StakingFactoryInterface(0xf39eC5a471edF20Ecc7db1c2c34B4C73ab4B2C19); + IGUniRouter public constant gelatoRouter = IGUniRouter(0x8CA6fa325bc32f86a12cC4964Edf1f71655007A7); + + struct UserData { + address pool; // address of pool contract + address staking; // address of staking contract + address token0Addr; // address of token 0 + address token1Addr; // address of token 1 + uint token0Bal; // balance of token 0 + uint token1Bal; // balance of token 1 + uint poolToken0Bal; // balance of total pool for token0 + uint poolToken1Bal; // balance of total pool for token1 + uint earned; // INST earned from staking + uint stakedBal; // user's pool token bal in staking contract + uint poolBal; // ideal pool token in user's DSA + uint totalBal; // stakedBal + poolTknBal + } + +} + +contract Resolver is Helpers { + + function getSinglePosition(address user, address pool) public view returns(UserData memory _data) { + StakingInterface stakingContract = StakingInterface(getStakingFactory.stakingRewardsInfoByStakingToken(pool).stakingRewards); + _data.staking = address(stakingContract); + IGUniPool poolContract = IGUniPool(pool); + _data.token0Addr = address(poolContract.token0()); + _data.token1Addr = address(poolContract.token1()); + if (_data.staking == address(0)) { + _data.earned = 0; + _data.stakedBal = 0; + } else { + _data.earned = stakingContract.earned(user); + _data.stakedBal = stakingContract.balanceOf(user); + } + _data.poolBal = poolContract.balanceOf(user); + _data.totalBal = add(_data.stakedBal, _data.poolBal); + (_data.token0Bal, _data.token1Bal) = gelatoRouter.getUnderlyingBalances(poolContract, user, _data.totalBal); + (_data.poolToken0Bal, _data.poolToken1Bal) = gelatoRouter.getPoolUnderlyingBalances(poolContract); + } + + function getPosition(address user, address[] memory pools) public view returns(UserData[] memory _data) { + for (uint i = 0; i < pools.length; i++) { + _data[i] = getSinglePosition(user, pools[i]); + } + } + + + // TODO: Add function to calculate current INST APY on pools + // Use rewardPerToken() + +} From 1a04df42fd49d90259710b03f1e23a414d38f45f Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Wed, 9 Jun 2021 17:45:20 +0530 Subject: [PATCH 02/11] Gelato UNI resolver done --- .../protocols/mainnet/GelatoUniV3pool.sol | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/contracts/protocols/mainnet/GelatoUniV3pool.sol b/contracts/protocols/mainnet/GelatoUniV3pool.sol index 8f76300..6207448 100644 --- a/contracts/protocols/mainnet/GelatoUniV3pool.sol +++ b/contracts/protocols/mainnet/GelatoUniV3pool.sol @@ -71,6 +71,8 @@ interface StakingFactoryInterface { } interface StakingInterface { + function totalSupply() external view returns (uint256); + function rewardRate() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function earned(address account) external view returns (uint256); function rewardPerToken() external view returns (uint256); @@ -113,10 +115,15 @@ contract Helpers is DSMath { address staking; // address of staking contract address token0Addr; // address of token 0 address token1Addr; // address of token 1 - uint token0Bal; // balance of token 0 - uint token1Bal; // balance of token 1 + uint poolTokenSupply; // Total supply of Pool token uint poolToken0Bal; // balance of total pool for token0 uint poolToken1Bal; // balance of total pool for token1 + uint poolTokenSupplyStaked; // total pool token locked in staking contract + uint stakingToken0Bal; // total balance of token0 in Staking + uint stakingToken1Bal; // total balance of token1 in Staking + uint rewardRate; // INST distributing per second + uint token0Bal; // balance of token 0 of user + uint token1Bal; // balance of token 1 of user uint earned; // INST earned from staking uint stakedBal; // user's pool token bal in staking contract uint poolBal; // ideal pool token in user's DSA @@ -128,6 +135,7 @@ contract Helpers is DSMath { contract Resolver is Helpers { function getSinglePosition(address user, address pool) public view returns(UserData memory _data) { + _data.pool = pool; StakingInterface stakingContract = StakingInterface(getStakingFactory.stakingRewardsInfoByStakingToken(pool).stakingRewards); _data.staking = address(stakingContract); IGUniPool poolContract = IGUniPool(pool); @@ -143,7 +151,11 @@ contract Resolver is Helpers { _data.poolBal = poolContract.balanceOf(user); _data.totalBal = add(_data.stakedBal, _data.poolBal); (_data.token0Bal, _data.token1Bal) = gelatoRouter.getUnderlyingBalances(poolContract, user, _data.totalBal); + _data.poolTokenSupply = poolContract.balanceOf(user); (_data.poolToken0Bal, _data.poolToken1Bal) = gelatoRouter.getPoolUnderlyingBalances(poolContract); + _data.poolTokenSupplyStaked = stakingContract.totalSupply(); + (_data.stakingToken0Bal, _data.stakingToken1Bal) = gelatoRouter.getUnderlyingBalances(poolContract, _data.staking, _data.poolTokenSupplyStaked); + _data.rewardRate = stakingContract.rewardRate(); } function getPosition(address user, address[] memory pools) public view returns(UserData[] memory _data) { @@ -152,8 +164,4 @@ contract Resolver is Helpers { } } - - // TODO: Add function to calculate current INST APY on pools - // Use rewardPerToken() - } From b54feece56392ee7ac7188f0fc4cdb64fbceb49c Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Thu, 10 Jun 2021 02:57:37 +0530 Subject: [PATCH 03/11] function names updates --- .../protocols/mainnet/GelatoUniV3pool.sol | 85 ++++++++++++------- 1 file changed, 54 insertions(+), 31 deletions(-) diff --git a/contracts/protocols/mainnet/GelatoUniV3pool.sol b/contracts/protocols/mainnet/GelatoUniV3pool.sol index 6207448..6520a57 100644 --- a/contracts/protocols/mainnet/GelatoUniV3pool.sol +++ b/contracts/protocols/mainnet/GelatoUniV3pool.sol @@ -3,7 +3,8 @@ pragma experimental ABIEncoderV2; interface IERC20 { - + function balanceOf(address) external view returns (uint256); + function totalSupply() external view returns (uint256); } interface IGUniPool { @@ -17,35 +18,19 @@ interface IGUniPool { function balanceOf(address account) external view returns (uint256); - // function mint(uint256 mintAmount, address receiver) - // external - // returns ( - // uint256 amount0, - // uint256 amount1, - // uint128 liquidityMinted - // ); + function getMintAmounts(uint256 amount0Max, uint256 amount1Max) + external + view + returns ( + uint256 amount0, + uint256 amount1, + uint256 mintAmount + ); - // function burn(uint256 burnAmount, address receiver) - // external - // returns ( - // uint256 amount0, - // uint256 amount1, - // uint128 liquidityBurned - // ); - - // function getMintAmounts(uint256 amount0Max, uint256 amount1Max) - // external - // view - // returns ( - // uint256 amount0, - // uint256 amount1, - // uint256 mintAmount - // ); - - // function getPositionID() external view returns (bytes32 positionID); + function getPositionID() external view returns (bytes32 positionID); } -interface IGUniRouter { +interface GUniResolver { function getPoolUnderlyingBalances(IGUniPool pool) external @@ -54,10 +39,20 @@ interface IGUniRouter { function getUnderlyingBalances( IGUniPool pool, - address account, uint256 balance ) external view returns (uint256 amount0, uint256 amount1); + function getRebalanceParams( + IGUniPool pool, + uint256 amount0In, + uint256 amount1In, + uint16 slippageBPS + ) external view returns ( + bool zeroForOne, + uint256 swapAmount, + uint160 swapThreshold + ); + } struct StakingRewardsInfo { @@ -108,7 +103,7 @@ contract DSMath { contract Helpers is DSMath { StakingFactoryInterface public constant getStakingFactory = StakingFactoryInterface(0xf39eC5a471edF20Ecc7db1c2c34B4C73ab4B2C19); - IGUniRouter public constant gelatoRouter = IGUniRouter(0x8CA6fa325bc32f86a12cC4964Edf1f71655007A7); + GUniResolver public constant gelatoRouter = GUniResolver(address(0)); struct UserData { address pool; // address of pool contract @@ -150,11 +145,11 @@ contract Resolver is Helpers { } _data.poolBal = poolContract.balanceOf(user); _data.totalBal = add(_data.stakedBal, _data.poolBal); - (_data.token0Bal, _data.token1Bal) = gelatoRouter.getUnderlyingBalances(poolContract, user, _data.totalBal); + (_data.token0Bal, _data.token1Bal) = gelatoRouter.getUnderlyingBalances(poolContract, _data.totalBal); _data.poolTokenSupply = poolContract.balanceOf(user); (_data.poolToken0Bal, _data.poolToken1Bal) = gelatoRouter.getPoolUnderlyingBalances(poolContract); _data.poolTokenSupplyStaked = stakingContract.totalSupply(); - (_data.stakingToken0Bal, _data.stakingToken1Bal) = gelatoRouter.getUnderlyingBalances(poolContract, _data.staking, _data.poolTokenSupplyStaked); + (_data.stakingToken0Bal, _data.stakingToken1Bal) = gelatoRouter.getUnderlyingBalances(poolContract, _data.poolTokenSupplyStaked); _data.rewardRate = stakingContract.rewardRate(); } @@ -164,4 +159,32 @@ contract Resolver is Helpers { } } + // @param slippage in 18 decimal where 100% = 1e18. + function getSwapAndDepositParams( + address pool, + uint amount0In, + uint amount1In, + uint slippage + ) public view returns ( + bool zeroForOne, + uint256 swapAmount, + uint160 swapThreshold + ) { + uint slippageBPS = slippage / 1e16; + (zeroForOne, swapAmount, swapThreshold) = gelatoRouter.getRebalanceParams(IGUniPool(pool), amount0In, amount1In, uint16(slippageBPS)); + } + + /** + * @param burnPercent in 18 decimal where 100% = 1e18. + * @param slippage in 18 decimal where 100% = 1e18. + */ + function getWithdrawParams(address user, address pool, uint burnPercent, uint slippage) public view returns (uint burnAmt, uint amount0, uint amount1, uint amount0Min, uint amount1Min) { + UserData memory _data = getSinglePosition(user, pool); + burnAmt = wmul(_data.totalBal, burnPercent); + amount0 = wmul(_data.token0Bal, burnPercent); + amount1 = wmul(_data.token1Bal, burnPercent); + amount0Min = wmul(amount0, sub(1e18, slippage)); + amount1Min = wmul(amount1, sub(1e18, slippage)); + } + } From b81bd1f16da1c0b6e92d5e2b1b5c14c6a27ce984 Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Thu, 10 Jun 2021 16:48:15 +0530 Subject: [PATCH 04/11] added gelato resolver address --- contracts/protocols/mainnet/GelatoUniV3pool.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/protocols/mainnet/GelatoUniV3pool.sol b/contracts/protocols/mainnet/GelatoUniV3pool.sol index 6520a57..dff7533 100644 --- a/contracts/protocols/mainnet/GelatoUniV3pool.sol +++ b/contracts/protocols/mainnet/GelatoUniV3pool.sol @@ -12,7 +12,7 @@ interface IGUniPool { function token1() external view returns (IERC20); - // function pool() external view returns (IUniswapV3Pool); + function pool() external view returns (IUniswapV3Pool); function totalSupply() external view returns (uint256); @@ -103,7 +103,7 @@ contract DSMath { contract Helpers is DSMath { StakingFactoryInterface public constant getStakingFactory = StakingFactoryInterface(0xf39eC5a471edF20Ecc7db1c2c34B4C73ab4B2C19); - GUniResolver public constant gelatoRouter = GUniResolver(address(0)); + GUniResolver public constant gelatoRouter = GUniResolver(0xC8b92036cf2bfc5aD2116c9b9Fb3cee2d3b3dc89); struct UserData { address pool; // address of pool contract From 159367ef639e7310af15d60c82dc88b2a693ddcd Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Thu, 10 Jun 2021 16:48:51 +0530 Subject: [PATCH 05/11] removed minor Unnecessary thing --- contracts/protocols/mainnet/GelatoUniV3pool.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/protocols/mainnet/GelatoUniV3pool.sol b/contracts/protocols/mainnet/GelatoUniV3pool.sol index dff7533..8b56db5 100644 --- a/contracts/protocols/mainnet/GelatoUniV3pool.sol +++ b/contracts/protocols/mainnet/GelatoUniV3pool.sol @@ -12,8 +12,6 @@ interface IGUniPool { function token1() external view returns (IERC20); - function pool() external view returns (IUniswapV3Pool); - function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); From 73cdc2729b468bc2fd55e819ad6c97d173d4d110 Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Thu, 10 Jun 2021 18:51:00 +0530 Subject: [PATCH 06/11] updated burnAmt if more than 100% --- contracts/protocols/mainnet/GelatoUniV3pool.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/protocols/mainnet/GelatoUniV3pool.sol b/contracts/protocols/mainnet/GelatoUniV3pool.sol index 8b56db5..c4707d1 100644 --- a/contracts/protocols/mainnet/GelatoUniV3pool.sol +++ b/contracts/protocols/mainnet/GelatoUniV3pool.sol @@ -178,6 +178,7 @@ contract Resolver is Helpers { */ function getWithdrawParams(address user, address pool, uint burnPercent, uint slippage) public view returns (uint burnAmt, uint amount0, uint amount1, uint amount0Min, uint amount1Min) { UserData memory _data = getSinglePosition(user, pool); + burnPercent = burnPercent > 1e18 ? 1e18 : burnPercent; burnAmt = wmul(_data.totalBal, burnPercent); amount0 = wmul(_data.token0Bal, burnPercent); amount1 = wmul(_data.token1Bal, burnPercent); From 8c2a862de01b5c70699dca43b1c175f348b3d632 Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Thu, 10 Jun 2021 19:40:30 +0530 Subject: [PATCH 07/11] added comments --- .../protocols/mainnet/GelatoUniV3pool.sol | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/contracts/protocols/mainnet/GelatoUniV3pool.sol b/contracts/protocols/mainnet/GelatoUniV3pool.sol index c4707d1..be10dca 100644 --- a/contracts/protocols/mainnet/GelatoUniV3pool.sol +++ b/contracts/protocols/mainnet/GelatoUniV3pool.sol @@ -157,7 +157,15 @@ contract Resolver is Helpers { } } - // @param slippage in 18 decimal where 100% = 1e18. + /** + * @param pool - gelato pool address. + * @param amount0In - amount of token0 user wants to deposit. + * @param amount1In - amount of token1 user wants to deposit. + * @param slippage in 18 decimal where 100% = 1e18. + * @return zeroForOne - if true swap token0 for token1 else vice versa + * @return swapAmount - Amount of tokens to swap. + * @return swapThreshold - Max slippage that the swap can take. + */ function getSwapAndDepositParams( address pool, uint amount0In, @@ -173,8 +181,15 @@ contract Resolver is Helpers { } /** - * @param burnPercent in 18 decimal where 100% = 1e18. + * @param user - address of user. + * @param pool - address of Gelato Pool. + * @param burnPercent - in 18 decimal where 100% = 1e18. * @param slippage in 18 decimal where 100% = 1e18. + * @return burnAmount - Amount of pool tokens to burn. + * @return amount0 - Amount of token0 user will get. + * @return amount1 - Amount of token1 user will get. + * @return amount0Min - Min amount of token0 user should get. + * @return amount0Min - Min amount of token1 user should get. */ function getWithdrawParams(address user, address pool, uint burnPercent, uint slippage) public view returns (uint burnAmt, uint amount0, uint amount1, uint amount0Min, uint amount1Min) { UserData memory _data = getSinglePosition(user, pool); From 5f7b4913defa209192cff861b4b0fa021b62b812 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Thu, 10 Jun 2021 20:57:42 +0530 Subject: [PATCH 08/11] minor fix --- contracts/protocols/mainnet/GelatoUniV3pool.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/protocols/mainnet/GelatoUniV3pool.sol b/contracts/protocols/mainnet/GelatoUniV3pool.sol index be10dca..41b1a8d 100644 --- a/contracts/protocols/mainnet/GelatoUniV3pool.sol +++ b/contracts/protocols/mainnet/GelatoUniV3pool.sol @@ -152,6 +152,7 @@ contract Resolver is Helpers { } function getPosition(address user, address[] memory pools) public view returns(UserData[] memory _data) { + _data = new UserData[](pools.length); for (uint i = 0; i < pools.length; i++) { _data[i] = getSinglePosition(user, pools[i]); } From de4663563dea3679f48470e591e4218f31bef1b4 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Thu, 10 Jun 2021 23:13:10 +0530 Subject: [PATCH 09/11] minor change --- contracts/protocols/mainnet/GelatoUniV3pool.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/protocols/mainnet/GelatoUniV3pool.sol b/contracts/protocols/mainnet/GelatoUniV3pool.sol index 41b1a8d..f471959 100644 --- a/contracts/protocols/mainnet/GelatoUniV3pool.sol +++ b/contracts/protocols/mainnet/GelatoUniV3pool.sol @@ -186,11 +186,11 @@ contract Resolver is Helpers { * @param pool - address of Gelato Pool. * @param burnPercent - in 18 decimal where 100% = 1e18. * @param slippage in 18 decimal where 100% = 1e18. - * @return burnAmount - Amount of pool tokens to burn. + * @return burnAmt - Amount of pool tokens to burn. * @return amount0 - Amount of token0 user will get. * @return amount1 - Amount of token1 user will get. * @return amount0Min - Min amount of token0 user should get. - * @return amount0Min - Min amount of token1 user should get. + * @return amount1Min - Min amount of token1 user should get. */ function getWithdrawParams(address user, address pool, uint burnPercent, uint slippage) public view returns (uint burnAmt, uint amount0, uint amount1, uint amount0Min, uint amount1Min) { UserData memory _data = getSinglePosition(user, pool); From a154c76398b6de24198e601462c98e7769650fba Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Sat, 12 Jun 2021 03:18:00 +0530 Subject: [PATCH 10/11] added token decimals & ticks --- .../protocols/mainnet/GelatoUniV3pool.sol | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/contracts/protocols/mainnet/GelatoUniV3pool.sol b/contracts/protocols/mainnet/GelatoUniV3pool.sol index f471959..1b97b48 100644 --- a/contracts/protocols/mainnet/GelatoUniV3pool.sol +++ b/contracts/protocols/mainnet/GelatoUniV3pool.sol @@ -5,6 +5,24 @@ pragma experimental ABIEncoderV2; interface IERC20 { function balanceOf(address) external view returns (uint256); function totalSupply() external view returns (uint256); + function decimals() external view returns (uint256); +} + +interface IUniswapV3Pool { + + function slot0() + external + view + returns ( + uint160 sqrtPriceX96, + int24 tick, + uint16 observationIndex, + uint16 observationCardinality, + uint16 observationCardinalityNext, + uint8 feeProtocol, + bool unlocked + ); + } interface IGUniPool { @@ -12,6 +30,8 @@ interface IGUniPool { function token1() external view returns (IERC20); + function pool() external view returns (IUniswapV3Pool); + function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); @@ -26,6 +46,12 @@ interface IGUniPool { ); function getPositionID() external view returns (bytes32 positionID); + + function lowerTick() external view returns (int24); + + function upperTick() external view returns (int24); + + } interface GUniResolver { @@ -121,6 +147,11 @@ contract Helpers is DSMath { uint stakedBal; // user's pool token bal in staking contract uint poolBal; // ideal pool token in user's DSA uint totalBal; // stakedBal + poolTknBal + uint token0Decimals; + uint token1Decimals; + int24 currentTick; + int24 lowerTick; + int24 upperTick; } } @@ -149,6 +180,14 @@ contract Resolver is Helpers { _data.poolTokenSupplyStaked = stakingContract.totalSupply(); (_data.stakingToken0Bal, _data.stakingToken1Bal) = gelatoRouter.getUnderlyingBalances(poolContract, _data.poolTokenSupplyStaked); _data.rewardRate = stakingContract.rewardRate(); + + _data.token0Decimals = poolContract.token0().decimals(); + _data.token1Decimals = poolContract.token1().decimals(); + + IUniswapV3Pool uniNft = poolContract.pool(); + (, _data.currentTick, , , , , ) = uniNft.slot0(); + _data.lowerTick = poolContract.lowerTick(); + _data.upperTick = poolContract.upperTick(); } function getPosition(address user, address[] memory pools) public view returns(UserData[] memory _data) { @@ -202,4 +241,4 @@ contract Resolver is Helpers { amount1Min = wmul(amount1, sub(1e18, slippage)); } -} +} \ No newline at end of file From 7407a6d47d40ff2d877a984c61bbb5705f4c770a Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Sat, 12 Jun 2021 14:04:13 +0530 Subject: [PATCH 11/11] updated the comment --- contracts/protocols/mainnet/GelatoUniV3pool.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/protocols/mainnet/GelatoUniV3pool.sol b/contracts/protocols/mainnet/GelatoUniV3pool.sol index 1b97b48..0b30823 100644 --- a/contracts/protocols/mainnet/GelatoUniV3pool.sol +++ b/contracts/protocols/mainnet/GelatoUniV3pool.sol @@ -147,11 +147,11 @@ contract Helpers is DSMath { uint stakedBal; // user's pool token bal in staking contract uint poolBal; // ideal pool token in user's DSA uint totalBal; // stakedBal + poolTknBal - uint token0Decimals; - uint token1Decimals; - int24 currentTick; - int24 lowerTick; - int24 upperTick; + uint token0Decimals; // token0 decimals + uint token1Decimals; // token1 decimals + int24 currentTick; // Current price of 1 token w.r.t to other + int24 lowerTick; // Price of 1 token w.r.t to other at lower tick + int24 upperTick; // Price of 1 token w.r.t to other at upper tick } }