# 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>