---
# System prepended metadata

title: Arbitrage functions

---

# Arbitrage functions

Liquidity definition

$$k = r0*r1$$

Change in pool:

$$r_0'*r_1'=r_0*r_1$$

Assume liquidity provider fee is $lp$ and $a=1-lp$. Buying token 0:

$$
t_0 = r_0'-r_0 \\
r_0' = \frac{r_0*r_1}{r_1'} \\
r_1' = r_1+t_1*a \\
r_0' = \frac{r_0*r_1}{r_1+t_1*a} \\
t_0 = \frac{r_0*r_1}{r_1+t_1*a}-r_0 \\
t_0 = \frac{r_0*r_1-r_0*(r_1+t_1*a)}{r_1+t_1*a} \\
t_0 = \frac{r_0*t_1}{\frac{r_1}a+t_1}
$$

Assume second dex pool defined by

$$s_0'*s_1'=s_0*s_1$$

Selling token 0:

$$
t_1' = s_1'-s_1 \\
s_1' = \frac{s_0*s_1}{s_0'} \\
s_0' = s_0+t_0*a \\
s_1' = \frac{s_0*s_1}{s_0+t_0*a} \\
t_1' = \frac{s_0*s_1}{s_0+t_0*a}-s_1 \\
t_1' = \frac{s_0*s_1-s_1*(s_0+t_0*a)}{s_0+t_0*a} \\
t_1' = \frac{s_1*t_0}{\frac{s_0}a+t_0}
$$

Profit:

$$
p = t_1'-t_1 \\
p = \frac{s_0*s_1}{s_0+t_0*a}-s_1-t_1 \\
p = \frac{s_0*s_1}{s_0+(\frac{r_0*r_1}{r_1+t_1*a}-r_0)*a}-s_1-t_1
$$

Simplification with fictional constant values

$$
r_0 = 100 \\
r_1 = 1 \\
s_0 = 1000 \\
s_1 = 11 \\
a = 0.997 \\
p = \frac{11000}{900.3+\frac{99.7}{1+t_1*0.997}}-11-t_1 \\
p = \frac{11000*(1+t_1*0.997)}{900.3*(1+t_1*0.997)+99.7}-11-t_1\\
p = \frac{11000+t_1*10967}{1000+t_1*897.5991}-11-t_1
$$

This is the resulting function visualized

![](https://hackmd.io/_uploads/SyMPybja2.png)

Zooming in we see a local maximum

![](https://hackmd.io/_uploads/HJHtkbs63.png)

with $t_1=0.05$ and a profit of $0.002$ in $t_1$.

## Calculating local maximum
 TBD
 
<br> 
<br>

> Notes regarding the profit function.

First I would like to use different symbols for amount of tokens to make it looks more a dunctional dependency and highlight the input. Let's say that amount of input token `X` in the first LP is `x` and amount of retrieved token `X` from the second LP is `x'`, which turns the profit equation to:

$$
p = x' - x
$$

The amount of token `Y` received from the first LP in result of exchage is `y` and determined by liquidity definition:

$$
r'_x r'_y = r_x r_y \\
(r_x + x)(r_y - y) = r_x r_y \\
y = r_y - \frac{r_x r_y}{r_x + x}
$$

It is important to note the signs of $$(r_x + x)(r_y - y)$$ are set according to the fact that `x` and `y` are natural numbers showing the amount of user input and the amount of tokens received, meaning that LP pool of token `X` increases after the exchange, and pool of `Y` decreases.

<br>

Using the liqudity equation of the second pool, let's express the amount of tokens `X` received after second exchage:

$$
s'_x s'_y = s_x s_y \\
(s_x - x')(s_y + y) = s_x s_y \\
x' = s_x - \frac{s_x s_y}{s_y + y} \\
$$

Using the fact that amount of tokens `Y` `y` is the same in both equations it is now possible to express `x'` using `x` and express the profit as a function of `x`. However, it is required to get protocols fee into equation.

Uniswap V2 protocol is using constant fee of 0.3% of the input amount. In order to include it in equation, it is required to analyse how exactly fee affects the exchange equation. For example [Router contract](https://github.com/Uniswap/v2-periphery/blob/master/contracts/UniswapV2Router02.sol#L224-L237) uses the following logic to [calculate the amount of tokens received](https://github.com/Uniswap/v2-periphery/blob/master/contracts/libraries/UniswapV2Library.sol#L43-L50) in exchange:

```
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
  require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
  require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
  uint amountInWithFee = amountIn.mul(997);
  uint numerator = amountInWithFee.mul(reserveOut);
  uint denominator = reserveIn.mul(1000).add(amountInWithFee);
  amountOut = numerator / denominator;
}
```

$$
x_f = 997 * x  \\
y = \frac{x_f r_y}{r_x * 1000 + x_f}; \quad 
y = \frac{997 x r_y}{1000 r_x + 997 x};\quad 
y = \frac{r_y x}{1.003009027 r_x + x} \\
q = 1.003009027 \\
y = \frac{r_y x}{q r_x + x};\quad 
y = \frac{q r_x r_y + r_y x - q r_x r_y}{q r_x + x};\quad 
y = \frac{(q r_x + x)r_y - q r_x r_y}{q r_x + x} \\
y = r_y - \frac{q r_x r_y}{q r_x + x};\quad 
y = r_y - \frac{r_x r_y}{r_x + x/q}
$$

<br>
<br>

So, now let's find an equation for profit using the system of liquidity equations:

$$
y = r_y - \frac{r_x r_y}{r_x + x/q};\quad 
x' = s_x - \frac{s_x s_y}{s_y + y/q};\quad 
p = x' - x \\
q = 1.003009027
$$

The final arbitrage equation for UniswapV2 protocol has the form:

$$
p = s_{x}-x-\frac{wr_{x}}{w+x}-\frac{ws_{x}}{qr_{x}}\cdot\frac{x}{w+x};\quad w=\frac{q^2s_yr_x}{qs_y+r_y}
$$

The function plot can be found [here](https://www.desmos.com/calculator/6afv8gsswf). The function is a combination if linear downgoin function and a [hyperbola](https://en.wikipedia.org/wiki/Hyperbola).

![](https://hackmd.io/_uploads/HJGZx_jT3.png)


In order to find a local maximum, let's use the fact that maximum is located in a point where the first derivative of the function turns zero:

$$
p' = \frac{ws_x}{qr_x} \frac{x}{(w+x)^2} + wr_x \frac{1}{(w+x)^2} - \frac{ws_x}{qr_x} \frac{1}{w+x} - 1 = 0 \\
\frac{ws_x}{qr_x}x + wr_x - \frac{ws_x}{qr_x}(w + x) - (w+x)^2 = 0 \\
wr_x - \frac{w^2s_x}{qr_x} - (w+x)^2 = 0 \\
x = \sqrt{wr_x - \frac{w^2s_x}{qr_x}} - w
$$

There are actually two solutions of the equation above, but considering that x is a natural number, the solution with negative result is out of scope. Using the `x` found by solving the equation for derivative, let's express the maximum profit amount:

$$
p = s_{x}-x-\frac{wr_{x}}{w+x}-\frac{ws_{x}}{qr_{x}}\cdot\frac{x}{w+x}\\
p = s_x - (w+x) + w - \frac{wr_x + x ws_x/qr_x}{w+x}\\
p = s_x - (w+x) + w - \frac{wr_x + (w+x) ws_x/qr_x - w^2s_x/qr_x}{w+x}\\
p = s_x + w - ws_x/qr_x - \frac{wr_x - w^2s_x/qr_x}{w+x} - (w+x)\\
p = s_x + w - ws_x/qr_x - \frac{wr_x - w^2s_x/qr_x + (w+x)^2}{w+x}
$$

Now using:

$$
w + x_{max} = \sqrt{wr_x - \frac{w^2s_x}{qr_x}}\\
p_{max} = s_x + w - ws_x/qr_x - \frac{wr_x - w^2s_x/qr_x + wr_x - w^2s_x/qr_x}{\sqrt{wr_x - \frac{w^2s_x}{qr_x}}}\\
p_{max} = s_x + w - ws_x/qr_x - 2\frac{wr_x-w^2s_x/qr_x}{\sqrt{wr_x - w^2s_x/qr_x}}\\
p_{max} = s_x + w - ws_x/qr_x - 2\sqrt{wr_x - w^2s_x/qr_x} \\
p_{max} = s_x + w(1 - 2\sqrt{r_x/w - s_x/qr_x} - s_x/qr_x)
$$

To finalize let's put everything together, the system below describes the most optimal amount of tokens `X` spent for the maximum profit after `X -> Y -> X'` exchange:

$$
q = 1.003009027;\quad
w = \frac{q^2s_yr_x}{qs_y+r_y} \\
x_{max} = \sqrt{wr_x - \frac{w^2s_x}{qr_x}} - w\\
p_{max} = s_x + w(1 - 2\sqrt{r_x/w - s_x/qr_x} - s_x/qr_x)
$$

<br>
<br>