Skip to main content

Adding Liquidity in DMM

There are some conditions when adding liquidity to the DMM:

  1. After LP contributions, the token price is unchanged.
  2. PminP_{min} and PmaxP_{max} are also unchanged after LP contributions.

In the DMM, the pool for pair X-Y needs to maintain 4 parameters:

  1. The initial amount of token XX that is used for amplification, denoted by x0x_0
  2. The initial amount of token YY that is used for amplification, denoted by y0y_0
  3. The change in token XX amount after trading activities, denoted by ฮ”x0\Delta x_0
  4. The change in token YY amount after trading activities, denoted by ฮ”y0\Delta y_0

Therefore, the real balances and virtual balances of the reserves are:

Real Balances

x=x0+ฮ”x0y=y0+ฮ”y0x = x_0 + \Delta x_0 \\ y = y_0 + \Delta y_0

Virtual Balances

xโ€ฒ=aโ‹…x0+ฮ”x0yโ€ฒ=aโ‹…y0+ฮ”y0x' = a \cdot x_0 + \Delta x_0 \\ y' = a \cdot y_0 + \Delta y_0

where aa is the amplification factor. You may find more information about the amplification factor here.


The constant product xโ€ฒโ‹…yโ€ฒ=(aโ‹…x0+ฮ”x0)โ‹…(aโ‹…y0+ฮ”y0)=kโ€ฒx' \cdot y' = (a \cdot x_0 + \Delta x_0) \cdot (a \cdot y_0 + \Delta y_0) = k'. Note that PminP_{min} and PmaxP_{max} at this time are:

{Pmin=(y0โ‹…aโˆ’y0)2kโ€ฒPmax=kโ€ฒ(x0โ‹…aโˆ’x0)2\begin{cases} P_{min} = \cfrac{(y_0 \cdot a - y_0)^2}{k'} \\ \\ P_{max} = \cfrac{k'}{(x_0 \cdot a - x_0)^2} \end{cases}

The current price: P=yโ€ฒxโ€ฒ=aโ‹…y0+ฮ”y0aโ‹…x0+ฮ”x0P = \cfrac{y'}{x'} = \cfrac{a \cdot y_0 + \Delta y_0}{a \cdot x_0 + \Delta x_0}

Liquidity Providers have to contribute in the same proportion for all 4 amount types. We denote the contribution ratio to be bb. LPs have to contribute x1+ฮ”x1x_1 + \Delta x_1, y1+ฮ”y1y_1 + \Delta y_1 in which:

{x1=bโ‹…x0ฮ”x1=bโ‹…ฮ”x0y1=bโ‹…y0ฮ”y1=bโ‹…ฮ”y0\begin{cases} x_1 = b \cdot x_0 \\ \Delta x_1 = b \cdot \Delta x_0 \\ y_1 = b \cdot y_0 \\ \Delta y_1 = b \cdot \Delta y_0 \end{cases}

The real balances and virtual balances of the reserve after contribution are:

Real Balances

x=(x0+x1)+(ฮ”x0+ฮ”x1)=(b+1)โ‹…(x0+ฮ”x0)y=(y0+y1)+(ฮ”y0+ฮ”y1)=(b+1)โ‹…(y0+ฮ”y0)x = (x_0 + x_1) + (\Delta x_0 + \Delta x_1) = (b + 1) \cdot (x_0 + \Delta x_0) \\ y = (y_0 + y_1) + (\Delta y_0 + \Delta y_1) = (b + 1) \cdot (y_0 + \Delta y_0)

Virtual Balances

xโ€ฒ=aโ‹…(x0+x1)+(ฮ”x0+ฮ”x1)=(b+1)โ‹…(aโ‹…x0+ฮ”x0)yโ€ฒ=aโ‹…(y0+y1)+(ฮ”y0+ฮ”y1)=(b+1)โ‹…(aโ‹…y0+ฮ”y0)x' = a \cdot (x_0 + x_1) + (\Delta x_0 + \Delta x_1) = (b + 1) \cdot (a \cdot x_0 + \Delta x_0) \\ y' = a \cdot (y_0 + y_1) + (\Delta y_0 + \Delta y_1) = (b + 1) \cdot (a \cdot y_0 + \Delta y_0)

The constant product, after the LP contribution, becomes:

xโ€ฒโ‹…yโ€ฒ=(b+1)2โ‹…(aโ‹…x0+ฮ”x0)โ‹…(aโ‹…y0+ฮ”y0)=(b+1)2โ‹…kโ€ฒx' \cdot y' = (b + 1)^2 \cdot (a \cdot x_0 + \Delta x_0) \cdot (a \cdot y_0 + \Delta y_0) = (b + 1)^2 \cdot k'

PminP_{min} and PmaxP_{max} at this time are:

{Pmin=((y0+y1)โ‹…aโˆ’(y0+y1))2(b+1)2โ‹…kโ€ฒ=(y0โ‹…aโˆ’y0)2kโ€ฒPmax=(b+1)2โ‹…kโ€ฒ((x0+x1)โ‹…aโˆ’(x0+x1))2=(x0โ‹…aโˆ’x0)2kโ€ฒ\begin{cases} P_{min} = \cfrac{((y_0 + y_1) \cdot a - (y_0 + y_1))^2}{(b + 1)^2 \cdot k'} = \cfrac{(y_0 \cdot a - y_0)^2}{k'} \\ P_{max} = \cfrac{(b + 1)^2 \cdot k'}{((x_0 + x_1) \cdot a - (x_0 + x_1))^2} = \cfrac{(x_0 \cdot a - x_0)^2}{k'} \end{cases}

The current price is updated to be P=yโ€ฒxโ€ฒ=(aโ‹…y0+ฮ”y0)โ‹…(b+1)(aโ‹…x0+ฮ”x0)โ‹…(b+1)=aโ‹…y0+ฮ”y0aโ‹…x0+ฮ”x0P = \cfrac{y'}{x'} = \cfrac{(a \cdot y_0 + \Delta y_0) \cdot (b + 1)}{(a \cdot x_0 + \Delta x_0) \cdot (b + 1)} = \cfrac{a \cdot y_0 + \Delta y_0}{a \cdot x_0 + \Delta x_0}

We see that after LP contributes, the current price, PminP_{min} and PmaxP_{max} are unchanged. It is similar in the case of LPs withdrawals, where the ratio bb is negative.

Example#

  • Initially, the first LP put 100 XX and 100 YY to the reserve, we have: x=100,y=100,ฮ”x=0,ฮ”y=0x = 100, y = 100, \Delta x = 0, \Delta y = 0.

  • A user trades 20 X for 15 Y, so we have the updated parameters: x=100,y=100,ฮ”x=20,ฮ”y=โˆ’15x = 100, y = 100, \Delta x = 20, \Delta y = โˆ’15.

  • Suppose an LP wants to contribute 20% of the current token amounts in the pool, so he should deposit:

    0.2โ‹…100+0.2โ‹…20=24(X)0.2โ‹…100+0.2โ‹…(โˆ’15)=17(Y)0.2 ยท 100 + 0.2 ยท 20 = 24 (X) \\ 0.2 ยท 100 + 0.2 ยท (โˆ’15) = 17 (Y)

ie. deposit 24X and 17Y tokens.

The parameters are then updated to be: x=120x = 120, y=120y = 120, ฮ”x=24\Delta x = 24, ฮ”y=โˆ’18\Delta y = โˆ’18.