# DragonswapV2Staker

Below is the technical reference for the staker contract, [DragonswapV2Staker.sol](https://github.com/dragonswap-app/v2-staker/blob/master/contracts/DragonswapV2Staker.sol). A technical guide for interacting with this staking contract will be released soon.

### Functions[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#functions) <a href="#functions" id="functions"></a>

#### stakes[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#stakes) <a href="#stakes" id="stakes"></a>

```solidity
  function stakes(
    uint256 tokenId,
    bytes32 incentiveId
  ) public view override returns (uint160 secondsPerLiquidityInsideInitialX128, uint128 liquidity)
```

Returns information about a staked liquidity NFT

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#parameters)

| Name          | Type    | Description                                           |
| ------------- | ------- | ----------------------------------------------------- |
| `tokenId`     | uint256 | The ID of the staked token                            |
| `incentiveId` | bytes32 | The ID of the incentive for which the token is staked |

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#return-values)

| Name                                   | Type    | Description                                                                      |
| -------------------------------------- | ------- | -------------------------------------------------------------------------------- |
| `secondsPerLiquidityInsideInitialX128` | uint160 | secondsPerLiquidity represented as a UQ32.128                                    |
| `liquidity`                            | bytes32 | The amount of liquidity in the NFT as of the last time the rewards were computed |

#### constructor[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#constructor) <a href="#constructor" id="constructor"></a>

```solidity
  function constructor(
    contract IDragonswapV2Factory _factory,
    contract INonfungiblePositionManager _nonfungiblePositionManager,
    uint256 _maxIncentiveStartLeadTime,
    uint256 _maxIncentiveDuration
  ) public
```

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#parameters-1)

| Name                          | Type                                 | Description                                                                  |
| ----------------------------- | ------------------------------------ | ---------------------------------------------------------------------------- |
| `_factory`                    | contract IDragonswapV2Factory        | the DragonswapV2 factory                                                     |
| `_nonfungiblePositionManager` | contract INonfungiblePositionManager | the NFT position manager contract address                                    |
| `_maxIncentiveStartLeadTime`  | uint256                              | the max duration of an incentive in seconds                                  |
| `_maxIncentiveDuration`       | uint256                              | the max amount of seconds into the future the incentive startTime can be set |

#### createIncentive[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#createincentive) <a href="#createincentive" id="createincentive"></a>

```solidity
  function createIncentive(
    struct IDragonswapV2Staker.IncentiveKey key,
    uint256 reward
  ) external
```

Creates a new liquidity mining incentive program

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#parameters-2)

| Name     | Type                                    | Description                                   |
| -------- | --------------------------------------- | --------------------------------------------- |
| `key`    | struct IDragonswapV2Staker.IncentiveKey | Details of the incentive to create            |
| `reward` | uint256                                 | The amount of reward tokens to be distributed |

#### endIncentive[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#endincentive) <a href="#endincentive" id="endincentive"></a>

```solidity
  function endIncentive(
    struct IDragonswapV2Staker.IncentiveKey key
  ) external returns (uint256 refund)
```

Ends an incentive after the incentive end time has passed and all stakes have been withdrawn

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#parameters-3)

| Name  | Type                                    | Description                     |
| ----- | --------------------------------------- | ------------------------------- |
| `key` | struct IDragonswapV2Staker.IncentiveKey | Details of the incentive to end |

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#return-values-1)

| Name     | Type    | Description                                             |
| -------- | ------- | ------------------------------------------------------- |
| `refund` | uint256 | The remaining reward tokens when the incentive is ended |

#### onERC721Received[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#onerc721received) <a href="#onerc721received" id="onerc721received"></a>

```solidity
  function onERC721Received(
  ) external returns (bytes4)
```

Upon receiving a DragonswapV2 ERC721, creates the token deposit setting owner to `from`. Also stakes token in one or more incentives if properly formatted `data` has a length > 0.

Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} by `operator` from `from`, this function is called. It must return its Solidity selector to confirm the token transfer. If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.

#### transferDeposit[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#transferdeposit) <a href="#transferdeposit" id="transferdeposit"></a>

```solidity
  function transferDeposit(
    uint256 tokenId,
    address to
  ) external
```

Transfers ownership of a deposit from the sender to the given recipient

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#parameters-4)

| Name      | Type    | Description                                       |
| --------- | ------- | ------------------------------------------------- |
| `tokenId` | uint256 | The ID of the token (and the deposit) to transfer |
| `to`      | address | The new owner of the deposit                      |

#### withdrawToken[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#withdrawtoken) <a href="#withdrawtoken" id="withdrawtoken"></a>

```solidity
  function withdrawToken(
    uint256 tokenId,
    address to,
    bytes data
  ) external
```

Withdraws a DragonswapV2 LP token `tokenId` from this contract to the recipient `to`

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#parameters-5)

| Name      | Type    | Description                                                                                       |
| --------- | ------- | ------------------------------------------------------------------------------------------------- |
| `tokenId` | uint256 | The unique identifier of an DragonswapV2 LP token                                                 |
| `to`      | address | The address where the LP token will be sent                                                       |
| `data`    | bytes   | An optional data array that will be passed along to the `to` address via the NFT safeTransferFrom |

#### stakeToken[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#staketoken) <a href="#staketoken" id="staketoken"></a>

```solidity
  function stakeToken(
    struct IDragonswapV2Staker.IncentiveKey key,
    uint256 tokenId
  ) external
```

Stakes a DragonswapV2 LP token

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#parameters-6)

| Name      | Type                                    | Description                                         |
| --------- | --------------------------------------- | --------------------------------------------------- |
| `key`     | struct IDragonswapV2Staker.IncentiveKey | The key of the incentive for which to stake the NFT |
| `tokenId` | uint256                                 | The ID of the token to stake                        |

#### unstakeToken[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#unstaketoken) <a href="#unstaketoken" id="unstaketoken"></a>

```solidity
  function unstakeToken(
    struct IDragonswapV2Staker.IncentiveKey key,
    uint256 tokenId
  ) external
```

Unstakes a DragonswapV2 LP token

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#parameters-7)

| Name      | Type                                    | Description                                           |
| --------- | --------------------------------------- | ----------------------------------------------------- |
| `key`     | struct IDragonswapV2Staker.IncentiveKey | The key of the incentive for which to unstake the NFT |
| `tokenId` | uint256                                 | The ID of the token to unstake                        |

#### claimReward[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#claimreward) <a href="#claimreward" id="claimreward"></a>

```solidity
  function claimReward(
    contract IERC20Minimal rewardToken,
    address to,
    uint256 amountRequested
  ) external override returns (uint256 reward)
```

Transfers `amountRequested` of accrued `rewardToken` rewards from the contract to the recipient `to`

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#parameters-8)

| Name              | Type                   | Description                                                                    |
| ----------------- | ---------------------- | ------------------------------------------------------------------------------ |
| `rewardToken`     | contract IERC20Minimal | The token being distributed as a reward                                        |
| `to`              | address                | The address where claimed rewards will be sent to                              |
| `amountRequested` | uint256                | The amount of reward tokens to claim. Claims entire reward amount if set to 0. |

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#return-values-2)

| Name     | Type    | Description                         |
| -------- | ------- | ----------------------------------- |
| `reward` | uint256 | The amount of reward tokens claimed |

#### getRewardInfo[​](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#getrewardinfo) <a href="#getrewardinfo" id="getrewardinfo"></a>

```solidity
  function getRewardInfo(
    struct IDragonswapV2Staker.IncentiveKey key,
    uint256 tokenId
  ) external view override returns (uint256 reward, uint160 secondsInsideX128)
```

Calculates the reward amount that will be received for the given stake

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#parameters-9)

| Name      | Type                                    | Description              |
| --------- | --------------------------------------- | ------------------------ |
| `key`     | struct IDragonswapV2Staker.IncentiveKey | The key of the incentive |
| `tokenId` | uint256                                 | The ID of the token      |

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/staker/UniswapV3Staker#return-values-3)

| Name                | Type    | Description                                                    |
| ------------------- | ------- | -------------------------------------------------------------- |
| `reward`            | uint256 | The reward accrued to the NFT for the given incentive thus far |
| `secondsInsideX128` | uint160 | The seconds inside the tick range                              |
