Copy
Liquidity Solutions KyberSwap Classic Concepts 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:
After LP contributions, the token price remains unchanged.
P m i n P_{min} P min and P m a x P_{max} P ma x are also unchanged after LP contributions.
In KyberSwap, the pool for pair X-Y needs to maintain 4 parameters:
The initial amount of token X X X that is used for amplification, denoted by x 0 x_0 x 0
The initial amount of token Y Y Y that is used for amplification, denoted by y 0 y_0 y 0
The change in token X X X amount after trading activities, denoted by Δ x 0 Δx_0 Δ x 0
The change in token Y Y Y amount after trading activities, denoted by Δ y 0 Δy_0 Δ y 0
Therefore, the real balances and virtual balances of the reserves are:
Real Balances
x = x 0 + Δ x 0 y = y 0 + Δ y 0 x = x_0 + \Delta x_0 \\
y = y_0 + \Delta y_0 x = x 0 + Δ x 0 y = y 0 + Δ y 0 Virtual Balances
x ′ = a ⋅ x 0 + Δ x 0 y ′ = a ⋅ y 0 + Δ y 0 x' = a \cdot x_0 + \Delta x_0 \\
y' = a \cdot y_0 + \Delta y_0 x ′ = a ⋅ x 0 + Δ x 0 y ′ = a ⋅ y 0 + Δ y 0 where a a a is the amplification factor .
The constant product x ′ ⋅ y ′ = ( a ⋅ x 0 + Δ x 0 ) ⋅ ( a ⋅ y 0 + Δ y 0 ) = k ′ x' \cdot y' = (a \cdot x_0 + \Delta x_0) \cdot (a \cdot y_0 + \Delta y_0) = k' x ′ ⋅ y ′ = ( a ⋅ x 0 + Δ x 0 ) ⋅ ( a ⋅ y 0 + Δ y 0 ) = k ′ . Note that P m i n P_{min} P min and P m a x P_{max} P ma x at this time are:
{ P m i n = ( y 0 ⋅ a − y 0 ) 2 k ′ P m a x = k ′ ( x 0 ⋅ a − x 0 ) 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} ⎩ ⎨ ⎧ P min = k ′ ( y 0 ⋅ a − y 0 ) 2 P ma x = ( x 0 ⋅ a − x 0 ) 2 k ′ The current price: P = y ′ x ′ = a ⋅ y 0 + Δ y 0 a ⋅ x 0 + Δ x 0 P = \cfrac{y'}{x'} = \cfrac{a \cdot y_0 + \Delta y_0}{a \cdot x_0 + \Delta x_0} P = x ′ y ′ = a ⋅ x 0 + Δ x 0 a ⋅ y 0 + Δ y 0
Liquidity Providers have to contribute in the same proportion for all 4 amount types. We denote the contribution ratio to be b b b . LPs have to contribute in which:
{ x 1 = b ⋅ x 0 Δ x 1 = b ⋅ Δ x 0 y 1 = b ⋅ y 0 Δ y 1 = b ⋅ Δ y 0 \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} ⎩ ⎨ ⎧ x 1 = b ⋅ x 0 Δ x 1 = b ⋅ Δ x 0 y 1 = b ⋅ y 0 Δ y 1 = b ⋅ Δ y 0 The real balances and virtual balances of the reserve after contribution are:
Real Balances
x = ( x 0 + x 1 ) + ( Δ x 0 + Δ x 1 ) = ( b + 1 ) ⋅ ( x 0 + Δ x 0 ) y = ( y 0 + y 1 ) + ( Δ y 0 + Δ y 1 ) = ( b + 1 ) ⋅ ( y 0 + Δ y 0 ) 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) x = ( x 0 + x 1 ) + ( Δ x 0 + Δ x 1 ) = ( b + 1 ) ⋅ ( x 0 + Δ x 0 ) y = ( y 0 + y 1 ) + ( Δ y 0 + Δ y 1 ) = ( b + 1 ) ⋅ ( y 0 + Δ y 0 ) Virtual Balances
x ′ = a ⋅ ( x 0 + x 1 ) + ( Δ x 0 + Δ x 1 ) = ( b + 1 ) ⋅ ( a ⋅ x 0 + Δ x 0 ) y ′ = a ⋅ ( y 0 + y 1 ) + ( Δ y 0 + Δ y 1 ) = ( b + 1 ) ⋅ ( a ⋅ y 0 + Δ y 0 ) 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) x ′ = a ⋅ ( x 0 + x 1 ) + ( Δ x 0 + Δ x 1 ) = ( b + 1 ) ⋅ ( a ⋅ x 0 + Δ x 0 ) y ′ = a ⋅ ( y 0 + y 1 ) + ( Δ y 0 + Δ y 1 ) = ( b + 1 ) ⋅ ( a ⋅ y 0 + Δ y 0 ) The constant product, after the LP contribution, becomes:
x ′ ⋅ y ′ = ( b + 1 ) 2 ⋅ ( a ⋅ x 0 + Δ x 0 ) ⋅ ( a ⋅ y 0 + Δ y 0 ) = ( 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' x ′ ⋅ y ′ = ( b + 1 ) 2 ⋅ ( a ⋅ x 0 + Δ x 0 ) ⋅ ( a ⋅ y 0 + Δ y 0 ) = ( b + 1 ) 2 ⋅ k ′ P m i n P_{min} P min and P m a x P_{max} P ma x at this time are:
{ P m i n = ( ( y 0 + y 1 ) ⋅ a − ( y 0 + y 1 ) ) 2 ( b + 1 ) 2 ⋅ k ′ = ( y 0 ⋅ a − y 0 ) 2 k ′ P m a x = ( b + 1 ) 2 ⋅ k ′ ( ( x 0 + x 1 ) ⋅ a − ( x 0 + x 1 ) ) 2 = ( x 0 ⋅ a − x 0 ) 2 k ′ \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} ⎩ ⎨ ⎧ P min = ( b + 1 ) 2 ⋅ k ′ (( y 0 + y 1 ) ⋅ a − ( y 0 + y 1 ) ) 2 = k ′ ( y 0 ⋅ a − y 0 ) 2 P ma x = (( x 0 + x 1 ) ⋅ a − ( x 0 + x 1 ) ) 2 ( b + 1 ) 2 ⋅ k ′ = k ′ ( x 0 ⋅ a − x 0 ) 2 The current price is updated to be P = y ′ x ′ = ( a ⋅ y 0 + Δ y 0 ) ⋅ ( b + 1 ) ( a ⋅ x 0 + Δ x 0 ) ⋅ ( b + 1 ) = a ⋅ y 0 + Δ y 0 a ⋅ x 0 + Δ x 0 P = \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} P = x ′ y ′ = ( a ⋅ x 0 + Δ x 0 ) ⋅ ( b + 1 ) ( a ⋅ y 0 + Δ y 0 ) ⋅ ( b + 1 ) = a ⋅ x 0 + Δ x 0 a ⋅ y 0 + Δ y 0
We see that after LP contributes, the current price, P m i n P_{min} P min and P m a x P_{max} P ma x are unchanged. It is similar in the case of LPs withdrawals, where the ratio b b b is negative.
Initially, the first LP put 100 X X X and 100 Y Y Y to the reserve, we have: x = 100 , y = 100 , Δ x = 0 , Δ y = 0 x = 100, y = 100, \Delta x = 0, \Delta y = 0 x = 100 , y = 100 , Δ x = 0 , Δ y = 0 .
A user trades 20 X X X for 15 Y Y Y , so we have the updated parameters: x = 100 , y = 100 , Δ x = 20 , Δ y = − 15 x = 100, y = 100, \Delta x = 20, \Delta y = −15 x = 100 , y = 100 , Δ x = 20 , Δ 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) 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: .