# Pro-AMM flatten formula ## The problem arise from existing formula Our current model is based on this formula: 1. ${L_{fnew} = \sqrt{(x_f + deltaX.fee) * y_f}}$ This is approximate to: 2. ${L_{approximate} = L_f + \frac{deltaX.fee.\sqrt{p}}{2}}$ or ${deltaL = \frac{deltaX.fee.\sqrt{p}}{2}}$ However, this approximate formula is only applied when new collected liquidity is very small compared to current collected liquidity. - This is trivial because the collected liquidity will be very small for pool creation. - The 1st one who created the pool has to lock liquidity there. - The code base has to account for the accurate case. It is very hard to get the amount to pass a tick So 1. should be ${L_{fnew} + L_p = \sqrt{(x_f + x_p + deltaX.fee) * (y_f + y_p)}}$ When do 2. to approximate this formula, we will get the same result: ${L_{approximate} = L_f + L_p + \frac{deltaX.fee.\sqrt{p}}{2}}$ or ${deltaL = \frac{deltaX.fee.\sqrt{p}}{2}}$ Note that fee = 1% and swap within a range of 5% change of price so ${{deltaL \over L_f + L_p} < 0.0005 }$ Or we can always use the approximate formula when a swap within a 5% change of price Moreover, with a > 5% change of price, we will divide this swap into multiple small swaps each with 5% change of price (similar with swapping between multiple ticks) ## Another explaination for approximate formula - Uniswap v2 based on the formula: ${(x + deltaX*(1-fee)) * (y - deltaY) = L^2}$ - Derived formula: ${(x + deltaX)(y -deltaY)= (L+deltaL)^2}$ (1) with *deltaL* is calculated approximately by: $\large {deltaL \over L} = {deltaX * fee \over 2x}$ (2) ### Calculate back and forth Assume that ${L_2}$ - ${L_1}$ is the total liquidity after/before the swap ${p_2}$ - ${p_1}$ is price after/before the swap ${x_2}$ - ${x_1}$ is amount of token0 after/before the swap #### Given input amount, calculate new sqrt of price $L_2 = {L_1 + deltaL} = {L_1 * (1 + {deltaX * fee \over 2 * x1})}$ $= L_1 *(1 + {deltaX * fee * \sqrt{p_1} \over 2 * L_1})$ $= L_1 + {deltaX * fee * \sqrt{p_1} \over 2}$ (3) Finally calculate new $\sqrt{p}$ and deltaY $\large \sqrt{p_2} = {L_2 \over x_1 + \Delta X} = {L_2 * \sqrt{p_1}\over L_1 + deltaX * \sqrt{p_1}}$ (4) $deltaY = L_2 * \sqrt{p_2} - L1 * \sqrt{p_1}$ #### Given next tick price, calculate amount needed to cross the tick From (3) and (4) $x_1 + deltaX = ({L1 + {deltaX * fee * \sqrt{p_1} \over 2}}) / \sqrt{p_2}$ so ${deltaX * (1 - \frac{fee * \sqrt{p_1} }{2 * \sqrt{p_2}}}) = L1 *(\frac{1}{\sqrt{p_2}} - \frac{1}{\sqrt{p_1}})$ ${=> deltaX = {2{L_1} (\sqrt{p_1} - \sqrt{p_2}) \over \sqrt{p_1} (2\sqrt{p_2} - fee\sqrt{p_1})}}$ (5) Alternatively, calculate $L_2$ first, then $deltaX$. From (3), ${deltaX = \frac{2(L_2-L_1)}{fee\sqrt{p_1}}}$ (6) Also, ${deltaX = \frac{L_2}{\sqrt{p_2}} - \frac{L_1}{\sqrt{p_1}}}$ ${=> \frac{2(L_2-L_1)}{fee\sqrt{p_1}} = \frac{L_2}{\sqrt{p_2}} - \frac{L_1}{\sqrt{p_1}}}$ ${\frac{2L_2}{fee\sqrt{p_1}} - \frac{L_2}{\sqrt{p_2}} = \frac{2L_1}{fee\sqrt{p_1}} - \frac{L_1}{\sqrt{p_1}} }$ ${L_2(\frac{2\sqrt{p_2}-fee\sqrt{p_1}}{fee\sqrt{p_1}\sqrt{p_2}}) = \frac{L_1(2-fee)}{fee\sqrt{p_1}}}$ ${L_2 = \frac{(2-fee)L_1\sqrt{p_2}}{2\sqrt{p_2}-fee\sqrt{p_1}}}$ (7) Use (6) to calculate ${deltaX}$. Since (7) calculates ${fee\sqrt{p_1}}$, can avoid redoing this calculation in (6) as well. With the formula 5 or 7, we can calculate the exact amount needed to cross a tick. ${deltaY = L_2*\sqrt{p_2} - L1*\sqrt{p_1}}$ ${= L1* (\sqrt{p_2} - \sqrt{p_1}) + deltaX * fee * \sqrt{p_1} * \sqrt{p_2} / 2}$ ${= L1*(\sqrt{p_2} - \sqrt{p_1}) * (1 - \frac{\sqrt{p_2}}{2 * \sqrt{p_2} - fee* \sqrt{p_1}}) }$ or ${deltaY = L1*(\sqrt{p_2} - \sqrt{p_1}) * \frac{\sqrt{p_2} - fee* \sqrt{p_1}}{2 * \sqrt{p_2} - fee* \sqrt{p_1}}}$