Skip to content

core-223-amm-best-price-selection-logic-new#105

Open
AOranov wants to merge 19 commits into
core-150_amm-aggregationfrom
core-223-amm-best-price-selection-logic-new
Open

core-223-amm-best-price-selection-logic-new#105
AOranov wants to merge 19 commits into
core-150_amm-aggregationfrom
core-223-amm-best-price-selection-logic-new

Conversation

@AOranov

@AOranov AOranov commented Jun 27, 2024

Copy link
Copy Markdown
Collaborator

No description provided.

@linear

linear Bot commented Jun 27, 2024

Copy link
Copy Markdown
CORE-223 AMM best price selection logic

В общем случае у нас существует множество асков A и множество бидов B для пары {X, Y}, а так же N AMM-пулов, содержащих пару {X, Y}. Каждый аск обладает признаками {Y_amount_to_sell_i, worst_x_fill_price_i}, каждый бид обладает признаками {X_amount_to_sell_i, worst_y_fill_price_i}. Вся совокупность ордеров может быть охарактеризована четырьмя суммами: {Y_amount_to_sell, X_amount_to_sell, Y_amount_to_fill_worst, X_amount_to_fill_worst}, где Y_amount_to_fill_worst и X_amount_to_fill_worst расчитанны как сумма Y_amount_to_fill_worst и X_amount_to_fill_worst согласно worst_x_fill_price_i и worst_y_fill_price_i для каждого отдельно ордера.

Задача - исполнить максимальное кол-во ордеров из {A, B} с наиболее выгодной ценой для каждого конкретного ордера.

Для выполнения задачи необходимо сформировать батч, в котором содержатся мэтчи ордеров с их контр-ордерами и/или мэтчи ордеров с AMM-пулами. Поскольку заранее нам неизвестно потребуется ли вовлечение AMM-пулов, мы резервируем в батче место для N свопов (худший случай).

Возможно 4 основных сценария:

1.Y_amount_to_sell >= Y_amount_to_fill_worst && X_amount_to_sell >= X_amount_to_fill_worst

2.Y_amount_to_sell < Y_amount_to_fill_worst && X_amount_to_sell < X_amount_to_fill_worst

3.Y_amount_to_sell >= Y_amount_to_fill_worst && X_amount_to_sell < X_amount_to_fill_worst

4.Y_amount_to_sell < Y_amount_to_fill_worst && X_amount_to_sell >= X_amount_to_fill_worst

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

  1. Рассчитываем худшую цену множества ордеров {A, B} как p_orders_worst = Y_amount_to_sell/X_amount_to_sell
  2. Рассчитываем спот-цены пулов, содержащих пару {X, Y} (с учетом комиссии): {p1, p2, p3}
  3. Если p_orders_worst меньше любой цены из {p1, p2, p3}, то не задействуем AMM и выполняем ордера по алгоритму мэтчинга друг с другом algM
  4. Если p_orders_worst больше хотя бы одной цены из {p1, p2, p3}, то выполняем alg1, который принимает на вход только пулы для которых выполняется условие p_orders_worst > p_i, пусть {p1, p2, p3}

alg1:

Если существует пул с лучшей чем у других спот-ценой:

  1. Выбираем пул с лучшей ценой и смотрим расстояние до второй лучшей цены, пусть p1 и p2.
  2. Считаем доступный в p1 вольюм по прайс импакту 1-p2/p1. То есть это то кол-во, которое доступно в пуле p1 по цене лучшей, чем в p2.
  3. Если этот вольюм удовлетворяет нашему предложению, то дело закрыто.
  4. Если нет, то проворачиваем такую же операцию для 1-p3/p1 из начально состояния пула p1, опять смотрим на ликвидность. Если удовлетворили, то дело закрыто.
  5. Если нет, то в добавок к пункту 5 считаем для пула p2 для импакта 1-p3/p2. Если да, то дело закрыто с двумя пулами.
  6. Если нет, то повторяем цикл пока спот цены во всех пулах не станут равны между собой.

Если спот-цены всех пулов равны:

  1. Если для всех пулов спот цены равны, то считаем прайс импакт на юзера 1 - avg_sell_price/spotдля свопа на весь остаток от X_amount_to_sell и делим своп между пулами обратно пропорционально импакту. Например, импакты [0.2, 0.3, 0.3], значит сумма обратных 5 + 3.(3) + 3.(3) = 11.(6), значит от общего base в первый пул пойдет 5/11.(6), во второй 3.(3)/11.(6) и тд.

@AOranov AOranov requested a review from oskin1 June 27, 2024 13:40
@oskin1 oskin1 force-pushed the core-150_amm-aggregation branch from b401c14 to 9bf32bc Compare July 2, 2024 15:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants