Розробка торговельного бота для TON DEX (StonFi, DeDust)
TON blockchain принципово відрізняється від EVM: асинхронна модель сповіщень, відсутність глобального стану у звичайному сенсі, FunC/Tact замість Solidity. Торговельний бот для StonFi або DeDust — це не «переписати Ethereum бот іншою мовою». Це інша архітектура з іншими точками відмови.
Асинхронність TON: чому звичайні паттерни не працюють
Транзакції у TON — це ланцюги сповіщень
На Ethereum своп — один виклик, один receipt, один статус: success або reverted. У TON один запит користувача породжує ланцюг internal messages між контрактами. Своп на StonFi v2:
- Гаманець користувача → Jetton Wallet:
transferз forward payload - Jetton Wallet → Router:
transfer_notification - Router → Pool:
swap - Pool → Jetton Wallet (output token):
internal_transfer - Jetton Wallet → гаманець користувача:
transfer_notification
Кожен крок — окремої транзакція з окремим хешем. Успіх першої транзакції не гарантує успіх всієї ланцюга. Якщо крок 3 або 4 провалиться — на кроках 5-6 прийде bounced message та вихідні токени повернуться.
Бот повинен: відправити крок 1, запам'ятати outgoing message hash, стежити дерево транзакцій за in_msg_hash, чекати либо успішного кроку 5, або bounced message з поверненням.
TON API для мониторингу транзакцій
TON Center API v2: GET /v2/transactions?address={}&limit=20<_={}&hash={} — отримуємо транзакції адреси. Для відслідковування конкретної ланцюга використовуємо lt (logical time) та hash для паганації.
Більш зручний варіант для ботів: TON API getBlockTransactions + WebSocket через TON Access. При отриманні кожного блоку — перевіряємо транзакції своєї адреси. Latency 1-3 секунди після фіналізації блоку (TON фіналізує за 5-6 секунд).
Бібліотеки: @ton/ton (TypeScript, офіційна) або tonutils-go (Go). Для Python — pytoniq-core.
Робота з StonFi та DeDust
StonFi v2: роутер та message payload
StonFi v2 swap payload для jetton → jetton:
import { StonApiClient } from '@ston-fi/api';
import { DEX } from '@ston-fi/sdk';
const client = new StonApiClient();
const dex = client.openDex(DEX.v2);
const txParams = await dex.getSwapJettonToJettonTxParams({
userWalletAddress: walletAddress,
offerJettonAddress: USDT_ADDRESS,
askJettonAddress: STON_ADDRESS,
offerAmount: toNano('100'), // 100 USDT
minAskAmount: toNano('95'), // 5% slippage
});
await wallet.sendTransaction(txParams);
minAskAmount — це on-chain slippage protection. Якщо пул не може дати мінімальну суму — транзакція bounced, токени повертаються. Бот повинен обчислювати minAskAmount на основі поточної ціни пулу мінус допустимий slippage.
DeDust: vault-based архітектура
DeDust відрізняється архітектурою: замість прямої відправки в pool — через vault. Кожен токен має свій vault контракт. Своп починається з depositing у vault з attached swap params у payload:
import { Asset, Factory, MAINNET_FACTORY_ADDR, Pool, VaultJetton } from '@dedust/sdk';
const factory = client.open(Factory.createFromAddress(MAINNET_FACTORY_ADDR));
const tonVault = client.open(await factory.getNativeVault());
// TON → Jetton своп
await tonVault.sendSwap(wallet.getSender(), {
poolAddress: pool.address,
amount: toNano('1'),
gasAmount: toNano('0.25'),
});
DeDust підтримує як Uniswap v2-стиль (volatile pools), так і Curve-стиль (stable pools). Для стейблкоїн-пар — stable pool з меншим slippage.
Отримання поточної ціни без свопу
Для StonFi: GET https://api.ston.fi/v1/pools/{poolAddress} повертає token0_address, token1_address, reserve0, reserve1. Ціна = reserve1 / reserve0 з урахуванням decimals.
Для DeDust: виклик Pool.getEstimatedSwapOut — view функція, повертає amountOut для заданого amountIn. Точніше, ніж розрахунок по резервам, особливо для stable пулів.
Стратегії: що реалізовано на TON DEX
Arbitrage StonFi ↔ DeDust. Одна та ж пара jetton/TON торгується на обох DEX. Цінове розходження >0.5% (вище комісій + газ) — можливість арбітражу. Атомарності немає (немає flash loans у тому ж сенсі), тому арбітраж двохетапний: своп на DEX1, потім своп на DEX2. Ризик: за час виконання першого свопу другий пул зміниться цену.
Grid trading. Покупка jetton при зниженні ціни нижче grid level, продажа при піднесенні. Проста стратегія, працює на боковому ринку. Для TON пар з достатньою ліквідністю ($500K+ TVL) — практично.
DCA (Dollar Cost Averaging). Автоматична покупка фіксованого обсягу TON→Jetton за розписанням. Реалізується через cron job + TON wallet SDK. Мінімальна складність, добре введення в TON bot розробку.
Інфраструктура
Гаманець. Для бота потрібен hot wallet — TON гаманець v4 або v5. Seed phrase зберігається в зашифрованому вигляді (AES-256), ніколи plaintext. Ліміт коштів на hot wallet — тільки операційний запас, основні кошти окремо.
Нода або RPC. Публічний TON Center безкоштовний, але rate-limited (1 req/sec). Для активної торгівлі — TON Center Pro ($49/місяць, 25 req/sec) або власна lite-server нода.
Моніторинг. Telegram bot для уведомлень про угоди (ironically, бот моніторить себе через Telegram). Prometheus метрики: trades_per_hour, profit_per_day, error_rate.
Процес розробки
Прототип на TypeScript (3-5 днів). Підключення до TON, чтення цін з StonFi/DeDust API, симуляція стратегії на історичних даних.
Розробка бота (1-2 тижні). Transaction builder, state machine для відслідковування pending swaps, error handling для bounced messages.
Тестування на TON testnet (3-5 днів). TON має повнофункціональний testnet з testnet StonFi deployment.
Production деплой. VPS + мониторинг. Запуск з малим капіталом, поступове масштабування.
Орієнтири за часовими рамками
DCA або grid бот з однією парою: 1-1.5 тижня. Arbitrage система з мониторингом кількох пар та автоматичним rebalancing: 2-3 тижні.







