DEX: STONfi и DeDust
Децентрализованные биржи (DEX) — это основа DeFi на TON, обеспечивающая обмен токенов без посредников. STONfi и DeDust — два крупнейших DEX на TON, и понимание их архитектуры необходимо для интеграции свопов в ваши dApps, создания торговых ботов и понимания механики ценообразования.
Decentralized Exchange (DEX) — самый используемый тип DeFi-протокола. На TON два основных DEX: STONfi и DeDust. Оба используют модель AMM (Automated Market Maker), но адаптированную под шардированную архитектуру TON.
AMM на TON: те же формулы, другая архитектура
AMM использует формулу constant product (постоянного произведения):
x * y = k
где:
x -- резерв токена A в пуле
y -- резерв токена B в пуле
k -- константа (не меняется при свопах)
Если пользователь добавляет dx токена A, он получает dy токена B:
dy = y * dx / (x + dx)
Эта формула одинакова для Uniswap, STONfi и DeDust. Разница — в контрактной архитектуре.
Uniswap vs STONfi
На Ethereum Uniswap — это один Router контракт, который обращается к Pool контрактам. Вся операция swap происходит в одной транзакции. На TON каждый шаг swap — отдельная транзакция с передачей сообщений между контрактами. STONfi использует Router + Pool + отдельные LP Wallet контракты для каждого пользователя.
STONfi v2: Router / Pool / LP Wallet
STONfi v2 использует трёхуровневую архитектуру:
Контракты
| Контракт | Роль | Количество |
|---|---|---|
| Router | Приём swap-запросов, маршрутизация к нужному Pool | 1 (центральный) |
| Pool | Хранение резервов пары, расчёт swap-сумм | 1 на каждую пару токенов |
| LP Wallet | Баланс LP-токенов пользователя | 1 на каждого LP-провайдера на каждую пару |
Как работает swap (пошагово)
User A хочет обменять USDT -> TON
Шаг 1: User A -> Jetton Wallet USDT (User A)
transfer USDT с forward_payload = swap request
Шаг 2: Jetton Wallet USDT (User A) -> Jetton Wallet USDT (Router)
internal_transfer -- токены перемещаются к Router
Шаг 3: Router -> Pool (USDT/TON)
swap_request с параметрами (min_out, deadline)
Шаг 4: Pool рассчитывает dy по формуле x*y=k
Pool -> Jetton Wallet TON (Pool)
transfer TON к User A
Шаг 5: Jetton Wallet TON (Pool) -> Jetton Wallet TON (User A)
internal_transfer -- User A получает TON-токены
Шаг 6: Pool -> User A
excesses -- возврат неиспользованного газа
Итого: минимум 6 сообщений для одного swap. Каждое сообщение — отдельная транзакция в блокчейне.
Slippage и deadline
При swap обязательно указывайте параметр min_out (минимальное количество токенов на выходе) и deadline (время, после которого swap отменяется). Из-за асинхронной природы TON между отправкой запроса и исполнением может пройти несколько секунд, и цена может измениться.
DeDust: Factory / Vault / Pool
DeDust использует другую архитектурную модель:
Контракты
| Контракт | Роль | Количество |
|---|---|---|
| Factory | Создание новых Pool и Vault контрактов | 1 (центральный) |
| Vault | Хранение активов одного типа токена | 1 на каждый тип токена |
| Pool | AMM-математика, расчёт обменных курсов | 1 на каждую пару токенов |
Отличие от STONfi
В STONfi Pool хранит резервы обоих токенов пары. В DeDust резервы хранятся в отдельных Vault контрактах — по одному на каждый тип токена. Pool занимается только математикой.
STONfi:
Pool (USDT/TON) = резервы USDT + резервы TON + AMM-логика
DeDust:
Vault (USDT) = резервы USDT
Vault (TON) = резервы TON
Pool (USDT/TON) = только AMM-логика
Как работает swap в DeDust
User A хочет обменять USDT -> TON
Шаг 1: User A -> Vault (USDT)
deposit USDT через Jetton transfer
Шаг 2: Vault (USDT) -> Pool (USDT/TON)
swap_request
Шаг 3: Pool рассчитывает dy по формуле x*y=k
Pool -> Vault (TON)
payout_request
Шаг 4: Vault (TON) -> User A
payout -- User A получает TON
Обе архитектуры решают одну задачу, но по-разному разделяют ответственность между контрактами.
Предоставление ликвидности
Чтобы DEX мог обменивать токены, кто-то должен предоставить ликвидность — внести оба токена пары в Pool.
Процесс
- Пользователь отправляет токен A и токен B в Pool (через два отдельных сообщения)
- Pool выпускает LP-токены (Liquidity Provider tokens) — receipt, подтверждающий долю пользователя
- LP-токены — это тоже Jetton (TEP-74), у каждого пользователя свой LP Wallet контракт
LP-токены как Jetton
LP-токены можно:
- Удерживать — получать долю от комиссий за swap
- Передавать — как любой Jetton
- Использовать в DeFi — как залог в lending-протоколе
Impermanent Loss (непостоянные потери)
Если цена токенов в паре изменяется, LP-провайдер получает меньше, чем если бы просто держал токены. Это называется impermanent loss. Формула и концепция идентичны Ethereum, но на TON добавление и удаление ликвидности — асинхронные операции с несколькими сообщениями.
Сравнение STONfi и DeDust
| Характеристика | STONfi v2 | DeDust |
|---|---|---|
| Архитектура | Router / Pool / LP Wallet | Factory / Vault / Pool |
| Хранение резервов | В Pool контракте | В отдельных Vault контрактах |
| LP-токены | Jetton (LP Wallet на пользователя) | Jetton |
| Формула AMM | Constant product (x*y=k) | Constant product + Stable swap |
| Аудит | Trail of Bits (v2) | CertiK |
Ключевые выводы
- AMM-математика одинакова — формула x*y=k работает так же, как на Ethereum
- Архитектура принципиально другая — вместо одной транзакции swap = цепочка из 4—6 асинхронных сообщений
- LP-токены — это Jetton — шардированная архитектура, у каждого пользователя свой LP Wallet контракт
- Slippage критичен — из-за асинхронности обязательно указывайте min_out и deadline
Частые ошибки
- Не устанавливают минимальный выход (min_out) при свопе: без slippage protection фронтраннеры могут «сэндвичить» вашу транзакцию.
- Путают Router и Pool контракты: Router маршрутизирует свопы, а Pool хранит ликвидность; прямое взаимодействие с Pool небезопасно.
- Забывают о deadline (времени жизни) своп-транзакции: устаревшая транзакция может исполниться по невыгодному курсу.
- Не учитывают комиссию пула (обычно 0.3%) при расчёте ожидаемого количества токенов на выходе.
Проверка знанийПочему swap на STONfi требует минимум 6 сообщений, а не одну транзакцию как на Uniswap?
Проверьте понимание
Закончили урок?
Отметьте его как пройденный, чтобы отслеживать свой прогресс
Войдите чтобы оценить урок