Как ИИ-агенту свапать токены на TON некастодиально
Как ИИ-агенту сделать некастодиальный своп токенов на TON: get_swap_quote и build_swap_tx через Omniston, без хранения ключей.
Кто держит ключ — главный вопрос некастодиального свопа токенов на TON агентом
Представьте: вы поручаете ИИ-агенту следить за курсом и, когда USDT просядёт, докупить его за GRAM. Агент оценивает рынок, находит момент, готовит сделку — и тут всплывает вопрос, о котором обычно вспоминают слишком поздно. Чтобы агент реально совершил своп, кто-то должен подписать транзакцию приватным ключом. Кто держит этот ключ?
Если ответ «сервис, через который агент работает» — вы отдали чужому коду право распоряжаться вашими деньгами. Один промпт-инъекшн, одна утечка лога — и агент подписывает не то, что вы думали. И проблема тут не в том, «как дёрнуть DEX», а в том, как дать агенту собрать сделку, оставив подпись строго за кошельком человека. Ниже разберём, как сделать своп токенов TON агентом некастодиально.
Две части свопа: расчёт безопасен, подпись — нет
У свопа на DEX две принципиально разные части. Первая — вычислительная и безопасная: узнать курс, посчитать проскальзывание, собрать тело транзакции. Вторая — необратимая и опасная: подписать это тело приватным ключом и отправить в сеть. Отсюда развилка:
- Кастодиальная модель. Агент (или сервер за ним) держит ключ и подписывает сам. Удобно — агент действует автономно. Но ключ подписи оказывается рядом с LLM, а LLM — недетерминированная штука, которую можно уговорить недоверенным текстом (описания жетонов, ответы других инструментов, сообщения пользователя). Так, например, устроен официальный
@ton/mcpот TON Foundation: это агент-кошелёк с operator-ключом, который подписывает отправку и свап самостоятельно (схема split-key: operator-ключ у агента, owner-ключ у пользователя). Модель рабочая, у неё есть сильные стороны — автономная трата, работа с NFT и DNS, статус официального пакета. Но это доверие к держателю ключа. - Некастодиальная модель. Сервер только готовит транзакцию и возвращает её неподписанной. Подпись ставит кошелёк пользователя через TonConnect. Сервер никогда не видит и не хранит приватный ключ.
Для торгового агента, который крутится сутками, вторая модель снимает главный риск: даже если инфраструктура скомпрометирована, максимум, что «испортится» — неподписанная заготовка, которую вы всё равно подтверждаете вручную или политикой своего кошелька. Подробнее эта развилка разобрана в честном сравнении TONNode с официальным @ton/mcp.
Некастодиальная модель TONNode: сервер отдаёт неподписанную транзакцию
TONNode — это hosted MCP-сервер для TON. MCP (Model Context Protocol) — стандарт, по которому ИИ-агенты (Claude, Cursor, ChatGPT/Codex и любой MCP-клиент) вызывают внешние инструменты. TONNode даёт агенту 16 инструментов для работы с TON, и инструменты свапа, кроссчейна и генерации кошелька строго некастодиальны.
Ключевой инвариант: сервер НИКОГДА не подписывает и не хранит средства и приватные ключи. Для свапа это значит, что итоговый инструмент возвращает не «выполненную сделку», а неподписанное TonConnect-сообщение — готовый к подписи объект. Сервер физически не может подменить получателя средств после подписи, потому что подписи у него нет.
Своп в TONNode — это ровно два инструмента:
get_swap_quote— твёрдая котировка,build_swap_tx— неподписанная транзакция, готовая для TonConnect.
Оба работают через протокол Omniston, который агрегирует ликвидность STON.fi и DeDust сразу — котировка считается по обеим DEX, и вы получаете лучшую из доступных. Свап идёт в парах GRAM⇄жетон. GRAM — это переименованный Toncoin (переименован в июне 2026); сама сеть по-прежнему называется TON. То есть «GRAM» в котировке — это нативная монета сети.
get_swap_quote: твёрдая котировка через Omniston (STON.fi + DeDust)
Первый шаг — узнать, сколько вы реально получите. get_swap_quote возвращает твёрдую котировку: ожидаемую сумму на выходе и курс. Поскольку под капотом Omniston опрашивает STON.fi и DeDust одновременно, агенту не нужно самому обходить пулы и вручную сравнивать — он видит уже агрегированный результат.
Получи котировку на своп 100 USDT → GRAM.
Используй get_swap_quote. Покажи ожидаемый выход и курс.
Важный нюанс, из-за которого котировки часто считают неверно: котировка оперирует raw-единицами (минимальными неделимыми долями токена), а не «человеческими» числами. Поэтому перед тем как считать сумму свапа жетона, нужно знать его decimals.
get_jetton_info: зачем нужны decimals перед свопом (USDT = 6)
Вот типичная ошибка, которая ломает свапы: агент берёт «100 USDT» и подставляет 100 в поле суммы. Но on-chain у жетона нет понятия «100» — есть только raw-единицы. Сколько raw-единиц в одном токене, задаёт параметр decimals, а считается сумма как количество × 10^decimals.
- У USDT на TON
decimals = 6→ 100 USDT это100 × 10^6 = 100 000 000raw-единиц. - У большинства жетонов
decimals = 9→ 100 токенов это100 000 000 000raw-единиц.
Если наивно приписать «100 USDT» девять нулей (как у GRAM), вы запросите своп на сумму в 1000 раз больше задуманной. Ошибиться на три порядка здесь очень легко. Поэтому get_jetton_info — обязательный шаг: он возвращает имя, символ, decimals и эмиссию жетона.
Перед свопом узнай decimals входного жетона через get_jetton_info,
и только потом считай сумму в raw-единицах.
Глубже эта тема разобрана в статье про подключение ИИ-агентов к TON через MCP.
Вспомогательные инструменты: parse_address и get_jetton_balance
Полезны и два вспомогательных инструмента, которые стоит вызвать до сборки транзакции:
parse_address— офлайн-проверка и конвертация адреса (EQ/UQ/raw). Дешёвая страховка от опечатки в адресе жетона или получателя до того, как что-то собирать.get_jetton_balance— баланс жетона по основному адресу кошелька. Адрес джеттон-кошелька для баланса вычисляется он-чейн внутри инструмента, поэтому передавать нужно основной адрес, а не адрес джеттон-кошелька. Частая ошибка — подсунуть адрес джеттон-кошелька; не нужно, дайте основной.
build_swap_tx: неподписанное сообщение для TonConnect
Когда котировка получена и суммы посчитаны в правильных raw-единицах, build_swap_tx собирает саму транзакцию. И здесь — суть некастодиальности: инструмент возвращает НЕПОДПИСАННОЕ TonConnect-сообщение. Это не отправленная сделка, а заготовка: адрес контракта, сумма, payload. Сервер отдал вам «конверт», но не запечатал его — печать (подпись) ставит ваш кошелёк.
Дальше сообщение уходит в TonConnect-совместимый кошелёк (Tonkeeper и другие), пользователь видит, что именно подписывает, и подтверждает. Приватный ключ ни на каком шаге не покидает кошелёк и не попадает на сервер TONNode.
Собери транзакцию свопа по последней котировке через build_swap_tx.
Верни неподписанное TonConnect-сообщение — я подпишу его в кошельке.
Полный поток: от котировки до подписи в кошельке
Типичная последовательность для свапа жетона выглядит так:
parse_address— проверить и нормализовать адрес жетона и получателя (офлайн).get_jetton_info— узнатьdecimals(для USDT — 6, чаще 9), имя, символ.get_jetton_balance— убедиться, что средств хватает (основной адрес, не джеттон-кошелёк).get_swap_quote— получить твёрдую котировку через Omniston (STON.fi + DeDust).build_swap_tx— собрать неподписанную TonConnect-транзакцию.- Кошелёк пользователя подписывает через TonConnect — подпись на стороне пользователя.
На уровне промпта агенту это звучит естественно:
Хочу обменять 50 GRAM на USDT.
Сначала проверь адрес жетона USDT через parse_address,
узнай его decimals через get_jetton_info,
проверь баланс через get_jetton_balance,
возьми котировку get_swap_quote и собери транзакцию build_swap_tx.
Транзакцию не отправляй — верни мне неподписанное сообщение для TonConnect.
Агент сам разложит это на вызовы инструментов, а на выходе вы получите заготовку, которую подписываете в своём кошельке. Обратите внимание: последний шаг — не инструмент TONNode. Подпись выполняет кошелёк, и именно здесь проходит некастодиальная граница. Если строите полноценного торгового агента, посмотрите разбор задержек и латентности при торговле на TON — там этот поток встроен в цикл принятия решений. А для сделок за пределами TON у TONNode есть пять некастодиальных кроссчейн-инструментов на базе атомарного HTLC-эскроу.
Как подключить инструменты свапа к Claude, Cursor или ChatGPT
Инструменты свапа доступны на всех тарифах, включая бесплатный Hobby (60 запросов/мин) — Hobby это hosted-ключ. Платите вы только за пропускную способность, набор из 16 инструментов одинаковый на всех ключах.
Локально и бесплатно — для чтения. Пакет @tonnode/mcp — open source (MIT), работает по нативному ADNL-протоколу TON без HTTP-прослоек, запускается одной командой. Публичный конфиг даёт полный набор инструментов чтения:
{
"mcpServers": {
"ton": {
"command": "npx",
"args": ["-y", "@tonnode/mcp"]
}
}
}
Hosted-эндпоинт — для свапа и остального. Свой ключ (бесплатного Hobby достаточно), гарантированная пропускная способность и все 16 инструментов, включая get_swap_quote и build_swap_tx:
{
"mcpServers": {
"ton": {
"type": "http",
"url": "https://mcp.tonnode.io/mcp",
"headers": { "Authorization": "Bearer tn_live_…" }
}
}
}
Этот конфиг кладётся в настройки MCP вашего клиента — Claude Desktop, Cursor, ChatGPT/Codex или любого другого MCP-совместимого агента. После подключения hosted-ключа инструменты get_swap_quote и build_swap_tx появляются у агента автоматически. Ключ tn_live_… выдаётся сразу после входа, без карты.
Коротко о главном
- Своп в TONNode — это два инструмента:
get_swap_quote(твёрдая котировка) иbuild_swap_tx(неподписанная транзакция для TonConnect). - Оба идут через Omniston — агрегатор ликвидности STON.fi и DeDust.
- Подпись всегда у пользователя. Сервер не хранит и не подписывает ключи — в отличие от кастодиального официального
@ton/mcp. - Перед свапом жетона узнайте
decimalsчерезget_jetton_info(USDT = 6, большинство = 9), иначе сумма в raw-единицах посчитается неверно. - Свап-инструменты работают на любом hosted-ключе, включая бесплатный Hobby.
Некастодиальный своп на TON для агента — это дисциплина разделения ролей: сервер считает и собирает, кошелёк подписывает. В TONNode это ровно два инструмента поверх Omniston плюс get_jetton_info для корректных decimals — и ни один приватный ключ не покидает пользователя.
Начать проще всего с бесплатного ключа. Получите Hobby-ключ без карты и подключите инструменты свапа за пару минут: tonnode.io/dashboard?plan=hobby. Хотите сперва посмотреть весь набор инструментов — загляните на страницу инструментов.
Дайте вашему агенту доступ к TON
16 MCP-инструментов: чтение, некастодиальные свапы, кроссчейн и кошельки. Бесплатный тариф — 60 запр/мин, карта не нужна.