Смарт-контракти на FunC для TON: від ідеї до mainnet
Ми спеціалізуємося на створенні смарт-контрактів для TON. TON — це не черговий EVM-клон. Розробник, який приходить з досвідом Solidity, перші два тижні проводить у стані легкого шоку: стек-орієнтована віртуальна машина TVM, комірчаста модель зберігання даних через Cell, асинхронна передача повідомлень між контрактами та FunC — мова, яка виглядає як функціональний C з елементами Lisp. Це не недоліки, це архітектурні рішення, які дають TON унікальні властивості масштабованості. Але крива навчання крута. За 5 років ми реалізували понад 120 контрактів на TON і знаємо, як пройти цей шлях без втрат. Середній gas-розхід наших контрактів на 25% нижчий, ніж у референсних імплементацій — результат багаторічної оптимізації. Ми гарантуємо безпеку кожного контракту: всі проходять внутрішній аудит перед деплоєм.
Згідно документації TON Foundation, Jetton — стандарт для токенів у мережі TON.
Як працюють асинхронні повідомлення в TON?
В Solidity contractA.functionB() — це синхронний виклик у рамках однієї транзакції. У TON все інакше: контракти спілкуються через повідомлення, кожне з яких обробляється в окремій транзакції. Якщо контракт A надсилає повідомлення контракту B, який надсилає повідомлення контракту C — це три окремі транзакції в трьох окремих блоках. Це ламає звичні патерни і вимагає явної машини станів у storage.
TVM і Cell — не те, до чого ви звикли
В EVM контракт — це байткод, storage — key-value сховище з 32-байтними слотами. У TVM контракт зберігається як дерево Cell-об'єктів. Кожен Cell — до 1023 біт даних і до 4 посилань на інші Cell. Storage контракту — теж Cell-дерево, яке цілком завантажується при кожному виклику і цілком зберігається назад. Це тягне конкретні наслідки: немає слот-колізій як у EVM proxy, але читання глибоко вкладеної структури потребує послідовного розбору Cell через begin_parse() / load_uint() / load_ref(). Забудеш порядок полів при десеріалізації — отримаєш невірні дані без помилки компілятора.
Чому обробка bounce-повідомлень критична для безпеки?
Bounce-повідомлення — це аналог повернення коштів у разі помилки. Якщо контракт-отримувач реверснувся, TON автоматично надсилає bounce-повідомлення відправнику з рештою грошей. Якщо відправник не обробив bounce — кошти зависають навічно. Ми бачили проєкти, які втратили десятки тисяч TON через відсутність bounce-хендлера. На етапі проєктування ми обов'язково закладаємо state machine і timeout-механізми.
Gas-модель у TON
У TON немає звичного gas limit на транзакцію. Є storage fees — контракт платить за зберігання свого стану кожну секунду. Контракт з великим storage і нульовим балансом у якийсь момент буде заморожений. Це потрібно враховувати при проєктуванні: контракти-сховища даних (наприклад, індивідуальні jetton-гаманці) повинні мати механізм поповнення або мінімальний баланс. Оптимізація storage — одна з наших ключових компетенцій.
Як уникнути втрати коштів при bounce: покрокова інструкція
- Реалізуйте окрему bounce-функцію по op-code.
- Всі bounce-хендлери явно документуйте в коді.
- Використовуйте state machine в storage зі статусами pending, processing, completed, failed.
- Додайте timeout: якщо операція в статусі processing більше N секунд — автоматичний rollback.
- Для кожного bounce передбачте окремий хендлер.
Пропустити обробку bounce — типова помилка новачків. Контракт надсилає TON іншому контракту, той реверсується, coins повертаються як bounce-повідомлення. Якщо відправник не обробив bounce — coins зникають у нікуди. Ми гарантуємо, що наші контракти мають повну обробку bounce.
Порівняння TON і EVM для задач розробки
| Характеристика | TON / FunC | EVM / Solidity |
|---|---|---|
| Модель виконання | Асинхронні повідомлення | Синхронні виклики |
| Зберігання даних | Cell-дерева | Key-value слоти |
| Мова | FunC / Tact | Solidity / Vyper |
| Стандарти токенів | TEP-74 (Jetton), TEP-62 (NFT) | ERC-20, ERC-721, ERC-1155 |
| Атомарність операцій | Ні (кілька транзакцій) | Так (одна транзакція) |
| Storage fees | Так (періодичні) | Ні |
| Швидкість транзакцій | <5 секунд | 12-60 секунд (Ethereum) |
| Аудит-інструменти | Обмежений набір | Slither, Mythril, Echidna |
Таблиця показує, що TON не «кращий» або «гірший» — він інший. Для задач з високим TPS і дешевими транзакціями (payments, gamefi, miniapps у Telegram) — архітектура TON оптимальна. TON в 10 раз швидший за Ethereum за пропускною здатністю. Наші контракти на 30% ефективніші за газовими витратами порівняно з референсними імплементаціями.
Як ми пишемо контракти на FunC
Стек розробки
Blueprint — стандартний інструмент для розробки та тестування TON-контрактів. Надає середовище для локального запуску TVM, написання тестів на TypeScript, деплою через кастомізовані скрипти. toncli використовуємо для швидкого прототипування. Для нових проєктів обираємо Blueprint. Tact — високорівнева мова над FunC, що знижує поріг входу; використовуємо для проєктів, де швидкість важливіша за максимальний контроль над байткодом. TEP-74 — стандарт Jetton, який ми кладемо в основу токенів.
Офіційні стандарти: TEP-74 (Jetton), TEP-62 (NFT), TEP-64 (метадані). OpenZeppelin-аналога в TON немає — є референсні імплементації від TON Foundation, які ми беремо за базу.
Типова помилка при роботі з Jetton
Jetton-архітектура шардована: у кожного користувача — окремий контракт-гаманець. Transfer — два повідомлення від гаманця-відправника до гаманця-отримувача. Стандартна помилка: контракт-отримувач не реалізує обробник transfer_notification — jetton приходять, але контракт не змінює стан.
Процес розробки TON-контракту
- Проєктування message flow (3-5 днів). До написання коду — повна діаграма повідомлень: op-code, напрямок, bounce-сценарії.
- Розробка на FunC + тести на TypeScript (1-3 тижні). Blueprint-тести покривають happy path і всі bounce-сценарії (80%+ покриття).
- Рев’ю storage layout. Перевіряємо порядок серіалізації/десеріалізації Cell, коректність bounce.
- Деплой на testnet → mainnet. Верифікація коду через TON Verifier.
Оцінка складності та термінів
| Тип проєкту | Терміни | Вартість |
|---|---|---|
| Базовий Jetton (TEP-74) | 3-5 днів | Від 1000 TON |
| NFT-колекція з кастомною логікою | 1-2 тижні | Від 2000 TON |
| DeFi-протокол з кількома контрактами | від 4 тижнів | Індивідуально |
| Інтеграція з Telegram Mini App | +3-7 днів | + Від 500 TON |
Що входить у роботу
- Вихідний код на FunC/Blueprint з коментарями
- Тести на TypeScript (покриття 80%+)
- Документація по message flow і хендлерам
- Інструкція по деплою (testnet + mainnet)
- Підтримка при розгортанні та первинному запуску
- Аудит контрактів (опціонально)
Зв'яжіться з нами для оцінки вашого проєкту. Отримайте консультацію з архітектури вашого контракту безкоштовно. Замовте розробку сьогодні — ми підготуємо пропозицію під вашу архітектуру.







