---
# System prepended metadata

title: Uniswap V2 - Арбитраж
tags: [ru, uniswap2, arbitrage, crypto]

---

# Uniswap V2 - Арбитраж

###### tags: `crypto`, `uniswap2`, `arbitrage`, `ru`

Данный документ является продуктом исследования протокола обмена криптовалюты Uniswap V2. Целью исследования является формулировка математической модели обмена криптовалюты с использованием протокола и разработка приложения для автоматической торговли с целью извлечения выгоды.

Под арбитражем в данном документе понимается практика извлечения выгоды за счет разницы между ценой покупки и продажи активов, в частом случае криптовалюты.

Далее в тексте будут использоваться следующие термины:

**Пара ликвидности** (**LP**) - смарт контракт (протокол) предоставляющий возможность обмена некоторого количества токенов `X` на некоторое количество токенов `Y`. В рамках данного документа ррассматриваются только протоколы версии Uniswap V2.

**Swap** (свап, обмен) - процедура обмена токенов.

**Резерв** - сумма токенов, закрепленная на балансе протокола. Каждый протокол имеет два резерва, соответстующих двум токенам, между которыми производится обмен. Обмен в рамках протокола Uniswap V2 разрешен в обоих направлениях.

<br>

## Определения операции обмена

Согласно [исходному коду протокола Uniswap V2](https://github.com/Uniswap/v2-periphery/blob/master/contracts/libraries/UniswapV2Library.sol#L43-L50), зависимость между количеством $x$ покупаемых (протоколом) токенов $X$ и количеством $y$ продаваемых токенов $Y$ выражается следующим уравнением:

$$
y = \frac{997 r_y x}{1000r_x + 997x}
$$

Где $r_x$ и $r_y$ - резервы токенов $X$ и $Y$ до обмена. Коэффициенты 997 отображают комиссию протокола, которая в случае Uniswap V2 фиксированная и составляет 0.3%. В общем случае, уравнение обмена имеет вид:

$$
y = \frac{qr_yx}{r_x + qx} \quad q = 1 - fee
$$

Где, $fee$ - комиссия протоколоа в процентах, а величина $q$ введена для простоты записи. На [графике](https://www.desmos.com/calculator/intgs5ozza) данная функция представляет гиперболу, асимптотичеки приближающуюся к значению $r_y$ при $x$ стремящимся к бесконечности.

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

Такая зависимость является результатом устройства протокола, при котором цена (курс) активов является производной соотношения резервов этих активов в протоколе. В общем случае, соотношение резервов подчинается зависимости:

$$
r_xr_y = k \quad\quad k - const
$$

Где $k$ - константа, установленная обладателем протокола в момент инициализации. Другими словами, эталонный обменный курс задается единожды, после чего регулируется протоколом в ответ на проведенные сделки, повышая цену на "проданный" актив.

<br>

Т.к. соотношение резервов в протоколе до и после обмена является постоянным, то следующее выражение показывает зависимость изменения в резерве одного токена в ответ на изменение резерва другого:

$$
(r_x + qx)(r_y - y) = r_xr_y
$$

Поскольку число количества токенов принадлежит натуральному ряду чисел, знаки $+x$ и $-y$ отображают направление обмена, т.е. в данном случе в результате пополнения резерва $r_x$ на сумму $x$, из резевра $r_y$ была освобождена сумма в размере $y$. Стоит отметить, что множитель $q$, также присваивается в зависимости от направления сделки, поскольку комиссия удерживается до поступления суммы в резерв.

>Обменный курс в традиционном смысле, в рамках рассмотрения протокола Uniswap V2, ввиду зависимости от суммы обмена, имеет лишь справочный характер, и может быть выражен как:
>
>$$
>\frac{x}{y} = \frac{x(r_x + qx)}{qr_yx} = \frac{r_x + qx}{qr_y}
>$$

<br>

## Маржинальность

Исходя из определения арбитража, выгода извлекается из разницы в цене активов между двумя операциями: купли и продажи. На данном этапе рассмотрения, определим маржинальность, как разницу между суммой активов $x$ затраченными на произведение операции и суммой тех же активов $x'$ полученных в результате закрытия всех сделок:

$$
\delta=x' - x
$$

Исходя из принципа работы протокола, проведение двух сделок в рамках одного протокола с положительной маржой невозможно без участия третьей стороны (так называемая "Сендвич атака"), что не входит в рамки рассмотрения в данной работе. Введу чего, далее в рассуждении подразумевается, что обратная сделка (продажа) производится с использования другого протокола с показателями резервов $s_x$ и $s_y$ и уравнением обмена:

$$
(s_x - x')(s_y + qy) = s_xs_y
$$

Где $y$ - количество активов, полученных в результате первой сделки. Тогда количество вырученных токенов $X$:

$$
x' = s_x - \frac{s_xs_y}{s_y + qy} = \frac{qs_xy}{s_y + qy}
$$

Используя уравнение обмена первого протокола:

$$
y(x)=\frac{qr_yx}{r_x + qx} \quad
x'(y)=\frac{q^2s_xr_yx/(r_x + qx)}{s_y + q^2r_yx/(r_x + qx)}
$$

$$
x'(x)=\frac{q^2s_xr_yx}{s_yr_x + qs_yx + q^2r_yx}
$$

Тогда выражение маржы:

$$
\delta(x)=x'-x=\frac{q^2s_xr_yx}{s_yr_x + qs_yx + q^2r_yx}-x
$$

Данная функция ([визуализация доступна здесь](https://www.desmos.com/calculator/jhriefsi1s)) является гиперболой асимптотически стремящейся к прямой $y=-x$. Функция принимает положительные значения на промежутке значений $x$ около начала координат, границы промежутка выражаются как:

$$
x_1=0 \quad x_2=\frac{q^2s_xr_y-s_yr_x}{qs_y+q^2r_y}
$$

Это следует из решения уравнения:

$$
\delta(x)=\frac{q^2s_xr_yx}{s_yr_x + qs_yx + q^2r_yx}-x=0\\
q^2s_xr_yx-s_yr_xx-qs_yx^2-q^2r_yx^2=0\\
x(q^2s_xr_y-s_yr_x-qs_yx-q^2r_yx)=0\\
q^2s_xr_y-s_yr_x-qs_yx_2-q^2r_yx_2=0\quad
x_1=0\\
(qs_y+q^2r_y)x_2=q^2s_xr_y-s_yr_x\quad
x_1=0\\
x_2=\frac{q^2s_xr_y-s_yr_x}{qs_y+q^2r_y}\quad
x_1=0
$$

<br>
<br>

## Максимизация маржи

Кривая, определяющей маржу, на участке $[x_1, x_2]$ имеет максимум при некоем значении $x_{opt}$, что соответствует набольшим значением маржы при последовательном проведении сделок покупки, с использованием протокола с показателями $r_x$ и $r_y$, и продажы с использованием протокола с показателями $s_x$ и $s_y$.

Координата $x_{opt}$, а именно оптимальное количество актива $X$, использованного для проведения первоначальной покупки, может быть найдено как координата $x$, обращающая первую производную функции маржи в ноль:

$$
\delta(x)=\frac{q^2s_xr_yx}{s_yr_x + qs_yx + q^2r_yx}-x
$$

Используем правило дифференцирования частного функций:

$$
(f/g)'=(f'g-fg')/g^2
$$

И производная функции маржи по $x$ принимает вид:

$$
\delta'(x)=\frac{q^2s_xr_y(s_yr_x + qs_yx + q^2r_yx)-q^2s_xr_yx(qs_y+q^2r_y)}{(s_yr_x + qs_yx + q^2r_yx)^2}-1\\
\delta'(x)=\frac{q^2s_xs_yr_xr_y + q^3s_xs_yr_yx + q^4s_xr_y^2x-q^3s_xs_yr_yx-q^4s_xr_y^2x}{(s_yr_x + qs_yx + q^2r_yx)^2}-1\\
\delta'(x)=\frac{q^2s_xs_yr_xr_y}{(s_yr_x + qs_yx + q^2r_yx)^2}-1
$$

Максимум функции $\delta(x_{opt})$ расположен в точке с координатой $x_{opt}$, в которой производная $\delta'(x)$ обращается в ноль: 

$$
\delta'(x_{opt})=\frac{q^2s_xs_yr_xr_y}{(s_yr_x + qs_yx_{opt} + q^2r_yx_{opt})^2}-1=0\\
\frac{q^2s_xs_yr_xr_y-(s_yr_x + qs_yx_{opt} + q^2r_yx_{opt})^2}{(s_yr_x + qs_yx_{opt} + q^2r_yx_{opt})^2}=0\\
\frac{(qs_y+q^2r_y)^2x_{opt}^2+2s_yr_x(qs_y+q^2r_y)x_{opt}+s_y^2r_x^2-q^2s_xs_yr_xr_y}{(s_yr_x + qs_yx_{opt} + q^2r_yx_{opt})^2}=0\\
(qs_y+q^2r_y)^2x_{opt}^2+2s_yr_x(qs_y+q^2r_y)x_{opt}+s_y^2r_x^2-q^2s_xs_yr_xr_y=0\\
$$

Найдем корни квадратного уравнения:

$$
x_{1,2}=\frac{-b\pm\sqrt{b^2-4ac}}{2a}
$$

Где, коэффициенты $a$,$b$ и $c$:

$$
a=(qs_y+q^2r_y)^2 \quad
b=2s_yr_x(qs_y+q^2r_y) \quad
c=s_y^2r_x^2-q^2s_xs_yr_xr_y
$$

$$
x_{1,2}=\frac{-2s_yr_x(qs_y+q^2r_y) \pm \sqrt{4s_y^2r_x^2(qs_y+q^2r_y)^2 - 4(qs_y+q^2r_y)^2(s_y^2r_x^2-q^2s_xs_yr_xr_y)}}{2(qs_y+q^2r_y)^2}\\
x_{1,2}=\frac{-s_yr_x \pm \sqrt{s_y^2r_x^2 - (s_y^2r_x^2-q^2s_xs_yr_xr_y)}}{qs_y+q^2r_y}\\
x_{1,2}=\frac{-s_yr_x \pm \sqrt{q^2s_xs_yr_xr_y}}{qs_y+q^2r_y}
$$

С учетом того,что $x \in N$, единственное решение имеет вид:

$$
x_{opt} = \frac{\sqrt{q^2s_xs_yr_xr_y}-s_yr_x}{qs_y+q^2r_y}
$$

Максимум маржи найдем, как значение функции маржи в точке $x_{opt}$:

$$
\delta(x_{opt})=\frac{q^2s_xr_yx_{opt}}{s_yr_x + q(s_y + qr_y)x_{opt}}-x_{opt}=\delta_{max}
$$

Подставим значение $x_{opt}$ и упростим:

$$
\frac{q^2s_xr_y(\sqrt{q^2s_xs_yr_xr_y}-s_yr_x)/(qs_y+q^2r_y)}{s_yr_x + q(s_y + qr_y)(\sqrt{q^2s_xs_yr_xr_y}-s_yr_x)/(qs_y+q^2r_y)}-\frac{\sqrt{q^2s_xs_yr_xr_y}-s_yr_x}{qs_y+q^2r_y}=\\
=\frac{q^2s_xr_y(\sqrt{q^2s_xs_yr_xr_y}-s_yr_x)/(qs_y+q^2r_y)}{s_yr_x+\sqrt{q^2s_xs_yr_xr_y}-s_yr_x}-\frac{\sqrt{q^2s_xs_yr_xr_y}-s_yr_x}{qs_y+q^2r_y}=\\
=\frac{q^2s_xr_y(\sqrt{q^2s_xs_yr_xr_y}-s_yr_x)}{(qs_y+q^2r_y)\sqrt{q^2s_xs_yr_xr_y}}-\frac{\sqrt{q^2s_xs_yr_xr_y}-s_yr_x}{qs_y+q^2r_y}=\\
=\frac{q^2s_xr_y(\sqrt{q^2s_xs_yr_xr_y}-s_yr_x)-(\sqrt{q^2s_xs_yr_xr_y}-s_yr_x)\sqrt{q^2s_xs_yr_xr_y}}{(qs_y+q^2r_y)\sqrt{q^2s_xs_yr_xr_y}}=\\
=\frac{
q^2s_xr_y\sqrt{q^2s_xs_yr_xr_y}
-q^2s_xs_yr_xr_y
-q^2s_xs_yr_xr_y
+s_yr_x\sqrt{q^2s_xs_yr_xr_y}
}{(qs_y+q^2r_y)\sqrt{q^2s_xs_yr_xr_y}}=\\
=\frac{
q^2s_xr_y\sqrt{q^2s_xs_yr_xr_y}
-2q^2s_xs_yr_xr_y
+s_yr_x\sqrt{q^2s_xs_yr_xr_y}
}{(qs_y+q^2r_y)\sqrt{q^2s_xs_yr_xr_y}}=\\
=\frac{q^2s_xr_y-2\sqrt{q^2s_xs_yr_xr_y}+s_yr_x}{qs_y+q^2r_y}
=\frac{(q\sqrt{s_xr_y}-\sqrt{s_yr_x})^2}{qs_y+q^2r_y}
$$

Итого, максимальное значение маржи на участке $[0,\frac{q^2s_xr_y-s_yr_x}{qs_y+q^2r_y}]$:

$$
\delta_{max}=\frac{(q\sqrt{s_xr_y}-\sqrt{s_yr_x})^2}{qs_y+q^2r_y}\quad
x_{opt}=\frac{\sqrt{s_yr_x}(q\sqrt{s_xr_y}-\sqrt{s_yr_x})}{qs_y+q^2r_y}
$$

Визуализация доступна по [ссылке](https://www.desmos.com/calculator/wqv4zulbui). Введем оценку, положительное значение маржи возможно только при выполнении следующего неравенства:

$$
\delta_{max} > 0 \quad \Longrightarrow \quad q^2s_xr_y > s_yr_x
$$

До сих пор мы рассматривали проведение сделок только в одном заданом направлении $X \rightarrow Y \rightarrow X$. Однако, если данное неравенство не выполняется, имеет смысл рассмотреть обратное направление $Y \rightarrow X \rightarrow Y$.

При значении $x_{opt}$, количество токенов $Y$ подаваемых на ввод второго протокола выражается как:

$$
y(x_{opt})=\frac{qr_yx_{opt}}{r_x + qx_{opt}}
=\frac{qr_y\sqrt{s_yr_x}(q\sqrt{s_xr_y}-\sqrt{s_yr_x})}{r_x(qs_y+q^2r_y)+q\sqrt{s_yr_x}(q\sqrt{s_xr_y}-\sqrt{s_yr_x})}
$$

<br>
<br>

### Вариация операций

В ходе проведения калькуляций может быть полезным расчитать максимальную маржу в случе обратного направления обмена, а так же изменив порядок протоколов.

Во-первых, рассмотрим операцию с направлением обмена $Y \rightarrow X \rightarrow Y$. В таком случае, изменение резервов описывается системой:

$$
(r_x - \bar{x})(r_y + q\bar{y}) = r_xr_y \\
(s_x + q\bar{x})(s_y - \bar{y'}) = r_xr_y
$$

Откуда:

$$
\bar{x}(y) = \frac{qr_x\bar{y}}{r_y + q\bar{y}} \\
\bar{y'}(y) = \frac{qs_y\bar{x}}{s_x+q\bar{x}} =
\frac{qs_y\frac{qr_x\bar{y}}{r_y + q\bar{y}}}{s_x+q\frac{qr_x\bar{y}}{r_y + q\bar{y}}}
=\frac{q^2s_yr_x\bar{y}}{s_xr_y+qs_x\bar{y}+q^2r_x\bar{y}}\\
\bar{\delta}(\bar{y}) = \frac{q^2s_yr_x\bar{y}}{s_xr_y+qs_x\bar{y}+q^2r_x\bar{y}} - \bar{y}
$$

Заметим, что данные выражения получаются из соответствующих выражений для направления $X \rightarrow Y \rightarrow X$ при простой замене переменных $x \Rightarrow \bar{y}$ и $y \Rightarrow \bar{x}$:

$$
y(x)=\frac{qr_yx}{r_x + qx} \\
x'(x)=\frac{q^2s_xr_yx}{s_yr_x + qs_yx + q^2r_yx} \\
\delta(x)=\frac{q^2s_xr_yx}{s_yr_x + qs_yx + q^2r_yx}-x
$$

Тогда, зависимость максимума маржи обратной сделки:

$$
\delta_{max}=\frac{(q\sqrt{s_xr_y}-\sqrt{s_yr_x})^2}{qs_y+q^2r_y} \quad \Rightarrow \quad
\bar{\delta}_{max} = \frac{(q\sqrt{s_yr_x}-\sqrt{s_xr_y})^2}{qs_x+q^2r_x}
\\
x_{opt}=\frac{\sqrt{s_yr_x}(q\sqrt{s_xr_y}-\sqrt{s_yr_x})}{qs_y+q^2r_y}
\quad \Rightarrow \quad
\bar{y}_{opt} = \frac{\sqrt{s_xr_y}(q\sqrt{s_yr_x} - \sqrt{s_xr_y})}{qs_x + q^2r_x}
$$

Может принимать положительные значения только при:

$$
\bar{\delta}_{max} > 0 \quad q^2s_yr_x > s_xr_y
$$

Сравним с аналогичной оценкой для прямой сделки:

$$
\delta_{max} > 0 \quad q^2s_xr_y > s_yr_x
$$

Поскольку $r_x,r_y,s_x,x_y > 0$:

$$
q^2(s_yr_x + s_xr_y) > s_xr_y + s_yr_x \\
q^2 > \frac{s_xr_y + s_yr_x}{s_yr_x + s_xr_y} \quad q > 1
$$

Это неравенство показывает, что положительная маржа возможна только в случае если протокол доплачивает пользователю за пользование (отрицательная комиссия), во всех остальных случаях, только одно из направлений сделки имеет положительную маржу.

Представим неравенста в виде отношения резервов протоколов:

$$
\delta_{max} > 0
\quad q^2s_xr_y > s_yr_x
\quad q^2s_x/r_x > s_y/r_y
\quad s_y/r_y < q^2s_x/r_x \\
\bar{\delta}_{max} > 0
\quad q^2s_yr_x > s_xr_y
\quad q^2s_y/r_y > s_x/r_x
\quad s_y/r_y > s_x/q^2r_x
$$

В таком виде, данные неравенства позволяют принять решение о проведении сделки и её направлении, оперируя лишь известными соотношениями балансов.

<br>
<br>

Рассмотрим вариант при котором, обмен происходит в нормальном направлении, но протоколы используются в обратном порядке. В таком случае, уравнения обмена имеют вид:

$$
(s_x + qx)(s_y - \tilde{y}) = s_xs_y \\
(r_x - q\tilde{x'})(r_y + q\tilde{y}) = r_xr_y \\
$$

Соответственно:

$$
\tilde{y}(x) = qs_yx/(s_x + qx) \\
x'(x) = qr_x\tilde{y}/(r_y + q\tilde{y})=
\frac{q^2s_yr_xx/(s_x + qx)}{r_y + q^2s_yx/(s_x + qx)}=
\frac{q^2s_yr_xx}{s_xr_y + qr_yx + q^2s_yx}\\
\tilde{\delta}(x)=\frac{q^2s_yr_xx}{s_xr_y + qr_yx + q^2s_yx}-x
$$

Заметим, что данные уравнения могут быть получены из исходных путем замены коэффициентов $r_x \Rightarrow s_x$, $r_y \Rightarrow s_y$, $s_x \Rightarrow r_x$ и $s_y \Rightarrow r_y$

$$
y(x)=qr_yx(r_x + qx) \\
x'(x)=\frac{q^2s_xr_yx}{s_yr_x + qs_yx + q^2r_yx} \\
\delta(x)=\frac{q^2s_xr_yx}{s_yr_x + qs_yx + q^2r_yx}-x
$$

Получим выражение максимума маржи и оптимального ввода аналогичным способом:

$$
\delta_{max}=\frac{(q\sqrt{s_xr_y}-\sqrt{s_yr_x})^2}{qs_y+q^2r_y} \quad \Rightarrow \quad
\tilde{\delta}_{max}=
\frac{(q\sqrt{s_yr_x}-\sqrt{s_xr_y})^2}{qr_y+q^2s_y}
\\
x_{opt}=\frac{\sqrt{s_yr_x}(q\sqrt{s_xr_y}-\sqrt{s_yr_x})}{qs_y+q^2r_y}
\quad \Rightarrow \quad
\tilde{x}_{opt}=
\frac{\sqrt{s_xr_y}(q\sqrt{s_yr_x}-\sqrt{s_xr_y})}{qr_y+q^2s_y}
$$

Проведем оценку:

$$
\delta_{max} > 0
\quad q^2s_xr_y > s_yr_x
\quad s_y/r_y < q^2s_x/r_x \\
\tilde{\delta}_{max} > 0
\quad q^2s_yr_x > s_xr_y
\quad s_y/r_y > s_x/q^2r_x \\
\bar{\delta}_{max} > 0
\quad q^2s_yr_x > s_xr_y
\quad s_y/r_y > s_x/q^2r_x
$$

Заметим, что условия для проведения обратной сделки и сделки при обратном порядке операций совпадает. Проанализируем зависимость максимума маржи обратной сделки от сделки с обратным порядком протоколов:

$$
q^2s_yr_x > s_xr_y \quad
\bar{\delta}_{max} / \tilde{\delta}_{max}
= \frac{r_y+qs_y}{s_x+qr_x}
$$

<br>
<br>

И наконец, рассмотрим сделку в обратном порядке с обратным порядком протоколов:

$$
(s_x - \bar{\tilde{x}})(s_y + q\tilde{y}) = s_xs_y \\
(r_x + q\bar{\tilde{x}})(r_y - \tilde{y}') = r_xr_y
$$

$$
\bar{\tilde{x}} = qs_x\tilde{y} / (s_y + q\tilde{y}) \\
\tilde{y}' = qr_y\bar{\tilde{x}} / (r_x + q\bar{\tilde{x}})
= \frac{q^2s_xr_y\tilde{y}}{s_yr_x + qr_x\tilde{y} + q^2s_x\tilde{y}} \\
\bar{\tilde{\delta}}(\tilde{y}) =
\frac{q^2s_xr_y\tilde{y}}{s_yr_x + qr_x\tilde{y} + q^2s_x\tilde{y}} - \tilde{y}
$$

Заметим, что выражение $\bar{\tilde{\delta}}(\tilde{y})$ может быть получено из $\bar{\delta}(\bar{y})$ заменой переменных:

$$
\bar{\delta}(\bar{y}) = \frac{q^2s_yr_x\bar{y}}{s_xr_y+qs_x\bar{y}+q^2r_x\bar{y}} - \bar{y}
\quad \bar{y} \Rightarrow \tilde{y} \\
r_x \Rightarrow s_x \quad r_y \Rightarrow s_y \\
s_x \Rightarrow r_x \quad s_y \Rightarrow r_y
$$

И тогда:

$$
\bar{\delta}_{max} =
\frac{(q\sqrt{s_yr_x}-\sqrt{s_xr_y})^2}{qs_x+q^2r_x}
\quad \Rightarrow \quad
\bar{\tilde{\delta}}_{max} = 
\frac{(q\sqrt{s_xr_y} - \sqrt{s_yr_x})^2}{qr_x+q^2s_x}
\\
\bar{y}_{opt} = \frac{\sqrt{s_xr_y}(q\sqrt{s_yr_x} - \sqrt{s_xr_y})}{qs_x + q^2r_x}
\quad \Rightarrow \quad
\bar{\tilde{y}}_{opt} = \frac{\sqrt{s_yr_x}(q\sqrt{s_xr_y} - \sqrt{s_yr_x})}{qr_x + q^2s_x}
$$

При условии:

$$
\delta_{max} > 0
\quad q^2s_xr_y > s_yr_x
\quad s_y/r_y < q^2s_x/r_x \\
\tilde{\delta}_{max} > 0
\quad q^2s_yr_x > s_xr_y
\quad s_y/r_y > s_x/q^2r_x \\
\bar{\delta}_{max} > 0
\quad q^2s_yr_x > s_xr_y
\quad s_y/r_y > s_x/q^2r_x \\
\bar{\tilde{\delta}}_{max} > 0
\quad q^2s_xr_y > s_yr_x
\quad s_y/r_y < q^2s_x/r_x
$$

$$
q^2s_yr_x > s_xr_y \quad
\bar{\delta}_{max} / \tilde{\delta}_{max}
= \frac{r_y+qs_y}{s_x+qr_x} \\
q^2s_x/r_x > s_y/r_y
\quad
\delta_{max} / \bar{\tilde{\delta}}_{max} =
\frac{r_x+qs_x}{s_y+qr_y}
$$

<br>
<br>

## Алгоритм проведения прямой сделки.

Ниже изложен алгоритм для предварительной оценки маржи и проведения арбитража, на примере пары `WETH` `USDC`. 

1. Получить значения резервов обоих протоколов:

```
q = 0.997
r00 - WETH reserve of the first protocol
r01 - USDC reserve of the first protocol
r10 - WETH reserve of the first protocol
r11 - USDC reserve of the first protocol
```

2. Оценить маржи:

```
a = q * sqrt(r10 * r01)
b =     sqrt(r11 * r00)

if (a <= b) // positive margin is impossible, cancel
```

3. Рассчитать вводные параметры:

```
с = q * (r11 + q * r01)

in1 = b * (a - b) / с                  // amount in for the first protocol
in2 = q * r01 * in1 / (r00 + q * in2)  // amount in for the second protocol
```

4. Расчитать маржу:

```
margin = (a - b)^2 / c
```

<br>
<br>

## Расширенный алгоритм.

Ниже изложен расширенный алгоритм, позволяющий принять решение относительно какую имеено сделку проводить, в зависимости от начальных условий, на примере пары `WETH` `USDC`:

1. Получить значения резервов обоих протоколов:

```
q = 0.997
r00 - WETH reserve of the first protocol
r01 - USDC reserve of the first protocol
r10 - WETH reserve of the first protocol
r11 - USDC reserve of the first protocol
```

2. Предварительная оценка и выбор вида операции:

```
if (q^2 * r10 * r00 > r11 * r00) {
  // backward or reverse operations are possible
  const a = q * sqrt(r11 * r00)
  const b =     sqrt(r10 * r01)
  
  if (r01 + q * r11 > r10 + q * r00) {
    // backward operation
    const c = q * (r10 + q * r00)
    
    // amount of USDC in for the first protocol
    const y = b * (a - b) / c
    
    // amount of WETH in for the second protocol
    const x = q * r00 * y / (r01 + q)
    
    // margin in USDC
    const margin = (a - b)^2 / c
    
  } else {
    // reverse operation
    const c = q * (r01 + q * r11)
    
    // amount of WETH in for the second protocol
    const x = b * (a - b) / c
    
    // amount of USDC in for the first protocol
    const y = q * r11 * x / (r10 + q * x)
    
    // margin in WETH
    const margin = (a - b)^2 / c
  }

} else if (q^2 * r11 * r00 > r10 * r01) {
  // Forward or backward-reverse operations are possible
  const a = q * sqrt(r10 * r01)
  const b =     sqrt(r11 * r00)
    
  if (r00 + q * r10 > r11 + q * r01) {
    // forward
    const c = q * (r11 + q ^ r01)

    // amount of WETH in for the first protocol
    const x = b * (a - b) / с   
    
    // amount of USDC in for the second protocol
    const y = q * r01 * x / (r00 + q * x)  
    
    // margin in WETH
    const margin = (a - b)^2 / c
  } else {
   // backward
   const c = q * (r00 + q ^ r10)
   
   // amount of USDC in for the second protocol
   const y = b * (a - b)^2 / c
   
   // amount of WETH in for the first protocol
   const x = q * r10 * y / (r11 + q * y)
   
   // margin in USDC
   const margin = (a - b)^2 / c
  }
  
}
```

<br>
<br>
<br>
<br>