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 добавление и удаление ликвидности — асинхронные операции с несколькими сообщениями.
STON.fi v2: vault model, factories, типы пулов
В 2024-2025 STON.fi выпустил v2 — редизайн с переходом от монолитной Pool-модели к vault-based архитектуре и расширению ассортимента пулов. v2 не вытеснил v1 (старые пулы продолжают работать), но новые пулы и интеграции уже идут только через v2.
Vault-based аккаунтинг
В v1 каждый Pool сам хранит резервы пары и обрабатывает все swap-запросы. В v2 эта ответственность разделена так же, как у DeDust: появились Vault-контракты, которые хранят активы и накапливают служебные балансы (например, реферальные комиссии — по одному vault на реферрера × токен). Pool занимается только AMM-математикой и эмиссией LP-токенов.
STON.fi v1:
Pool (USDT/TON) = резервы USDT + резервы TON + AMM + LP
STON.fi v2:
Vault (USDT, реферрер R) = накопленные комиссии
Vault (TON, реферрер R) = накопленные комиссии
Pool (USDT/TON, тип CPMM) = AMM + LP-учёт
Это нужно, чтобы корректно учитывать многоуровневые комиссии (LP + протокол + реферрер) без раздувания Pool-контракта и чтобы можно было апгрейдить логику аккаунтинга независимо от пулов.
Factory и типы пулов
STON.fi v2 ввёл Factory — центральный контракт, через который создаются новые Pool. Factory параметризован типом пула, и сегодня на v2 живут четыре семейства:
| Тип | Кривая | Применение |
|---|---|---|
| CPMM (Constant Product) | x * y = k | Универсальная пара токенов с волатильным курсом |
| CPI (Constant Product Invariant, single-sided) | CPMM + auto-swap при депозите | Депозит ликвидности одним токеном |
| Stable / WStable | StableSwap (низкий slippage около 1:1) | Пары стейблкоинов и обёрток (USDT/USDC, stTON/TON) |
| Weighted CP | CP с разными весами | Пары с асимметричным распределением (например, 80/20) |
Pool каждого типа имеет свой Router-класс в SDK — не общий базовый. Это сделано, чтобы при апгрейде одного типа пула не ломать интерфейс другого.
Single-sided LP
Один из самых заметных пользовательских апгрейдов v2 — депозит ликвидности одним токеном. Под капотом v2 принимает только один из двух токенов пары, vault сам выполняет swap половины суммы во второй токен и затем минтит LP-токены. Для пользователя это одно сообщение вместо двух, без ручного предварительного swap.
// SDK v2: single-sided provide через Router.CPI
await router.buildProvideLiquiditySingleTx({
vaultAddress: vault.address,
tokenAmount: toNano('100'), // 100 USDT
otherTokenAmount: toNano('0'), // ноль означает "auto-swap"
minLpOut: ...,
});
Router v2: batched routing
Router v2 поддерживает батч-маршрутизацию: один вызов SDK может построить маршрут через несколько пулов разного типа (например, USDT -> Stable -> stTON -> CPMM -> NOT). Старый v1 Router выполнял мульти-хоп через цепочку отдельных транзакций; v2 планирует маршрут заранее (через off-chain симуляцию) и упаковывает его в минимальное число on-chain сообщений.
Симулируйте маршрут перед отправкой
Production-паттерн в STON.fi v2 — сначала вызвать Simulator API (off-chain расчёт через индексер), получить ожидаемые суммы и набор контрактов на пути, и только потом строить транзакцию через dexFactory(). Это устойчиво к апгрейду роутеров: вам не нужно хардкодить адреса, фабрика сама построит правильные wrappers под актуальные контракты.
DeDust v2 CPMM: новый дефолт и Boosts
DeDust в ноябре 2025 запустил CPMM v2 — обновлённую реализацию constant-product пулов, которая с момента запуска стала дефолтом для всех новых пулов на DEX. Старые v1 CPMM пулы продолжают работать, но новых на v1 уже не создаётся.
Что изменилось в CPMM v2
| Параметр | CPMM v1 | CPMM v2 |
|---|---|---|
| Газ на swap | Базовый | Сниженный (микро-оптимизации message-flow) |
| Price impact | Стандартный CP | Лучший за счёт точного rounding и асимметричной обработки fee |
| Liquidity locker | Через сторонние решения | Встроен в протокол (с Q1 2026) |
| Совместимость с Boosts | — | Да (с янв 2026) |
Главное практическое следствие: новые пулы на CPMM v2 дают чуть лучший realized price на одной и той же AMM-формуле. Разница на малых ордерах незаметна, но на ордерах от $10K и выше CPMM v2 заметно обходит v1 — за счёт того, что комиссия и round-down теперь применяются в порядке, минимизирующем накопленную ошибку.
Boosts: концентрированная ликвидность лайт
С 26 января 2026 на DeDust работают Boosts — механизм, при котором проектная команда (founder, treasury, маркетинг-фонд) направляет дополнительные награды на конкретный CPMM v2 пул, чтобы привлечь LP. Технически Boost — это отдельный контракт-распределитель, который начисляет дополнительный токен (часто токен проекта) пропорционально доле в LP пула.
LP вносит ликвидность в CPMM v2 (USDT/PROJ)
└─ получает LP-токены пула
└─ стейкает LP в Boost-контракт
└─ начисляется bonus в PROJ + базовые swap-fee
Это не настоящая концентрированная ликвидность в стиле Uniswap v3 (без позиций по диапазону), а боковой инструмент, который функционально решает ту же задачу: повысить TVL в конкретном пуле без изменения математики самого AMM. Для интегратора это значит, что показывать пользователю надо суммарный APY = swap fees + boost rewards, иначе дисплей будет занижен.
Boosts только на v2
Если вы делаете аналитику или агрегатор, помните: Boosts применимы исключительно к пулам CPMM v2. Старые v1-пулы и stable-пулы Boost-наград не получают, и попытка сэстейкать туда LP в Boost-контракт ничем не закончится. Фильтруйте список eligible пулов по версии перед тем, как показать пользователю кнопку “boost”.
Сравнение 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%) при расчёте ожидаемого количества токенов на выходе.