TL;DR: UNI liquidity mining rewards should be based on the amount of time the price is within the LP token’s range.
The goal of the liquidity mining program should be to increase active liquidity. What I mean by active liquidity? Let’s look at a few pools on mainnet:
First, ETH-USDC-0.3%: info[dot]uniswap[dot]org/#/pools/0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 (I can’t embed links or media it seems, otherwise I would have posted a screenshot).
We’ve had a rather large downward price move in recent days and the “liquidity peak” is away from the current price. However, there are still enough funds locked at the current tick (>2M USDC in active liquidity) to limit slippage and be resilient against large buys-sells.
On the other hand, let’s look at the ETH-MKR-0.3% pool: info[dot]uniswap[dot]org/#/pools/0xe8c6c9227491c0a8156a0106a0204d881bb7e531
There is only 1.87 ETH lock at the current tick, that’s only $7,500 out of the $355m in TVL (!!). As a result, a relatively small transaction can drastically shift the price of MKR. Clearly, most LPs do not care about rebalancing, or perhaps they’re OK holding MKR, but the amount of active liquidity is way too small compared to the TVL.
The problem with the current LP staking contract is that it rewards users according to the effective liquidity, which is basically proportional to the amount of fees collected. Whales and market makers can easily shift their LP position in response to large price moves because gas costs will not matter as much once you cross a certain level (>$10,000?).
Smaller players, on the other hand, will rapidly get wiped out because burn+rebalance+re-deploy may incur $100’s in gas fees.
How do we solve this? How can smaller players that do not have time to actively manage their LP position still be rewarded for contributing liquidity in a manner that is proportional to their actual stake?
I am proposing to reward all LPs who have any amount of liquidity at the current tick.
For example, if the current price is 4,280, then locking 1 ETH in the ETH-USDC pool between 1,000-32,000 will receive as much UNI reward as locking 1 ETH between 4275-4300. But LPs that deployed 1 ETH to either 1000-4000 or 4500-4535 or any range that do not contain the current price will receive nothing.
Why do it like that?
- It’s relatively easy to monitor that time spent inside any given range by calling snapshotCumulativesInside.
- Whales and market makers that actively rebalance their position already benefit by collecting a disproportionate amount of the collected trading fees. They have their cake.
- A more conservative position will receive as much reward as a more aggressive one, but the conservative option does not suffer IL because it won’t need to be rebalanced as frequently. Easier to manage for most users.
- By rewarding according to the time spent “in-the-money”, aggressive LPs would actually receive a lower relative fraction of the rewards because the price will leave a narrowly defined range (ie. 1-tick) after small price movements whereas a wider one will remain “in-the-money”.
- Using a fixed % range may still leave pools under-liquid in case of large price moves. What’s the best percentage? 20% is way too wide for DAI-USDC, but may be too narrow for ETH-WBTC. What’s the best range? Even a 1-standard deviation expected price move will still be “wrong” 32% of the time.
- The fixed-range option still rewards power-users and market makers and will leave smaller LPs with a much lower reward.
But clearly, making everyone deploying to the Full-Range (which is worse than Uniswap v2 in terms of capital efficiency) would not contribute sufficient liquidity to decrease slippage, etc.
What’s a good limit for the maximum range?
I suggest that any position whose range is chosen so that the capital efficiency is greater than 2x that of Uniswap v2 should be rewarded. By the way, the calculation for capital efficiency improvement over Uniswap v2 is:
(Capital efficiency) = sqrt(r)/(sqrt(r)-1) = 1/(1-1/sqrt(r))
So a Full-range liquidity would receive zero rewards, and any liquidity whose range factor r = sqrt(upperTick/lowerTick) is smaller than r < 4 will receive liquidity mining rewards.
The r < 4 criteria could be changed (a 4x price move is indeed unlikely for most assets), but r=4 LPs would still be performing 2x better than Uniswap v2.