В экосистеме TON фунгибельные токены называются джеттонами (Jetton) и формально описаны стандартом TEP-74. Архитектура классическая для TON: Jetton Master (Minter) хранит метаданные/эмиссию, а для каждого владельца создаётся отдельный Jetton Wallet-контракт, где учитывается баланс и исполняются переводы. Осенью 2025 года сообществу представлен Jetton v2 (Jetton 2.0) — обновление референс-реализации, сохраняющее интерфейс TEP-74, но заметно оптимизирующее газ и пропускную способность за счёт перевода кода jetton-wallet в library-cell и связанных улучшений пайплайна.
Что вам это даёт:
- Меньше комиссий и веса сообщений. Код кошелька хранится как библиотечная ячейка (library cell), а не инлайн — сокращаются storage/forwarding-fee и размер StateInit при пересылках.
- Стабильнее под нагрузкой. Снижается вероятность «захлёбывания» при internal_transfer и массовых рассылках/эйрдропах; обработка кошельков становится предсказуемее.
- Совместимость на уровне API. Для кошельков/бирж это те же вызовы TEP-74 (transfer/burn/metadata), но быстрее и дешевле.
Ниже — детальное руководство по Jetton v2: чем он отличается от «v1» (референс-TЕP-74), как устроена библиотечная раскладка кода, как работать с Mintless Jetton (TEP-176/177), на что смотрят биржи/кошельки и где подстерегают граничные случаи.
База: как устроены джеттоны в TON
Архитектура.
- Jetton Master (Minter) — мастер-контракт: хранит общее состояние (total supply, ссылку/ячейку метаданных), управляет эмиссией и расчётом адресов кошельков.
- Jetton Wallet — отдельный кошелёк для каждого владельца: хранит баланс, принимает/шлёт internal_transfer, рассылает нотификации, обрабатывает on_bounce.
- Метаданные — по стандарту TEP-64 (on-chain / semi-chain / off-chain). Для приложений критично корректно парсить name/symbol/decimals/image и пр.
Сообщения и обработчики (минимум):
- transfer → отправка из кошелька владельца; может нести forward_payload для получателя.
- internal_transfer → внутренняя доставка между кошельками; при неуспехе возможен bounce и возврат средств через on_bounce.
- burn → сжигание с уведомлением мастеру.
- get_wallet_data / get_wallet_address → чтение баланса/адреса кошелька.
Десятичность. У джеттонов разная decimals (например, jUSDT — 6, большинство — 9), это важно для фронтендов/SDK.
См. также: Транзакция, Кошелёк, Безопасность.
Что приносит Jetton v2 (Jetton 2.0)
1) Library-cell для кода Jetton Wallet. Главное изменение — код кошелька вынесен в библиотечную ячейку сети (library cell), а в конкретных кошельках хранится ссылка-хэш. Это:
- Сильно уменьшает размер StateInit и объём пересылаемых данных при создании/взаимодействиях.
- Сокращает forwarding fee на маршруте internal_transfer (типичный выигрыш по документации — в ~3–4 раза для кейсов с init_code).
- Упрощает массовые рассылки/аирдропы и работу под пиковыми нагрузками.
2) Гарантии исполнения и «правильное» развертывание. Референс подчёркивает: гарантии исполнения v2 корректны, только если кошелёк развёрнут как library. Если вы используете форк «без библиотеки», нужно пересчитать газ-константы и принять риски более тяжёлых сообщений. В репозитории описан стандартный Librarian-контракт для публикации библиотеки и проверки валидности развертывания.
3) Экономика хранения библиотеки. Библиотека публикуется на длительный срок (в референсе типовое значение — порядка «десятков лет»), за что вносится депозит TON. Важно мониторить срок хранения: если библиотека истечёт и не будет продлена, кошельки потеряют доступ к коду и перестанут обрабатывать сообщения. В проде держите процедуру продления и аварийный план.
4) Производительность под нагрузкой. На практике Jetton v2 даёт существенный прирост скорости обработки при перегрузках сети (в публичных анонсах — «до ×3 быстрее» при конгестии) и снижение совокупных комиссий; для пользователей UX не меняется — те же переводы, но быстрее/дешевле.
5) Совместимость. Интерфейсы TEP-74 и парсинг TEP-64 сохранены. Это означает, что кошельки/биржи/сканеры не обязаны менять API — важно лишь обновить Heuristics по проверке кошельков (см. ниже).
Как это работает технически
Развёртывание библиотеки кода кошелька
- Публикуете код jetton-wallet как library cell через librarian (спец-контракт + скрипт).
- В Jetton Master передаёте library-ссылку на код кошелька вместо «сырых» байтов.
- Все создаваемые Jetton Wallet будут ссылаться на эту библиотеку.
Плюсы для сообщений/физики TON
- Кошелёк при internal_transfer не тащит за собой «тонны» init-кода, что уменьшает вес и forwarding fee.
- Меньше шанс, что сообщение «не пролезет» в слот из-за размера/квот.
- Лёгче масштабировать массовые операции (аирдропы, пулы ликвидности, премии и т. п.).
Проверки на стороне сервисов
- При индексации кошельков проверяйте соответствие minter/wallet (из get_wallet_data) и валидность ссылки на библиотеку.
- Держите «белый список» хэшей библиотек для популярных джеттонов, чтобы отсекать фишинговые «лжекошельки».
Mintless Jetton (TEP-176/177) и Jetton v2
Mintless Jetton — расширение TEP-74, позволяющее делать огромные меркл-аирдропы без «персональных минтов». Идея:
- В Jetton Master хранится меркл-корень распределения.
- Пользовательский кошелёк подтверждает доказательство при первой исходящей операции с токеном → фактический *mint по требованию* (нет отдельного шага «claim»).
- Это резко снижает нагрузку и стоимость распределений на миллионы адресов.
Где тут v2. Библиотечный кошелёк Jetton v2 органично сочетается с mintless-подходом: меньше веса сообщений/переинициализаций → дешевле и надёжнее массовые первичные движения. Для интеграции:
- Протокол/бот раздачи должен отдавать правильный Merkle-proof;
- Кошелёк поддерживает добавление доказательства в тело transfer (или спец-операцию расширения);
- Индексаторы учитывают «виртуальные балансы» до первого движения.
Миграция и апгрейды
Можно ли «перевести» существующий джеттон на v2? Да, если в вашем минтере предусмотрен апгрейд (часто есть админ-операция upgrade/смена кода), вы можете:
- обновить минтер до версии, где wallet-code — library;
- убедиться, что адреса кошельков не меняются (детерминизм адреса сохраняется);
- откатить/перевыпустить метаданные (если меняли формат хранения);
- пройти тестнет: проверка checkWalletLib, нагрузка ботов, сценарии on_bounce.
Операционная гигиена
- Для админ-ключей используйте мультисиг (гардианы/аппаратные) — компрометация = риск «окирпичивания» минтера.
- Любой upgrade сначала — в тестнете: неверный код/слепки данных могут сломать контракт.
- Документируйте внешние зависимости (адрес librarian, срок хранения, хэш библиотеки) и публикуйте для сообществ/бирж.
Лучшие практики для dApp, бирж и кошельков
Выплаты/аирдропы
- Для массовых раздач используйте Mintless (TEP-176/177) или «бандлы» с минимальным forward_ton_amount.
- Симулируйте on_bounce и сценарии «частичного исполнения»: при неуспехе средства должны вернуться отправителю.
UX и Decimal-гигиена
- Не «хардкодьте» 9 знаков — читайте decimals из метаданных: популярные стейблы (jUSDT/jUSDC) — 6.
- Показывайте пользователю разложение комиссий: базовая + forwarding + storage (и экономию от v2).
Индексаторы/бэкенды
- Проверяйте привязку wallet → minter и валидность библиотеки (сверка по get_lib).
- Для mintless поддерживайте виртуальные балансы до первого движения и «одиночное» доказательство per адрес.
- Не ждите «лишних подтверждений» — в TON финализация быстрая; лишний wait ухудшает UX.
Безопасность
- on_bounce должно корректно откатывать списание отправителя при неуспешном internal_transfer.
- Ограничивайте forward_ton_amount и фильтруйте forward_payload у получателя.
- Держите allow-list библиотек и минтеров (по хешам/адресам) — снижает фишинг в интерфейсе.
Сообщения и полезные детали Jetton v2
Transfer → Internal transfer → Notification
- Инициатор отправляет transfer из своего Jetton Wallet.
- Кошелёк отправителя инициирует internal_transfer на кошелёк получателя.
- Получатель (если задан forward_ton_amount) шлёт уведомление в конечный адрес/контракт (dApp), передавая forward_payload (например, ID ордера).
- При ошибке доставка «отскакивает» bounce в кошелёк отправителя, который через on_bounce возвращает списанную сумму.
Library-кошелёк и экономия
- Для многих сценариев с init_code forwarding fee падает с ~0.011 TON до ~0.003 TON (оценка из доков по library-cells), что критично для мелких платежей/микротраснзакций.
- В массовых use-case (игры, аирдропы) это десятки процентов экономии.
Смена кода/данных минтера
- В v2 предусмотрены административные операции: смена кода/данных минтера, задокументирован «риск окерпичивания» при неверных слепках — обязательно тестируйте.
Частые ошибки разработчиков (и как их избежать)
- Неучтённый decimals. У jUSDT — 6, у TON и большинства джеттонов — 9. Всегда умножайте amount на 10^decimals.
- Игнорирование on_bounce. Неполное зачисление без возврата отправителю — распространённый баг; в референсе показан корректный паттерн.
- Непроверенная библиотека. Развёрнули кошелёк без library-ссылки → потеряли выигрыш v2 и рискуете нестабильностью.
- Хардкод адресов/хэшей. Используйте методы чтения из минтера/кошелька, а не «магические строки».
- Ожидание «ещё N блоков». В TON финализация после 1 блока; «дополнительные ожидания» ухудшают UX и усложняют ретраи.
Инструменты и SDK
- Blueprint / Sandbox — шаблоны сборки, тесты и скрипты деплоя референс-джеттона.
- Tact Cookbook — примеры Jetton Master/Wallet, приёмы Tact-разработки.
- TON Connect — готовые UI-компоненты и SDK для отправки transfer/работы с джеттонами из фронтенда (React/UI).
- tonlib/ton4j/tonutils — бэкенд-SDK (Rust/Java/Python) с поддержкой чтения джеттонов и их кошельков.
Вопросы и ответы (FAQ)
Нужно ли «перевыпускать» токен под v2? Нет. Jetton v2 — это обновление реализации, совместимое с TEP-74. Вы переводите минтер/кошельки на библиотечную схему и получаете экономию газа и стабильность. Адреса держателей/балансы сохраняются.
Становится ли v2 «обязательным» стандартом? Формальный стандарт (TEP-74) остаётся прежним. V2 — референс-реализация и набор практик (library-cell и др.), которые экосистема рекомендует для производительности.
Что если библиотека «протухнет»? Если не продлите хранение library-cell, кошельки потеряют доступ к коду и перестанут принимать сообщения. Держите депозит/мониторинг и процедуру продления.
Совместим ли v2 с Mintless Jetton? Да. Mintless — это расширение TEP-74 (TEP-176/177). V2 снижает издержки и делает такие аирдропы более предсказуемыми.
Правда ли, что v2 «в 3 раза быстрее»? В публичных анонсах фигурирует «до ×3 быстрее при перегрузке». В конкретном dApp профит зависит от нагрузки и паттернов сообщений; стабильный выигрыш даёт именно library-wallet.
Чек-лист внедрения Jetton v2
* Перейдите на library-cell для кода Jetton Wallet (деплой через librarian), сохраните хэш/адрес в реестрах. * Прогоните тестнет и скрипт
checkWalletLib
, нагрузочные сценарии transfer/internal_transfer/on_bounce. * Обновите индексаторы: верификация связки wallet→minter, валидность библиотеки (get_lib). * Для массовых рассылок — рассмотрите Mintless (TEP-176/177). * Обновите фронтенд: корректный учёт decimals, подсказки по комиссиям (база/forward/storage), «экономия v2». * Оформите операционный регламент: мультисиг-админ, периодическое продление library, процедуру отката.
Связанные материалы
- MEV на Solana и локальные рынки комиссий ; для сравнения моделей комиссий
- EIP-7702 — «умные» EOA ; для аналогий с улучшенными аккаунт-моделями в EVM-мире
