Providing liquidity and staking your position NFT to earn rewards
Providing liquidity on Uniswap V3 makes the position eligible to earn swap fees if the swap takes place within the interval to which the liquidity was added. If incentives are available, a liquidity provider (LP) can stake its position NFT to mine those rewards as well. This guide explains how to mine additional liquidity incentives when they are available.
It seems that the gas estimation for some of the methods described below does not work within Metamask. Use common sense and don't pay ridiculous amounts of Ethereum for gas for these simple transactions. In case of doubt, contact Synternet team on Discord, we will try to help. It is recommended to start staking position NFT on the incentive after it has been started.
Current incentives
- The incentivised period is the first half of 2025, precisely from 2024-12-21 to 2025-06-21.
- The total amount of incentives: 450,000 SYNT
- A summary of data, which will be needed to liquidity providers (LPs) to mine the incentives and query their reward info:
{
"incentive": {
"rewardTokenAddress": "0xDA987c655ebC38C801DB64A8608bc1AA56Cd9a31",
"poolAddress": "0x5A6799c11AFb8Aa3B766f354d2d9863dDa118553",
"startDateUnix": "1734742800",
"endDateUnix": "1750464000",
"refundeeAddress": "0xf71F736Bb50125109967dA6572c5acFDE03F1467"
},
"reward": "450000000000000000000000",
"keys": {
"incentiveHash": "0x0177b54049c187304150e6d663661e364b3ecc9e950305d31dcb8aab1f8d4ee7",
"incentiveKey": "0x000000000000000000000000da987c655ebc38c801db64a8608bc1aa56cd9a310000000000000000000000005a6799c11afb8aa3b766f354d2d9863dda1185530000000000000000000000000000000000000000000000000000000067661310000000000000000000000000000000000000000000000000000000006855f600000000000000000000000000f71f736bb50125109967da6572c5acfde03f1467"
}
}
- Key for querying accumulated rewards:
["0xDA987c655ebC38C801DB64A8608bc1AA56Cd9a31","0x5A6799c11AFb8Aa3B766f354d2d9863dDa118553",1734742800,1750464000,"0xf71F736Bb50125109967dA6572c5acFDE03F1467"]
Initial incentives
Initial incentives programme to promote liquidity provision on the Uniswap V3 SYNT/ETH pool has started on 2024-11-20. A total of 75,000 SYNT tokens were added as incentives for the period of 30 days.
A relevant Uniswap V3 SYNT/ETH pool address (on Uniswap UI it is the one with positive TVL and 0.3% fee): 0x5A6799c11AFb8Aa3B766f354d2d9863dDa118553.
Uniswap V3: Staker contract address: 0xe34139463bA50bD61336E0c446Bd8C0867c6fE65. All official Uniswap deployment addresses can be found in their documentation.
A summary of data, which will be needed to liquidity providers (LPs) to mine the incentives and query their reward info:
{
"incentive": {
"rewardTokenAddress": "0xDA987c655ebC38C801DB64A8608bc1AA56Cd9a31",
"poolAddress": "0x5A6799c11AFb8Aa3B766f354d2d9863dDa118553",
"startDateUnix": "1732060800",
"endDateUnix": "1734652800",
"refundeeAddress": "0xf71F736Bb50125109967dA6572c5acFDE03F1467"
},
"reward": "75000000000000000000000",
"keys": {
"incentiveHash": "0x202ed58994ceb2503377b441f33007c828898213a6660ddcf68341c385e87c00",
"incentiveKey": "0x000000000000000000000000da987c655ebc38c801db64a8608bc1aa56cd9a310000000000000000000000005a6799c11afb8aa3b766f354d2d9863dda11855300000000000000000000000000000000000000000000000000000000673d2680000000000000000000000000000000000000000000000000000000006764b380000000000000000000000000f71f736bb50125109967da6572c5acfde03f1467"
}
}
Creating a liquidity position
The first step is of course to create a liquidity position. This is done via Uniswap UI, which this guide is currently not covering.
To start mining rewards, a liquidity provider will need to make two more transactions:
1) approve position NFT token on Staker contract 2) send it to Staker contract in oder to deposit and stake the token in a single action.
Interacting with NFT and Staker smart contracts
The guide will be using Etherscan UI. In order to send transactions via Etherscan, a user needs to connect to UI using MetaMask, WalletConnect, or Coinbase Wallet. Thus, all common hardware wallets are also supported as well.
Figure: Connecting to Etherscan UI is necessary for sending transactions
In case you want to provide liquidity as a multisig address, it is also possible to use Safe Wallet to interact with these smart contracts.
Step 1: Approve NFT on Staker
When liquidity position is created on Uniswap V3 protocol, an NFT corresponding to that position is minted and added to the LP's account that have added the liquidity. The first transaction (a cheap one) is to use approve (0x095ea7b3)
method from Uniswap V3: Positions NFT contract.
Arguments:
- to:
0xe34139463bA50bD61336E0c446Bd8C0867c6fE65
(Uniswap V3: Staker contract address) - tokenId:
000000
(this is a placeholder, use your NFT's Token ID)
Figure: Approving your liquidity position NFT on Staker contract
The transaction, when successful, will look like this.
Step 2: Send NFT to Staker
Second transaction will deposit and stake your NFT on the Staker contract (this is a more expensive one, because it is actually at least 2 on-chain actions rolled into a single transaction). Use safeTransferFrom (0xb88d4fde)
method from Uniswap V3: Positions NFT contract.
There are two methods with exactly the same name, but different hash signature, pay attention to that, also the method needed has _data
argument, which is very important, another one doesn’t have it.
Arguments:
- from:
0x......
(this is a placeholder, use the same address that you used to create liquidity position and which owns the NFT, it is also the same wallet address that is signing these transactions) - to:
0xe34139463bA50bD61336E0c446Bd8C0867c6fE65
(Uniswap V3: Staker contract address) - tokenId:
000000
(this is a placeholder, use your NFT's Token ID) - _data:
0x000000000000000000000000da987c655ebc38c801db64a8608bc1aa56cd9a310000000000000000000000005a6799c11afb8aa3b766f354d2d9863dda11855300000000000000000000000000000000000000000000000000000000673d2680000000000000000000000000000000000000000000000000000000006764b380000000000000000000000000f71f736bb50125109967da6572c5acfde03f1467
(this is unhashedincentiveKey
from the data JSON above, only this value is valid for an initial incentives program, use exactly this string. Also note, that this is valid for the initial incentives only, use the appropriate incentives' data)
Figure: Sending your liquidity position NFT to Staker contract deposits it and also stakes it
The transaction, when successful, will look like this.
Step 3: Query accumulated rewards
After these two transactions are done, the rewards being mined can already be seen via getRewardInfo
method on Uniswap V3: Staker contract. Thankfully, querying doesn’t cost anything! Also, there's no need to connect a wallet to Etherscan.
Arguments:
- key:
["0xDA987c655ebC38C801DB64A8608bc1AA56Cd9a31","0x5A6799c11AFb8Aa3B766f354d2d9863dDa118553",1732060800,1734652800,"0xf71F736Bb50125109967dA6572c5acFDE03F1467"]
(use exactly this, with all the parentheses, commas, etc. This is a "human readable" key of the incentive - a combination of info from the first message in the format ["Reward token","pool address",start date,end date,"refundee"]. Also note, that this is valid for the initial incentives only, use the appropriate incentives key) - tokenId:
000000
(this is a placeholder, use your NFT's Token ID)
Figure: Querying how much rewards have been accumulated
Step 4: Unstake NFT from Staker
To withdraw rewards, the position NFT first needs to be unstaked from the incentive.
Reward withdrawing is done via unstakeToken (0xf549ab42)
method on Uniswap V3: Staker contract.
Arguments:
- key (tuple): (here we are using the same fields that have been used to request the reward info)
- rewardToken:
0xDA987c655ebC38C801DB64A8608bc1AA56Cd9a31
(the SYNT token address, so this won't change) - pool:
0x5A6799c11AFb8Aa3B766f354d2d9863dDa118553
(Uniswap V3 pool, so this also won't change) - startTime:
1732060800
(valid for the initial incentives only, use the appropriate incentives' data) - endTime:
1734652800
(valid for the initial incentives only, use the appropriate incentives' data) - refundee:
0xf71F736Bb50125109967dA6572c5acFDE03F1467
(valid for the initial incentives only, use the appropriate incentives key)
- rewardToken:
- tokenId:
000000
(this is a placeholder, use your NFT's Token ID)
Figure: Unstaking your liquidity position NFT on Staker contract won't transfer it back to your wallet just yet
The NFT will not be transferred back to its owner account, it is only unstaked via this command. Use withdrawToken
method for that (see below). However, if after a particular incentive ends and the new one starts, if the price is within the price interval set in the position, it makes sense to just stake the token on the new incentives program using stakeToken
method (see below).
Step 5: Claim rewards
After the token was unstaked form a specific incentive, rewards can be claimed. This is done via claimReward (0x2f2d783d)
method on Uniswap V3: Staker contract.
Arguments:
- rewardToken:
0xDA987c655ebC38C801DB64A8608bc1AA56Cd9a31
(the SYNT token address, so this won't change) - to:
0x0000000000000000000000000000000000000000
(this is a placeholder, use the account address that is providing liquidity) - amountRequested:
0
(use zero to withdraw all available rewards)
Figure: Claiming your rewards on Staker contract will send them to your wallet
Note that you can claim the rewards only after you unstake your NFT from the Uniswap V3: Staker contract.
Next steps: Withdraw NFT or stake again
As mentioned, after one incentive program ends, another should begin. Therefore, it makes sense to just stake the position NFT on a new incentive, but only if the market price is within the price interval of that position. To stake on a new incentive use stakeToken (0xf2d2909b)
method on Uniswap V3: Staker contract.
Arguments:
- key (tuple): (here we are using the same fields that have been used to request the reward info)
- rewardToken:
0xDA987c655ebC38C801DB64A8608bc1AA56Cd9a31
(the SYNT token address, so this won't change) - pool:
0x5A6799c11AFb8Aa3B766f354d2d9863dDa118553
(Uniswap V3 pool, so this also won't change) - startTime:
1732060800
(valid for the initial incentives only, use the appropriate incentives' data) - endTime:
1734652800
(valid for the initial incentives only, use the appropriate incentives' data) - refundee:
0xf71F736Bb50125109967dA6572c5acFDE03F1467
(valid for the initial incentives only, use the appropriate incentives key)
- rewardToken:
- tokenId:
000000
(placeholder here, use your NFT's Token ID)
Figure: You can stake your position NFT on as many incentives as there are available
Alternatively, you can withdraw NFT token back to your wallet using withdrawToken (0x3c423f0b)
method on Uniswap V3: Staker contract.
Arguments:
- tokenId:
000000
(this is a placeholder, use your NFT's Token ID) - to:
0x0000000000000000000000000000000000000000
(this is a placeholder, use the account address that is providing liquidity) - data:
0x0
(this is an optional argument and unimportant in this case, so use this zero hex value)
Figure: Withdrawing your position NFT from Staker contract will send it to your wallet