# 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$ стремящимся к бесконечности.

Такая зависимость является результатом устройства протокола, при котором цена (курс) активов является производной соотношения резервов этих активов в протоколе. В общем случае, соотношение резервов подчинается зависимости:
$$
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>