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: .