To protect LPs from front-run when oracle price is delayed and to simulate market makersโ behavior when a large order is traded, Symmetry implements an "Adjusted AMM mechanism".
Liquidity is uniformly distributed between โ ฮป -\lambda โ ฮป and. Outside this range, LP provides extra linear liquidity, which has the same liquidity distribution between and ฮป \lambda ฮป .
Parameters:
oracle price before the trade
mid price before the trade
takerโs buy price before the trade
oracle price after the trade
mid price after the trade
takerโs buy price after the trade
Calculation
AMM formula is as below:
Before trade is executed, p r e m = ฮป โ
s p r โ
L P prem = \frac { \lambda \cdot s} {pr \cdot LP} p re m = p r โ
L P ฮป โ
s โ ,
After trade is executed, p r e m โฒ = ฮป โ
s โฒ p r โ
L P prem' =\frac {\lambda \cdot s'} {pr \cdot LP} p re m โฒ = p r โ
L P ฮป โ
s โฒ โ ,
where s โฒ = s + T s' = s + T s โฒ = s + T , T T T is trade quantity.
Therefore,
p m i d = p o r a c l e ( 1 + p r e m ) = p o r a c l e ( 1 + ฮป โ
s p r โ
L P ) p_{mid} = p_{oracle}(1+prem)
= p_{oracle}
\left(1 + \frac { \lambda \cdot s}
{pr \cdot LP}\right) p mi d โ = p or a c l e โ ( 1 + p re m ) = p or a c l e โ ( 1 + p r โ
L P ฮป โ
s โ ) ใUserโs Buy Price & Sell Priceใ
ใExecution Priceใ
Therefore, the execution price for userโs buy order is
Same as above, the execution notional for userโs sell order is
Example
Initial State
s = 0
Trade #1 at time t = 0s
State before the trade
User sells $40,000,000
Summary
Before this trade
After this trade
Trade #2 at time t = 15s
State before the trade
User sells $20,000,000
Summary
After the last trade
Before this trade
After this trade
Trade #3 at time t = 39s (24 seconds later)
State before the trade
User buys $10,000,000
Summary
After the last trade
Before this trade
After this trade
Trade #4 at time t = 54s (15 seconds later)
State before the trade
User buys $50,000,000
Summary
After the last trade
Before this trade
After this trade
takerโs sell price before the trade.
takerโs sell price after the trade.
p m i d โฒ = p o r a c l e โฒ ( 1 + p r e m โฒ ) = p o r a c l e โฒ ( 1 + ฮป โ
( s + T ) p r โ
L P ) p'_{mid} = p'_{oracle}(1+prem') = p'_{oracle}
\left(1 + \frac { \lambda \cdot (s+T)}
{pr \cdot LP}\right) p mi d โฒ โ = p or a c l e โฒ โ ( 1 + p re m โฒ ) = p or a c l e โฒ โ ( 1 + p r โ
L P ฮป โ
( s + T ) โ ) Besides p o r a c l e p_{oracle} p or a c l e โ and p m i d p_{mid} p mi d โ , smart contract also keeps track of the taker's buy price p b u y p_{buy} p b u y โ and sell price p s e l l p_{sell} p se ll โ .
After the trade, when p m i d p_{mid} p mi d โ is between p b u y p_{buy} p b u y โ and p s e l l p_{sell} p se ll โ ., both prices gradually move towards p m i d โฒ p'_{mid} p mi d โฒ โ at a fixed speed, reaching p m i d โฒ p'_{mid} p mi d โฒ โ after 60 seconds.
When p m i d โฒ p'_{mid} p mi d โฒ โ exceeds either of these two prices, the crossed price moves immediately to p m i d โฒ p'_{mid} p mi d โฒ โ . And the other one will gradually move towards p m i d โฒ p'_{mid} p mi d โฒ โ at a fixed speed, reaching p m i d โฒ p'_{mid} p mi d โฒ โ after 60 seconds.
Formally speaking, after t t t seconds following a trade, these two prices change as follows.
p b u y โฒ = { m a x ( t โ
p m i d โฒ + ( 60 โ t ) โ
p b u y 60 , p m i d โฒ ) t < 60 p m i d โฒ t โฅ 60 p s e l l โฒ = { m i n ( t โ
p m i d โฒ + ( 60 โ t ) โ
p s e l l 60 , p m i d โฒ ) t < 60 p m i d โฒ t โฅ 60 \begin{align*}
p'_{buy} &=
\begin{dcases}
max\left(\frac{t \cdot p'_{mid} + (60 - t) \cdot p_{buy}}{60}, p'_{mid} \right) && t < 60
\\
p'_{mid} && t \ge 60\\
\end{dcases} \\
p'_{sell} &=
\begin{dcases}
min \left(\frac{t \cdot p'_{mid} + (60 - t) \cdot p_{sell}}{60},p'_{mid} \right) && t < 60
\\
p'_{mid} && t \ge 60\\
\end{dcases}
\end{align*} p b u y โฒ โ p se ll โฒ โ โ = โฉ โจ โง โ ma x ( 60 t โ
p mi d โฒ โ + ( 60 โ t ) โ
p b u y โ โ , p mi d โฒ โ ) p mi d โฒ โ โ โ t < 60 t โฅ 60 โ = โฉ โจ โง โ min ( 60 t โ
p mi d โฒ โ + ( 60 โ t ) โ
p se ll โ โ , p mi d โฒ โ ) p mi d โฒ โ โ โ t < 60 t โฅ 60 โ โ A trade is executed as if it is divided into infinite tiny pieces, which are executed one by one. For example, assume that a buy trade of volume T T T changes the mid price from p m i d p_{mid} p mi d โ to p m i d โฒ p'_{mid} p mi d โฒ โ and the userโs buy price is p b u y p_{buy} p b u y โ before the trade. Its turnover is
p e x e c โ
T = โซ 0 T max โก ( v โ
p m i d + ( T โ v ) โ
p m i d โฒ T , p b u y ) d v p_{exec} \cdot T =
\int_0^T
\max\left(
\frac{v \cdot p_{mid} + (T - v) \cdot p'_{mid}}{T},
p_{buy}
\right)
\mathrm{d}v p e x ec โ โ
T = โซ 0 T โ max ( T v โ
p mi d โ + ( T โ v ) โ
p mi d โฒ โ โ , p b u y โ ) d v p e x e c = { p b u y p m i d โฒ โค p b u y ( p b u y โ p m i d ) โ
p b u y + ( p m i d โฒ โ p b u y ) โ
p m i d โฒ + p b u y 2 p m i d โฒ โ p m i d p m i d โฒ > p b u y p_{exec} =
\begin{dcases}
p_{buy} & p'_{mid} \le p_{buy} \\
\frac{(p_{buy} - p_{mid}) \cdot p_{buy} + (p'_{mid} - p_{buy}) \cdot \frac{p'_{mid} + p_{buy}}{2}}{p'_{mid} - p_{mid}} & p'_{mid} > p_{buy}
\end{dcases} p e x ec โ = โฉ โจ โง โ p b u y โ p mi d โฒ โ โ p mi d โ ( p b u y โ โ p mi d โ ) โ
p b u y โ + ( p mi d โฒ โ โ p b u y โ ) โ
2 p mi d โฒ โ + p b u y โ โ โ โ p mi d โฒ โ โค p b u y โ p mi d โฒ โ > p b u y โ โ p e x e c โ
T = โซ 0 T min โก ( v โ
p m i d + ( T โ v ) โ
p m i d โฒ T , p s e l l ) d v p_{exec} \cdot T =
\int_0^T
\min\left(
\frac{v \cdot p_{mid} + (T - v) \cdot p'_{mid}}{T},
p_{sell}
\right)
\mathrm{d}v p e x ec โ โ
T = โซ 0 T โ min ( T v โ
p mi d โ + ( T โ v ) โ
p mi d โฒ โ โ , p se ll โ ) d v L P LP L P = 100,000,000 (assume it does not change in this example)
p o r a c l e p_{oracle} p or a c l e โ = 20000
p m i d p_{mid} p mi d โ = p b u y p_{buy} p b u y โ = p s e l l p_{sell} p se ll โ = 20000
p m i d = p b u y = p s e l l = 20000 p_{mid} = p_{buy} = p_{sell} = 20000 p mi d โ = p b u y โ = p se ll โ = 20000
s โฒ = โ 40 , 000 , 000 s' = -40,000,000 s โฒ = โ 40 , 000 , 000
p m i d โฒ = 20000 ร ( 1 + 1 ร 0.05 ร โ 40 , 000 , 000 0.5 ร 100 , 000 , 000 ) = 19200 p'_{mid} = 20000 \times \left( 1 + \frac{1 \times 0.05 \times -40,000,000}{0.5 \times 100,000,000} \right) = 19200 p mi d โฒ โ = 20000 ร ( 1 + 0.5 ร 100 , 000 , 000 1 ร 0.05 รโ 40 , 000 , 000 โ ) = 19200
p โฒ s e l l = min โก ( p s e l l , p m i d โฒ ) = 19200 p'{sell} = \min(p_{sell}, p'_{mid}) = 19200 p โฒ se ll = min ( p se ll โ , p mi d โฒ โ ) = 19200
The trade volume is evenly distributed between p s e l l p_{sell} p se ll โ and p s e l l โฒ p'_{sell} p se ll โฒ โ .
p e x e c = p s e l l + p s e l l โฒ 2 = 19600 p_{exec} = \frac{p_{sell} + p'_{sell}}{2} = 19600 p e x ec โ = 2 p se ll โ + p se ll โฒ โ โ = 19600
p b u y โฒ = p b u y = 20000 p'_{buy} = p_{buy} = 20000 p b u y โฒ โ = p b u y โ = 20000
s = โ 40 , 000 , 000 s = -40,000,000 s = โ 40 , 000 , 000
p m i d = p s e l l = 19200 p_{mid} = p_{sell} = 19200 p mi d โ = p se ll โ = 19200
p b u y = p m i d ร 15 + 20000 ร ( 60 โ 15 ) 60 = 19800 p_{buy} = \frac{p_{mid} \times 15 + 20000 \times (60 - 15)}{60} = 19800 p b u y โ = 60 p mi d โ ร 15 + 20000 ร ( 60 โ 15 ) โ = 19800
s โฒ = โ 60 , 000 , 000 s' = -60,000,000 s โฒ = โ 60 , 000 , 000
p m i d โฒ = 18800 p'_{mid} = 18800 p mi d โฒ โ = 18800
p s e l l โฒ = min โก ( p s e l l , p m i d โฒ ) = 18800 p'_{sell} = \min(p_{sell}, p'_{mid}) = 18800 p se ll โฒ โ = min ( p se ll โ , p mi d โฒ โ ) = 18800
The trade volume is evenly distributed between p s e l l p_{sell} p se ll โ and p s e l l โฒ p'_{sell} p se ll โฒ โ .
p e x e c = p s e l l + p s e l l โฒ 2 = 19000 p_{exec} = \frac{p_{sell} + p'_{sell}}{2} = 19000 p e x ec โ = 2 p se ll โ + p se ll โฒ โ โ = 19000
p b u y โฒ = p b u y = 19800 p'_{buy} = p_{buy} = 19800 p b u y โฒ โ = p b u y โ = 19800
s = โ 60 , 000 , 000 s = -60,000,000 s = โ 60 , 000 , 000
p m i d = p s e l l = 18800 p_{mid} = p_{sell} = 18800 p mi d โ = p se ll โ = 18800
p b u y = p m i d ร 24 + 19800 ร ( 60 โ 24 ) 60 = 19400 p_{buy} = \frac{p_{mid} \times 24 + 19800 \times (60 - 24)}{60} = 19400 p b u y โ = 60 p mi d โ ร 24 + 19800 ร ( 60 โ 24 ) โ = 19400
s โฒ = โ 50 , 000 , 000 s'=-50,000,000 s โฒ = โ 50 , 000 , 000
p m i d โฒ = 19000 p'_{mid} = 19000 p mi d โฒ โ = 19000
p b u y โฒ = max โก ( p b u y , p m i d โฒ ) = 19400 p'_{buy} = \max(p_{buy}, p'_{mid}) = 19400 p b u y โฒ โ = max ( p b u y โ , p mi d โฒ โ ) = 19400
The trade is completely executed at p b u y p_{buy} p b u y โ , which does not move in this trade
p e x e c = p b u y = 19400 p_{exec} = p_{buy} = 19400 p e x ec โ = p b u y โ = 19400
p s e l l โฒ = p s e l l = 18800 p'_{sell} = p_{sell} = 18800 p se ll โฒ โ = p se ll โ = 18800
s = โ 50 , 000 , 000 s = -50,000,000 s = โ 50 , 000 , 000
p m i d = 19000 p_{mid} = 19000 p mi d โ = 19000
p b u y = p m i d ร 15 + 19400 ร ( 60 โ 15 ) 60 = 19300 p_{buy} = \frac{p_{mid} \times 15 + 19400 \times (60 - 15)}{60} = 19300 p b u y โ = 60 p mi d โ ร 15 + 19400 ร ( 60 โ 15 ) โ = 19300
p s e l l = p m i d ร 15 + 18800 ร ( 60 โ 15 ) 60 = 18850 p_{sell} = \frac{p_{mid} \times 15 + 18800 \times (60 - 15)}{60} = 18850 p se ll โ = 60 p mi d โ ร 15 + 18800 ร ( 60 โ 15 ) โ = 18850
p m i d โฒ = 20000 p'_{mid} = 20000 p mi d โฒ โ = 20000
p b u y โฒ = max โก ( p b u y , p m i d โฒ ) = 20000 p'_{buy} = \max(p_{buy}, p'_{mid}) = 20000 p b u y โฒ โ = max ( p b u y โ , p mi d โฒ โ ) = 20000
A fraction of the trade volume is executed at p b u y p_{buy} p b u y โ and the rest is evenly distributed between p b u y p_{buy} p b u y โ and p b u y โฒ p'_{buy} p b u y โฒ โ .
p e x e c = ( ( p b u y โ p m i d ) ร p b u y + ( p b u y โฒ โ p b u y ) ร p b u y + p b u y โฒ 2 ) รท ( p b u y โฒ โ p m i d ) = 19545 p_{exec} = \left((p_{buy} - p_{mid}) \times p_{buy} + (p'_{buy} - p_{buy}) \times \frac{p_{buy} + p'_{buy}}{2} \right) \div (p'_{buy} - p_{mid}) = 19545 p e x ec โ = ( ( p b u y โ โ p mi d โ ) ร p b u y โ + ( p b u y โฒ โ โ p b u y โ ) ร 2 p b u y โ + p b u y โฒ โ โ ) รท ( p b u y โฒ โ โ p mi d โ ) = 19545
p s e l l โฒ = p s e l l = 18850 p'_{sell} = p_{sell} = 18850 p se ll โฒ โ = p se ll โ = 18850
๐
๐งโ๐ซ
p o r a c l e p_{oracle} p or a c l e โ p s e l l โค p b u y p_{sell}\leq p_{buy} p se ll โ โค p b u y โ p o r a c l e โฒ p'_{oracle} p or a c l e โฒ โ p m i d โฒ p'_{mid} p mi d โฒ โ p b u y โฒ p'_{buy} p b u y โฒ โ p s e l l โฒ p'_{sell} p se ll โฒ โ p s e l l โฒ โค p b u y โฒ p'_{sell}\leq p'_{buy} p se ll โฒ โ โค p b u y โฒ โ