Почему разработка NFT на TON — это вызов для EVM-разработчиков?
TON — архитектурно другой блокчейн. Если вы привыкли работать с Solidity и EVM, где NFT — это запись в маппинге контракта, здесь каждый токен — самостоятельный смарт-контракт. Это меняет всё: деплой, mint, transfer и даже простые операции вроде листинга на маркетплейсе. Мы, наша команда, специализируемся на TON с самого запуска основной сети. За 7+ лет опыта в блокчейне и более 50 выпущенных NFT-коллекций на Ethereum и TON мы набили руку на таких проектах. Работаем под ключ: аналитика, разработка контрактов, mint-сайт, интеграция с маркетплейсами. Оценим ваш проект бесплатно — просто напишите.
Архитектура TEP-62
Collection и Item контракты
Коллекция на TON состоит из двух типов контрактов: NFT Collection contract и NFT Item contract. Collection хранит owner_address, next_item_index, content (metadata коллекции), nft_item_code (код для деплоя item контрактов). При минте деплоит новый NFT Item контракт через internal message.
Item контракт каждого токена хранит: index, collection_address, owner_address, individual_content. Адрес item-контракта вычисляется детерминированно из collection_address и index через stateInit:
cell calculate_nft_item_state_init(int item_index, cell nft_item_code) { cell data = begin_cell() .store_uint(item_index, 64) .store_slice(my_address()) .end_cell(); return begin_cell() .store_uint(0, 2) .store_dict(nft_item_code) .store_dict(data) .store_uint(0, 1) .end_cell(); } Это позволяет вычислять адрес любого NFT off-chain, что важно для индексаторов и маркетплейсов.
Процесс передачи NFT
Transfer NFT на TON — это отправка internal message от текущего владельца к NFT Item контракту с operation code transfer. Item контракт меняет owner_address и опционально отправляет ownership_assigned notification новому владельцу:
if (op == op::transfer()) { slice new_owner = in_msg_body~load_msg_addr(); slice response_destination = in_msg_body~load_msg_addr(); throw_unless(401, equal_slices(sender_address, owner)); owner = new_owner; save_data(); send_msg(new_owner, 0, op::ownership_assigned(), ...); } В отличие от EVM, где transferFrom — синхронная операция, в TON transfer — это async message. Новый владелец получит уведомление через следующий блок. Это влияет на логику маркетплейсов: листинг и delisting требуют обработки async confirmation.
Хранение метаданных
TON NFT metadata хранится в двух форматах: on-chain (TL-B encoded прямо в контракте) и off-chain (URL на JSON файл). Для коллекций с generative metadata типичен snake encoding URL:
Cell content = begin_cell() .store_uint(0x01, 8) .store_slice("https://example.com/nft/") .end_cell() Individual content хранит суффикс (например, 123.json), коллекция хранит base URL. get_nft_data() getter объединяет их для полного URI. Формат JSON идентичен EVM: name, description, image, attributes. Хранение на IPFS работает так же — разница только в способе передачи URI.
Сколько стоит mint на TON и как сэкономить?
Каждый mint — это деплой нового контракта, что стоит дороже чем EVM SLOAD. На TON деплой одного NFT Item стоит около 0.05 TON. При batch mint 10 000 токенов сразу — это 500 TON только на storage fees.
Оптимизация: lazy mint — NFT Item деплоится при первом transfer или явном claim, что экономит до 50% затрат. Альтернатива — предварительный деплой с распределением по батчам с задержкой между блоками. Благодаря шардинговой архитектуре TON позволяет mint-ить 10 000 NFT за один блок, что в 20 раз быстрее, чем на Ethereum.
Как задеплоить NFT-коллекцию за 4 шага
- Подготовка метаданных: сгенерируйте JSON файлы для каждого токена (name, description, image, attributes) и загрузите на IPFS.
- Разработка контрактов Collection и Item на FunC с поддержкой TEP-62 и TEP-64. Используйте проверенные шаблоны из ton-blockchain/token-contract.
- Деплой Collection контракта на testnet через TEP-62. Укажите owner_address, nft_item_code, content metadata.
- Mint токенов: отправьте internal message с operation code deploy_nft_item для каждого индекса. Используйте batch mint для группы токенов, чтобы снизить нагрузку.
Выбор языка для продакшна
| Критерий | FunC | Tact |
|---|---|---|
| Уровень | Низкий, явное управление памятью | Высокий, ближе к TypeScript |
| Зрелость | Продакшн-контракты, много аудитов | Экосистема молодая |
| Производительность | Максимум | Незначительно ниже |
| Рекомендуем для продакшна | Да | Только для малых проектов |
Для продакшн-коллекций мы используем FunC с проверенными шаблонами. Tact упрощает прототипирование, но требует дополнительного аудита.
Что входит в результат
- Смарт-контракты Collection и Item на FunC (TEP-62, TEP-64, TEP-66)
- Скрипты деплоя через ton/core и @ton/ton
- Метаданные в формате TEP-64 (on-chain или off-chain с IPFS)
- Mint dApp с TonConnect (опционально)
- Полная документация по интеграции и управлению
- Поддержка в течение 30 дней после запуска
Процесс работы и сроки
| Этап | Длительность |
|---|---|
| Аналитика | 0.5-1 день |
| Разработка контрактов (FunC) | 3-4 дня |
| Mint-сайт (опционально) | 1-2 дня |
| Деплой на testnet/mainnet и интеграция с маркетплейсами | 1-2 дня |
| Итого | 5-7 дней |
Наши инженеры проводят аудит смарт-контрактов TON с использованием формальной верификации и статического анализа. Свяжитесь с нами, чтобы обсудить вашу коллекцию: Telegram или почта.







