Перейти к содержанию
Learning Platform
Глоссарий Troubleshooting
Урок 07.02 · 30 мин
Продвинутый
DEXSTONfiDeDustAMMLiquidityTON

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. Разница — в контрактной архитектуре.

NOTE

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-запросов, маршрутизация к нужному Pool1 (центральный)
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. Каждое сообщение — отдельная транзакция в блокчейне.

TIP

Slippage и deadline

При swap обязательно указывайте параметр min_out (минимальное количество токенов на выходе) и deadline (время, после которого swap отменяется). Из-за асинхронной природы TON между отправкой запроса и исполнением может пройти несколько секунд, и цена может измениться.


DeDust: Factory / Vault / Pool

DeDust использует другую архитектурную модель:

Контракты

КонтрактРольКоличество
FactoryСоздание новых Pool и Vault контрактов1 (центральный)
VaultХранение активов одного типа токена1 на каждый тип токена
PoolAMM-математика, расчёт обменных курсов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.

Процесс

  1. Пользователь отправляет токен A и токен B в Pool (через два отдельных сообщения)
  2. Pool выпускает LP-токены (Liquidity Provider tokens) — receipt, подтверждающий долю пользователя
  3. LP-токены — это тоже Jetton (TEP-74), у каждого пользователя свой LP Wallet контракт

LP-токены как Jetton

Pool LP Token Distribution
Pool (USDT/TON)
├── LP Jetton Master
├── LP Wallet (User A) — доля 30%
├── LP Wallet (User B) — доля 50%
└── LP Wallet (User C) — доля 20%

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 / WStableStableSwap (низкий slippage около 1:1)Пары стейблкоинов и обёрток (USDT/USDC, stTON/TON)
Weighted CPCP с разными весамиПары с асимметричным распределением (например, 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 сообщений.

TIP

Симулируйте маршрут перед отправкой

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 v1CPMM 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, иначе дисплей будет занижен.

WARNING

Boosts только на v2

Если вы делаете аналитику или агрегатор, помните: Boosts применимы исключительно к пулам CPMM v2. Старые v1-пулы и stable-пулы Boost-наград не получают, и попытка сэстейкать туда LP в Boost-контракт ничем не закончится. Фильтруйте список eligible пулов по версии перед тем, как показать пользователю кнопку “boost”.


Сравнение STONfi и DeDust

ХарактеристикаSTONfi v2DeDust
АрхитектураRouter / Pool / LP WalletFactory / Vault / Pool
Хранение резервовВ Pool контрактеВ отдельных Vault контрактах
LP-токеныJetton (LP Wallet на пользователя)Jetton
Формула AMMConstant product (x*y=k)Constant product + Stable swap
АудитTrail of Bits (v2)CertiK

Ключевые выводы

  1. AMM-математика одинакова — формула x*y=k работает так же, как на Ethereum
  2. Архитектура принципиально другая — вместо одной транзакции swap = цепочка из 4—6 асинхронных сообщений
  3. LP-токены — это Jetton — шардированная архитектура, у каждого пользователя свой LP Wallet контракт
  4. Slippage критичен — из-за асинхронности обязательно указывайте min_out и deadline

Частые ошибки

  1. Не устанавливают минимальный выход (min_out) при свопе: без slippage protection фронтраннеры могут «сэндвичить» вашу транзакцию.
  2. Путают Router и Pool контракты: Router маршрутизирует свопы, а Pool хранит ликвидность; прямое взаимодействие с Pool небезопасно.
  3. Забывают о deadline (времени жизни) своп-транзакции: устаревшая транзакция может исполниться по невыгодному курсу.
  4. Не учитывают комиссию пула (обычно 0.3%) при расчёте ожидаемого количества токенов на выходе.

Проверка знанийKnowledge check
Почему swap на STONfi требует минимум 6 сообщений, а не одну транзакцию как на Uniswap?
ОтветAnswer
В TON контракты не могут вызывать друг друга синхронно -- каждое взаимодействие происходит через асинхронные сообщения. Для swap нужно: (1) User -> свой Jetton Wallet, (2) Jetton Wallet User -> Jetton Wallet Router, (3) Router -> Pool, (4) Pool -> Jetton Wallet Pool, (5) Jetton Wallet Pool -> Jetton Wallet User, (6) возврат excesses. Каждый шаг -- отдельная транзакция.

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 6