KyberSwap Docs
Search
K
Comment on page

Virtual Balances

Liquidity Safety Conditions

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. 1.
    After LP contributions, the token price remains unchanged.
  2. 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. 1.
    The initial amount of token
    XX
    that is used for amplification, denoted by
    x0x_0​
  2. 2.
    The initial amount of token
    YY
    that is used for amplification, denoted by
    y0y_0​
  3. 3.
    The change in token
    XX
    amount after trading activities, denoted by
    Δx0Δx_0​
  4. 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:
.