DEX на TON: как устроены Ston.fi и DeDust

Сравнишь архитектуру Ston.fi и DeDust: роутеры, vaults, пулы и как строить интеграцию без хардкода адресов.

DEX на TON

DEX (decentralized exchange) на TON — это набор смарт-контрактов, которые меняют один актив на другой по формуле пула, без централизованного ордербука. Два основных протокола — Ston.fi и DeDust.

Оба — AMM (automated market maker): цена определяется резервами в пуле, а не заявками покупателей и продавцов.


Общая схема AMM на TON

text
Пользователь → Router / Vault → Pool → Jetton Wallet / pTON

              резервы A и B
  1. Пользователь отправляет offer-актив (Gram или jetton).
  2. Контракт протокола принимает депозит и считает выход по формуле пула.
  3. Пользователь получает ask-актив, если minAsk не нарушен (slippage).

На TON нет атомарных multi-call в одном транзакционном «батче» как на EVM: сложные операции раскладываются в цепочку сообщений между контрактами.


Ston.fi: Router + pTON

Ston.fi строится вокруг Router — точки входа для свопов. Нативный Gram оборачивается в pTON (историческое имя proxy-актива), чтобы пулы работали единообразно с jetton.

typescript
// @ston-fi/sdk@2.7.0  |  @ston-fi/api@0.32.0
import { dexFactory, Client } from "@ston-fi/sdk";
import { StonApiClient } from "@ston-fi/api";

const tonClient = new Client({
  endpoint: "https://toncenter.com/api/v2/jsonRPC",
});
const api = new StonApiClient(); // mainnet: api.ston.fi

// Симуляция возвращает актуальный router — не хардкодь адрес
const simulation = await api.simulateSwap({
  offerAddress: "ton",
  askAddress: "EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs", // jUSDT mainnet
  offerUnits: "1000000000", // 1 Gram (9 decimals)
  slippageTolerance: "0.01", // 1%
});

const { router: routerInfo } = simulation;
const dex = dexFactory(routerInfo);
const router = tonClient.open(dex.Router.create(routerInfo.address));
const proxyTon = dex.pTON.create(routerInfo.ptonMasterAddress);

console.log("router:", routerInfo.address);
console.log("minAsk:", simulation.minAskUnits);

Ключевой паттерн Ston.fi: API диктует, какой router использовать. Хардкод адреса router ломается при апгрейдах протокола.

DeDust: Factory + Vault + Pool

DeDust разделяет роли жёстче:

КонтрактРоль
FactoryНаходит Vault и Pool по паре активов
VaultПринимает депозит конкретного актива
PoolХранит резервы и выпускает LP-токены
Liquidity DepositВременный контракт на время двухактивного депозита
typescript
// @dedust/sdk@0.8.7  |  @ton/ton@16.3.0
import { Factory, MAINNET_FACTORY_ADDR, Asset, PoolType } from "@dedust/sdk";
import { TonClient4, Address } from "@ton/ton";

const tonClient = new TonClient4({
  endpoint: "https://mainnet-v4.tonhubapi.com",
});

// MAINNET_FACTORY_ADDR — константа SDK, mainnet
const factory = tonClient.open(Factory.createFromAddress(MAINNET_FACTORY_ADDR));

const TON = Asset.native();
const SCALE = Asset.jetton(
  Address.parse("EQBlqsm144Dq6SjbPI4jjZvA1hqTIP3cFsu3ETLZNOZUh6TG"), // SCALE mainnet
);

const pool = tonClient.open(
  await factory.getPool(PoolType.VOLATILE, [TON, SCALE]),
);
const reserves = await pool.getReserves();
console.log("reserves:", reserves);

Ликвидность в DeDust вносится двумя отдельными депозитами в Vault A и Vault B — из‑за ограничений асинхронной модели сообщений TON.


Чем отличаются при интеграции

Ston.fiDeDust
Точка входаRouter (из API simulation)Factory → Vault / Pool
Нативный GrampTONNative Vault
Своп в приложенииsimulateSwapgetSwap*TxParamsVault / Pool методы SDK
ЛиквидностьRouter / vault API протоколаДва депозита + Liquidity Deposit
Данные off-chainapi.ston.fiDeDust API + on-chain get-методы

Выбор протокола — продуктовый: оба дают AMM-свопы. Для интеграции важнее не «кто лучше», а не хардкодить адреса и всегда считать minAsk / targetBalances из актуального состояния пула.

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

Хардкод router / factory из старого туториала → бери адрес из API (Ston.fi) или константы текущей версии SDK (DeDust) и проверяй сеть (mainnet ≠ testnet).

Путаешь decimals → Gram и большинство jetton — 9 decimals, jUSDT — 6. Всегда читай decimals из метаданных актива.

Игнорируешь slippage → без minAsk / защиты от проскальзывания своп может исполниться по худшей цене при движении резервов между симуляцией и подтверждением в кошельке.


Что дальше

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация