mirror of
				https://github.com/Instadapp/dsa-connectors.git
				synced 2024-07-29 22:37:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
pragma solidity ^0.7.6;
 | 
						|
pragma abicoder v2;
 | 
						|
 | 
						|
import {TokenInterface} from "../../../common/interfaces.sol";
 | 
						|
import {DSMath} from "../../../common/math.sol";
 | 
						|
import {Basic} from "../../../common/basic.sol";
 | 
						|
import "./interface.sol";
 | 
						|
import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol";
 | 
						|
import "@uniswap/v3-core/contracts/libraries/TickMath.sol";
 | 
						|
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
 | 
						|
import "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol";
 | 
						|
 | 
						|
abstract contract Helpers is DSMath, Basic {
 | 
						|
    /**
 | 
						|
     * @dev uniswap v3 NFT Position Manager & Swap Router
 | 
						|
     */
 | 
						|
    INonfungiblePositionManager constant nftManager =
 | 
						|
        INonfungiblePositionManager(0xC36442b4a4522E871399CD717aBDD847Ab11FE88);
 | 
						|
    IUniswapV3Staker constant staker =
 | 
						|
        IUniswapV3Staker(0x1f98407aaB862CdDeF78Ed252D6f557aA5b0f00d);
 | 
						|
 | 
						|
    /**
 | 
						|
     * @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 getPoolAddress(uint256 _tokenId)
 | 
						|
        internal
 | 
						|
        view
 | 
						|
        returns (address pool)
 | 
						|
    {
 | 
						|
        (bool success, bytes memory data) = address(nftManager).staticcall(
 | 
						|
            abi.encodeWithSelector(nftManager.positions.selector, _tokenId)
 | 
						|
        );
 | 
						|
        require(success, "fetching positions failed");
 | 
						|
        {
 | 
						|
            (, , address token0, address token1, uint24 fee, , , ) = abi.decode(
 | 
						|
                data,
 | 
						|
                (
 | 
						|
                    uint96,
 | 
						|
                    address,
 | 
						|
                    address,
 | 
						|
                    address,
 | 
						|
                    uint24,
 | 
						|
                    int24,
 | 
						|
                    int24,
 | 
						|
                    uint128
 | 
						|
                )
 | 
						|
            );
 | 
						|
 | 
						|
            pool = PoolAddress.computeAddress(
 | 
						|
                nftManager.factory(),
 | 
						|
                PoolAddress.PoolKey({token0: token0, token1: token1, fee: fee})
 | 
						|
            );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function _stake(
 | 
						|
        uint256 _tokenId,
 | 
						|
        IUniswapV3Staker.IncentiveKey memory _incentiveId
 | 
						|
    ) internal {
 | 
						|
        staker.stakeToken(_incentiveId, _tokenId);
 | 
						|
    }
 | 
						|
 | 
						|
    function _unstake(
 | 
						|
        IUniswapV3Staker.IncentiveKey memory _key,
 | 
						|
        uint256 _tokenId
 | 
						|
    ) internal {
 | 
						|
        staker.unstakeToken(_key, _tokenId);
 | 
						|
    }
 | 
						|
 | 
						|
    function _claimRewards(
 | 
						|
        IERC20Minimal _rewardToken,
 | 
						|
        address _to,
 | 
						|
        uint256 _amountRequested
 | 
						|
    ) internal returns (uint256 rewards) {
 | 
						|
        rewards = staker.claimReward(_rewardToken, _to, _amountRequested);
 | 
						|
    }
 | 
						|
}
 |