For the complete documentation index, see llms.txt. This page is also available as Markdown.

Virtual Balances

Introduction

To guarantee the safety of the pool, there are some conditions which need to be fulfilled when adding liquidity to KyberSwap Classic pools:

  1. After LP contributions, the token price remains unchanged.

  2. PminP_{min} and PmaxP_{max} are also unchanged after LP contributions.

In KyberSwap, 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Δx_0​

  4. The change in token YY amount after trading activities, denoted by Δy0Δ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=ax0+Δx0y=ay0+Δy0x' = a \cdot x_0 + \Delta x_0 \\ y' = a \cdot y_0 + \Delta y_0

where aa is the amplification factor. \

The constant product xy=(ax0+Δx0)(ay0+Δy0)=kx' \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=(y0ay0)2kPmax=k(x0ax0)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=yx=ay0+Δy0ax0+Δ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 in which:

{x1=bx0Δx1=bΔx0y1=by0Δ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)(ax0+Δx0)y=a(y0+y1)+(Δy0+Δy1)=(b+1)(ay0+Δ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:

xy=(b+1)2(ax0+Δx0)(ay0+Δy0)=(b+1)2kx' \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)2k=(y0ay0)2kPmax=(b+1)2k((x0+x1)a(x0+x1))2=(x0ax0)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=yx=(ay0+Δy0)(b+1)(ax0+Δx0)(b+1)=ay0+Δy0ax0+Δ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 XX for 15 YY, 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.2100+0.220=24(X)0.2100+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: .

Last updated

Was this helpful?