A Formulaic Approach to Minswap’s MIN Emissions
I have been using Minswap Labs DEX since they launched. I was extremely impressed with their FISO, their LBE for Protocol Owned Liquidity, the fact that they open sourced their code, and their overall community oriented approach to everything they do. After they announced their farming pools, I was curious how they would change the MIN Emissions. madBlocks was on their discord talking about a more quantitative way of determining how MIN Emissions would change over time. We put our heads together and came up with a unique solution that is parameterized but uses live inputs from the DEX and the Liquidity Pools to determine MIN Emissions. After discussing with @PurritoGeneral, I think we have found a dynamic approach that would satisfy all parties.
Why do we need a formulaic approach?
As of now, current Minswap MIN Farming Emissions have been set by the team. These emissions should change over time. But how should they change? Who should determine how the emissions change, and what farms get more or less emissions? Given we do not have a good way of allowing MIN holders to vote for pools, a formula driven approach can be an objective solution to choosing MIN Emission Points (MEPs) per liquidity pool.
After many discussions with madBlocks and @PurritoGeneral, I have come up with a formalized model that derives the MIN emissions per pool in a purely data-driven manner. The model looks at the 14 day moving average of TVL and 14 day moving average of Volume. The model rewards pools that have high Volume and low TVL. Volume is more important (currently 4x more important).This is because for a DEX, Volume is the most important metric, as it is what determines the swap fees for LPs, and an indicator of how much traffic it gets. So essentially, for a DEX, Volume is equivalent to what the Revenue would be in a company, and it should be maximized.
Then the model uses the Volume and TVL metrics to come up with a number somewhere between 0 and 1 for each LP. That number is used to put each LP somewhere between the Minimum and Maximum MIN Emissions Points (MEPs) Allocation, which is a parameter of the model. So if the number is 0 the LP gets its minimum allowed MEPs. If the number is 1, the LP is capped at the maximum allowed MEPs. Minimum and Maximum allocations are set based on what Farm Group the pool is in.
What are the inputs?
- 14 Day Average Daily Volume (14D ADV) — This measure is a smoothed measure of the volume transacted in a LP over the past 14 days. The long term success of a DEX is driven by deep liquidity and volume. Token emissions cannot last forever, so eventually LP rewards will come down to volume only. A DEX that has strong volume after emissions end will continue to incentivize people to provide liquidity to the LPs. We should be rewarding pools with high volume.
- 14 Day Average Total Value Locked (14D Ave TVL) — This measure is a smoothed measure of the Total Value Locked inside of an LP over the past 14 days. TVL shows how deep the liquidity of a pool is. Deeper liquidity means less slippage for anyone who wants to transact in that pair of tokens. So deeper liquidity incentivizes people to use Minswap DEX to swap this specific pair of tokens. If a token pair has deeper liquidity on a competing DEX, it is highly likely that the competing DEX will have better pricing. We should be rewarding pools with lower TVL in order to incentivize people to deposit liquidity in those pools, and drive volume to Minswap.
Parameters of the Model (eventually controlled by a DAO)
Parameters are important to help the model stay within reasonable bounds. These parameters are changeable and we fully expect them to change as farms are included and/or removed and as the DEX evolves over time. Note that I use MIN Emissions Points (MEPs) as a way of saying what percent of MIN Emissions each pool will get. So if the MIN/ADA LP has MEPs of 50, they would get 50% of the daily MIN emissions.
- Minimum and Maximum MEPs per LP — These are arguably the most important parameters of the model. Each LP group (Lion, Tiger, Cat, Kitty, Dog, respectively groups 1, 2, 3, 4, 5) will only be allowed MEPs (out of all daily emissions) within their minimum and maximum bounds. This is a way of saying we believe MIN/ADA is (currently) the most important pair to the DEX, and we want to make sure MIN/ADA LP gets at least 50% (for example) as its minimum MEP.
- As more LPs are admitted to the MIN Emission Farms, parameters may need to be adjusted. For example, once there is a stablecoin on Cardano, we may want to reward MIN/Stable with a similar amount as MIN/ADA. So MIN/Stable will be in Farm Group 1, and maybe Farm group 1 will now have 25%-30% as their minimum and maximum bounds.
- T/V Ratio — This parameter decides how much weight is given to rewarding low TVL versus high volume. It is set between 0 and 1. At 0%, all weight is given to rewarding high volume. At 100%, all weight is given to rewarding low TVL. Currently have it set to 20%. So Volume is 4x more important than TVL.
- TVPcts — This parameter decides how much of the final MEPs should be determined by the TVL & Volume together. This parameter is set between 0 and 1. At 0%, no MEPs weights are determined to TVL and/or Volume. At 100%, all of the MEPs weights are determined by TVL and/or Volume. This is currently set to 100%. We believe the formula is actually parameterized pretty well. We want to give this formula a chance to live and breathe on its own, and allow the model to be as objective as possible from the get-go.
- PrevMEPsPcts — This parameter decides how much of the final MEPs should be determined by the Previous MEPs (currently set by the Minswap team). This parameter is set between 0 and 1. At 0%, no MEPs weights are determined to Previous MEPs. At 100%, the current MEPs will equal the previous MEPs (so no change to MEPs). This is currently set to 0%.
- MINWarsPcts — This parameter decides how much of the final MEPs should be determined by the community voting on MEPs (currently not possible). This parameter is set between 0 and 1. At 0%, no MEPs weights are determined by community voting. At 100%, all weights are determined by community voting (potential Curve Wars on Minswap anyone?? see bottom of post for TL;DR on Curve Wars). This is currently set to 0% since it is not possible to vote.
- SC — This is a scaling parameter. Since there are 11 different pools, imagine if every pool had equal TVL and ADV. They would get a TVL/ADV Weight of 9.09% each. If we use the Square Root function to scale these, we would get 30%. If SC = 1.5, this number goes up to 45%. This 45% is then used to put each LP 45% between their Minimum and Maximum MEPs constraints.
- Threshold — This is just used as a buffer around the Minimum and Maximum MEPs to make sure that no LP goes outside of its boundaries.
The model is a parameterized way of using Volume and TVL to reward pools with high Volume and low TVL with MIN Emissions. It is complicated because we want to be able to bound pools to minimum and maximum MEPs based on what LP group they are in.
Step 1&2 — For each pool(x), calculate the TVL/ADV weight. The ADV weight is simply the 14D Average Daily Volume of LP(x) divided by the Sum of all ADVs. The TVL is essentially the inverse, a harmonic weight instead of a standard arithmetic weight. Then blend these two weights together using the T/V Ratio parameters.
Step 3 — Take the square root of the calculated TVL/ADV weight for LP(x), then multiply by the SC parameter. We will call this SCALAR LP(x).
Step 4 — Calculate the Raw MEPs for LP(x) by taking the Minimum MEPs for LP(x) parameter + SCALAR LP(x) times the difference between the Maximum and Minimum MEP for LP(x). Essentially we are using the SCALAR LP(x) to place the Raw MEPs for LP(x) somewhere between the Minimum and Maximum parameters for the LP(x). The higher the SCALAR LP(x), the closer the Raw MEPs will be to the Maximum allowed MEPs.
If we sum all of the Raw MEPs for all LPs, it most likely will not sum to 100%. So we will find the residual by taking 1 minus the sum of the Raw MEPs. We will use this residual in the next step
Step 5 — First we need to find an indicator if the Raw MEPs for LP(x) are at either the Minimum or Maximum (adjusted by our threshold parameter). Then we want to distribute the residual from Step 4 to all LPs that are not at their Minimums or Maximums. We distribute the residual pro-rata based on the SCALAR LP(x)s. This step has the potential to not sum to 100% as well, as the pro-rata distribution might have pushed one of the LPs to its maximum or minimum. So we will need to calculate another residual here.
Step 6 — This is essentially the same as Step 5, just using the MEPs and residual from Step 5. Hopefully this step will lead to everything summing to 100%. It’s theoretically possible that this step won’t sum to 100% either. You could loop Step 5 until the sum of MEPs = 100%.
Step 7 (no MINWars)– This blends the formula derived MEPs from Step 6 with the previous period’s MEPs, using the PrevMEPPcts parameter. This is a way of smoothing the period over period MEP Change. If the TVPcts = 100%, then the final LP(x) = step 6 Temp2 LP(x).
Step 7 (with MINWars)– This blends the formula derived MEPs from Step 6 with the Community Votes (MWGauge), using the MINWarsPcts parameter, and also blends the previous period’s MEPs, using the PrevMEPPcts parameter. The formula below shows an example where we do not allow people to vote for certain pools (like MIN/ADA or HOSKY/ADA). These LPs would be ‘excluded pools’. Excluded pools would have their final MEPs using only TVL, Volume and Previous MEPs. Step 7a excludes the excluded pools and comes up with semi-final MEPs. Step 7b makes sure that everything sums to 100%.
Appendix — Current Parameters
Current Minimum and Maximums
Current LPs and their respective Farm Groups
TL;DR Curve Wars
Curve is a stablecoin DEX on Ethereum. Curve’s governance token CRV can be locked anywhere from 7 days to 4 years… the longer you lock, the more veCRV you get and voting power you get. Ve(Vote Escrow)CRV allows you to vote for which liquidity pools get more CRV emissions every 7 day period. Curve used this veTokenomics concept to gamify the CRV emissions each week and allow users to actually govern the emissions through locking up their Curve and voting. There are a lot of nuances (Convex and metaDAOs, bribing, Votium, Llama Airforce, ve(3,3), decaying voting power, liquidity, capital efficiency, etc.), but the overall concept could be applied to a protocol like Minswap in a thoughtful way to give utility to the MIN token.
For full disclosure I mostly use Solana for DeFi, because I don’t have enough assets to justify Ethereum gas fees. I have been slowly building Cardano DeFi positions as the space is growing rapidly. I have a little bit in Near and Polkadot DeFi.
I am invested in SOL, ADA, ETH, DOT, ACA, NEAR, Aurora, ALGO, MIOTA along with plenty of other tokens.
This is not Financial Advice!
I would love to hear your feedback/questions/comments. Reach out to me on Twitter… Marco_112358, or Discord… marco_112358 in Wonderland#2400