Логика исполнения свапа
Модуль исполняет свапы в обоих направлениях пары: пользователь продаёт BTC за USDT (фаза Inventory Fill) или покупает BTC за USDT (фаза Inventory Release). Ниже — пошаговые сценарии обоих направлений и точные изменения балансов инвентаря.
5.1 Пользователь продаёт BTC (BTC → USDT)
Это фаза Inventory Fill: система покупает BTC у пользователя и накапливает его.
Последовательность:
- Фиксация курса. Фиксируется курс BTC/USDT путём хеджирования: цена сделки определяется в момент создания свапа и не меняется, пока пользователь выполняет свою часть.
- Пользователь отправляет BTC на адрес, выданный системой.
- Ожидание подтверждений. Система ждёт требуемое число подтверждений сети.
- Зачисление в инвентарь и выплата. После подтверждений система увеличивает BTC-инвентарь и отправляет пользователю USDT.
Изменение балансов:
inventory_BTC += amount_BTC # инвентарь BTC растёт (покупка)
inventory_USDT -= amount_USDT # запас USDT уменьшается (выплата пользователю)
Псевдокод исполнения:
on_swap_btc_to_usdt(amount_BTC):
rate = pricing_engine.final_rate(“BTC/USDT”) # фиксация курса (хеджирование)
amount_USDT = amount_BTC * rate
btc_tx = await_user_deposit(amount_BTC) # пользователь отправляет BTC
wait_confirmations(btc_tx) # подтверждения сети
inventory_BTC += amount_BTC # Inventory Fill
inventory_USDT -= amount_USDT
send_usdt_to_user(amount_USDT) # выплата
5.2 Пользователь покупает BTC (USDT → BTC)
Это фаза Inventory Release: система продаёт BTC из ранее накопленного инвентаря.
Последовательность:
- Проверка инвентаря. Проверяется наличие BTC в inventory: available_balance >= amount_BTC. Если доступного BTC недостаточно, сделка из инвентаря не исполняется.
- Фиксация курса и создание свапа.
- Пользователь отправляет USDT.
- Выплата из инвентаря. Используется ранее накопленный BTC: система списывает его из инвентаря, и пользователь получает BTC.
Изменение балансов:
inventory_BTC -= amount_BTC # инвентарь BTC уменьшается (продажа из запаса)
inventory_USDT += amount_USDT # запас USDT растёт (оплата пользователя)
Псевдокод исполнения:
on_swap_usdt_to_btc(amount_BTC):
require inventory_BTC.available_balance >= amount_BTC # проверка инвентаря
rate = pricing_engine.final_rate(“BTC/USDT”)
amount_USDT = amount_BTC * rate
usdt_tx = await_user_payment(amount_USDT) # пользователь платит USDT
wait_confirmations(usdt_tx)
inventory_BTC -= amount_BTC # Inventory Release
inventory_USDT += amount_USDT
send_btc_to_user(amount_BTC) # выплата из инвентаря
Симметрия модели
Два сценария зеркальны: заявка одного пользователя пополняет инвентарь, заявка следующего — расходует его. BTC, купленный на фазе Fill у пользователя A, становится источником выплаты на фазе Release пользователю B. Состояние позиции между фазами отслеживает Inventory Model, а цену, которая балансирует поток, формирует Pricing Engine.
См. также