Все статьи
6 мин чтения

Как ИИ-агенту свапать токены на TON некастодиально

Как ИИ-агенту сделать некастодиальный своп токенов на TON: get_swap_quote и build_swap_tx через Omniston, без хранения ключей.

TONMCPсвоп токеновнекастодиальность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 000 raw-единиц.
  • У большинства жетонов decimals = 9 → 100 токенов это 100 000 000 000 raw-единиц.

Если наивно приписать «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-сообщение — я подпишу его в кошельке.

Полный поток: от котировки до подписи в кошельке

Типичная последовательность для свапа жетона выглядит так:

  1. parse_address — проверить и нормализовать адрес жетона и получателя (офлайн).
  2. get_jetton_info — узнать decimals (для USDT — 6, чаще 9), имя, символ.
  3. get_jetton_balance — убедиться, что средств хватает (основной адрес, не джеттон-кошелёк).
  4. get_swap_quote — получить твёрдую котировку через Omniston (STON.fi + DeDust).
  5. build_swap_tx — собрать неподписанную TonConnect-транзакцию.
  6. Кошелёк пользователя подписывает через 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 запр/мин, карта не нужна.