mirror of
				https://github.com/Instadapp/dsa-resolvers-deprecated.git
				synced 2024-07-29 22:38:16 +00:00 
			
		
		
		
	add Gelato Uniswap v3 resolver
This commit is contained in:
		
							parent
							
								
									db43810077
								
							
						
					
					
						commit
						282ae5cd0d
					
				
							
								
								
									
										159
									
								
								contracts/protocols/mainnet/GelatoUniV3pool.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								contracts/protocols/mainnet/GelatoUniV3pool.sol
									
									
									
									
									
										Normal file
									
								
							|  | @ -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() | ||||
| 
 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Samyak Jain
						Samyak Jain