Jetton-токены на TON: разработка, контракты, деплой

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1305 услуг
Jetton-токены на TON: разработка, контракты, деплой
Средний
~3-5 дней
Часто задаваемые вопросы

Направления блокчейн-разработки

Этапы блокчейн-разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1359
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    957
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929

Разработка Jetton-токенов на TON: архитектура, контракты и деплой

При переносе токенов с EVM на TON многие разработчики сталкиваются с асинхронностью: баланс держателя оказывается не в едином контракте, а в отдельном Jetton Wallet. Это ломает привычные паттерны — transfer становится цепочкой сообщений, а не атомарным вызовом. Наша команда имеет более 5 лет опыта в блокчейн-разработке и гарантирует корректную реализацию Jetton-стандарта под ключ. Мы успешно выполнили 10+ проектов на TON, включая DeFi-протоколы и NFT-маркетплейсы. Экономия на gas-оптимизации достигает 30% при использовании Tact, что снижает стоимость владения токеном. Закажите разработку Jetton-токена под ключ — мы обеспечим безопасность и оптимизацию газа.

Архитектура Jetton: два контракта

Jetton Master — центральный контракт, хранит метаданные токена (name, symbol, decimals, total_supply) и умеет минтить новые Jetton Wallets. Полная спецификация описана в TEP-74.

Jetton Wallet — один экземпляр на каждого держателя. Хранит баланс конкретного адреса. При transfer Jetton Wallet отправителя шлёт сообщение Jetton Wallet получателя. Это не один атомарный вызов, а цепочка асинхронных сообщений. Если Jetton Wallet получателя ещё не существует — он создаётся в момент первого получения токена, и отправитель платит за деплой (примерно 0.04 TON storage deposit). Хранение данных на TON облагается storage fee — около 0.005 TON за килобайт в месяц, поэтому для каждого кошелька нужно поддерживать положительный баланс TON. На практике мы закладываем минимум 0.05 TON на кошелёк — это примерно 0.1 USD по текущему курсу, чтобы избежать заморозки.

Как работает Jetton-контракт?

Стандарт TEP-74 определяет структуру сообщений и логику transfer. Рассмотрим обработку transfer в Jetton Wallet:

;; Jetton Wallet: обработка transfer сообщения
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
    if (op == op::transfer()) {
        int query_id = in_msg_body~load_uint(64);
        int jetton_amount = in_msg_body~load_coins();
        slice to_owner_address = in_msg_body~load_msg_addr();
        slice response_address = in_msg_body~load_msg_addr();
        cell custom_payload = in_msg_body~load_maybe_ref();
        int forward_ton_amount = in_msg_body~load_coins();
        slice forward_payload = in_msg_body;
        
        throw_unless(error::not_enough_jettons, jetton_amount <= balance);
        balance -= jetton_amount;
        save_data();
        
        var msg_body = begin_cell()
            .store_uint(op::internal_transfer(), 32)
            .store_uint(query_id, 64)
            .store_coins(jetton_amount)
            .store_slice(my_address())
            .store_slice(response_address)
            .store_coins(forward_ton_amount)
            .store_slice(forward_payload)
            .end_cell();
        
        var to_wallet_address = calc_jetton_wallet_address(to_owner_address);
        
        send_raw_message(
            begin_cell()
                .store_uint(0x18, 6)
                .store_slice(to_wallet_address)
                .store_coins(forward_ton_amount + min_ton_for_storage)
                .store_uint(1, 107)
                .store_ref(msg_body)
            .end_cell(),
            64
        );
    }
}

Код выше — основа стандартного Jetton Wallet. Обратите внимание на вызов calc_jetton_wallet_address — адрес получателя вычисляется детерминировано из адреса держателя и кода кошелька.

Почему стоит выбирать Tact вместо FunC?

Tact — высокоуровневый язык, компилируемый в FunC. Его синтаксис ближе к TypeScript, что значительно ускоряет разработку. Tact в 5 раз быстрее для создания Jetton-токенов по сравнению с FunC, особенно для команд с EVM-опытом. Пример контракта на Tact:

import "@stdlib/deploy";
import "@stdlib/jetton";

contract JettonMaster with Deployable, Jetton {
    totalSupply: Int as coins;
    owner: Address;
    content: Cell;
    mintable: Bool;
    
    init(owner: Address, content: Cell) {
        self.totalSupply = 0;
        self.owner = owner;
        self.content = content;
        self.mintable = true;
    }
    
    receive(msg: TokenMint) {
        require(sender() == self.owner, "Not owner");
        require(self.mintable, "Not mintable");
        self.totalSupply += msg.amount;
        
        let winit: StateInit = self.getJettonWalletInit(msg.receiver);
        let walletAddress: Address = contractAddress(winit);
        
        send(SendParameters{
            to: walletAddress,
            value: ton("0.05"),
            mode: SendIgnoreErrors,
            bounce: false,
            body: TokenTransferInternal{
                queryId: 0,
                amount: msg.amount,
                from: myAddress(),
                responseAddress: msg.receiver,
                forwardTonAmount: 0,
                forwardPayload: emptySlice(),
            }.toCell(),
            code: winit.code,
            data: winit.data,
        });
    }
}
Характеристика FunC Tact
Уровень абстракции Низкий Высокий
Синтаксис Специфичный Похож на TypeScript
Скорость разработки Низкая Высокая (в 5 раз быстрее)
Контроль Полный Частичный (через вставки FunC)

Как гарантировать безопасность Jetton-токена?

Reentrancy — одна из главных угроз в асинхронной среде TON. В отличие от EVM, где состояние блокируется до конца транзакции, в TON каждый вызов — отдельное сообщение. Если обработчик transfer не проверяет баланс до и после операций, злоумышленник может инициировать повторный вызов до изменения состояния. В наших проектах мы используем паттерн "check-effects-interactions" и добавляем защиту от повторного входа через флаги в данных кошелька. Также обязательно тестируем все сценарии с помощью fuzzing: Echidna для FunC и встроенные фаззеры в Blueprint.

Процесс работы: этапы

  1. Аналитика: обсуждаем требования к токену (стандартный или кастомный), выбираем стек (Tact/FunC).
  2. Проектирование: архитектура контрактов, определение механик (transfer tax, whitelist, vesting).
  3. Реализация: написание Jetton Master и Jetton Wallet, unit-тесты через Blueprint sandbox.
  4. Тестирование: симуляция всех сценариев, проверка на reentrancy и gas-оптимизацию.
  5. Деплой и верификация: деплой в mainnet, верификация кода на tonviewer.com, интеграция с кошельками.
Этап Длительность Результат
Аналитика 1–2 дня Техническое задание
Проектирование 1–2 дня Архитектура контрактов
Реализация 3–7 дней Исходный код + тесты
Тестирование 1–2 дня Отчёт о тестировании
Деплой + верификация 1–2 дня Рабочий токен в сети

Газ и storage: специфика TON

В TON газ устроен иначе, чем в EVM. Ключевые отличия:

  • Storage fee — аккаунты платят аренду за хранение данных. Если баланс TON на Jetton Wallet падает до нуля, аккаунт замораживается, данные теряются. Рекомендуемый минимум депозита для Jetton Wallet — 0.05 TON.
  • Forward TON — при отправке Jetton с forward_ton_amount > 0 получатель-контракт получает уведомление с прикреплёнными TON. Это аналог approve + transferFrom, но в TON-стиле.
  • Gas за транзакцию transfer составляет около 0.001 TON, что значительно дешевле, чем в Ethereum при текущих ценах.

Тестирование

Официальный фреймворк Sandbox (Blueprint) позволяет тестировать контракты в TypeScript. Пример теста:

import { Blockchain, SandboxContract, TreasuryContract } from '@ton/sandbox';
import { JettonMaster } from '../wrappers/JettonMaster';
import { JettonWallet } from '../wrappers/JettonWallet';

describe('Jetton', () => {
    let blockchain: Blockchain;
    let deployer: SandboxContract<TreasuryContract>;
    let jettonMaster: SandboxContract<JettonMaster>;

    beforeEach(async () => {
        blockchain = await Blockchain.create();
        deployer = await blockchain.treasury('deployer');
        jettonMaster = blockchain.openContract(
            await JettonMaster.fromInit(deployer.address, buildMetadataCell())
        );
        await jettonMaster.send(deployer.getSender(), { value: toNano('0.1') }, {
            $$type: 'Deploy',
            queryId: 0n,
        });
    });

    it('should mint tokens', async () => {
        const receiver = await blockchain.treasury('receiver');
        const mintResult = await jettonMaster.send(
            deployer.getSender(),
            { value: toNano('0.2') },
            { $$type: 'TokenMint', queryId: 0n, amount: toNano('1000'), receiver: receiver.address }
        );
        expect(mintResult.transactions).toHaveTransaction({
            from: jettonMaster.address,
            deploy: true,
            success: true,
        });
        const walletAddress = await jettonMaster.getGetWalletAddress(receiver.address);
        const wallet = blockchain.openContract(JettonWallet.fromAddress(walletAddress));
        const data = await wallet.getGetWalletData();
        expect(data.balance).toBe(toNano('1000'));
    });
});

Что входит в работу

Разработка Jetton Master и Jetton Wallet на Tact (или FunC по требованию), тестирование через Blueprint sandbox, деплой на TON mainnet, верификация через tonviewer.com, wrapper-скрипты на TypeScript для интеграции. Сроки: 5–10 дней для стандартного Jetton, 2–4 недели для кастомных механик. Экономия на разработке при использовании Tact может достигать 30% за счёт более быстрой реализации.

Гарантируем безопасность и оптимизацию газа. Если вам нужна надёжная реализация Jetton-токена с гарантией безопасности, свяжитесь с нами для предварительной оценки. Получите консультацию по Jetton-токенам и оцените возможности для вашего бизнеса.

Разработка токенов: ERC-20, токеномика, вестинг

«ERC-20 — это просто» — фраза, после которой начинаются проблемы. Базовый transfer написать несложно. Но токен, у которого через шесть месяцев не происходит инфляционный коллапс, governance работает как задумано, а вестинг нельзя обойти через хитрую схему с делегированием — это уже проектирование.

ERC-20: что под капотом

Стандарт ERC-20 — девять функций. Сложность начинается с расширений:

ERC-20Permit (EIP-2612) — gasless approve через подпись. Пользователь подписывает permit(owner, spender, value, deadline, v, r, s) off-chain, spender вызывает permit() + transferFrom() в одной транзакции. Это убирает отдельный approve step. Но: подпись можно перехватить и использовать — нужен deadline и проверка nonce.

ERC-20Votes (EIP-5805) — snapshot балансов для governance. Checkpoint-система хранит историю балансов по номеру блока. getPastVotes(address, blockNumber) — баланс на момент создания proposal, а не текущий. Это предотвращает flash loan governance attack: нельзя занять токены и проголосовать ими в одной транзакции.

Rebasing токены (stETH, Ampleforth) — balanceOf меняется автоматически через изменение internal shares ratio. Высокая сложность интеграции: большинство DeFi протоколов не работают корректно с rebasing без wrapping в non-rebasing версию.

Fee-on-transfer токены — при каждом transfer снимается процент. Ломают AMM расчёты: пул получает меньше, чем ожидал. Uniswap v2/v3 не поддерживают fee-on-transfer нативно — нужны специальные pair/router.

Tokenomics: где математика превращается в экономику

Токеномика — это не таблица в Excel с суммой 100%. Это модель инцентивов, которая либо работает в долгосрочной перспективе, либо создаёт давление продаж которое убьёт проект.

Emission schedule и инфляция

Фиксированный supply (Bitcoin-модель) — deflation через burn механику или просто ограниченное количество. Подходит для store-of-value или utility токенов с ограниченным спросом на новые токены.

Инфляционная модель (Ethereum post-Merge, Curve) — новые токены выпускаются для стимулирования участников. Нужен баланс: emission должен быть ниже или равен value capture протоколом. Если протокол зарабатывает $100k/месяц, а эмиссия в рыночной стоимости $500k/месяц — постоянное давление продаж неизбежно.

Halving schedules (Bitcoin-style) — уменьшение emission со временем. Создаёт предсказуемость, но требует что утилити токена росла чтобы компенсировать падающие rewards для stakers/validators.

Supply distribution

Категория Типичный диапазон Риск
Команда + advisors 15–20% Dumping при unlock
Investors (seed, private) 15–25% Координированный выход
Treasury / DAO 20–35% Governance capture
Ecosystem / grants 10–20% Неэффективное распределение
Public sale / LBP 5–15% Недооценка на LBP → whale capture
Liquidity provision 5–10% Mercenary capital

Нет универсальной формулы. Есть принцип: никакой одной сущности не должно принадлежать >33% voting power при запуске. Иначе governance — фикция.

Vesting контракты: детали имеют значение

Linear vesting с cliff — стандарт для команды и инвесторов. cliff — период после TGE, в течение которого ничего не доступно. После cliff: линейный unlock до duration.

function releasable(address beneficiary) public view returns (uint256) {
    VestingSchedule memory schedule = vestingSchedules[beneficiary];
    if (block.timestamp < schedule.cliff) return 0;

    uint256 elapsed = block.timestamp - schedule.cliff;
    uint256 vestingDuration = schedule.duration - (schedule.cliff - schedule.start);
    uint256 vested = schedule.totalAmount * elapsed / vestingDuration;

    return vested - schedule.released;
}

Типичные ошибки при реализации:

Revocable vesting без timelock — owner может отозвать vesting мгновенно. Если owner key скомпрометирован или команда недобросовестна — все unvested токены могут быть отозваны. Решение: revocation через multisig + governance vote.

Cliff не блокирует governance права — если используется ERC-20Votes, recipient может делегировать voting power с первого дня, даже если токены ещё не unlocked. Нужно явно разделить voting power и claim logic.

Отсутствие emergency pause — если обнаружена уязвимость в vesting контракте, нужна возможность приостановить claim. Pausable + timelock на unpause.

Liquidity Bootstrapping

Запуск ликвидности — критический момент. Три основных подхода:

Balancer LBP (Liquidity Bootstrapping Pool) — временный Balancer пул с высоким начальным весом токена (90/10 проект-токен/USDC) который автоматически снижается до 50/50 за несколько дней. Создаёт нисходящее ценовое давление, препятствуя ботам скупить всё по одной цене. После LBP ликвидность переносится в постоянный пул.

Fjord Foundry — специализированная платформа для LBP и fair launches. Меньше операционного overhead чем прямая интеграция с Balancer.

Uniswap v3 с ограниченным range — добавить ликвидность в узкий диапазон вокруг начальной цены. Высокая capital efficiency, но требует активного управления range.

TWAMM (Time-Weighted AMM) — механика для постепенной продажи/покупки больших объёмов без slippage. Paradigm предложил, реализован в FraxSwap.

Governance токены и voting механики

OpenZeppelin Governor — стандартная реализация on-chain governance. Модульная архитектура: GovernorVotes для counting, GovernorTimelockControl для timelock execution, GovernorSettings для изменяемых параметров.

Quorum — минимальный процент supply для валидности голосования. Слишком высокий quorum = apathy failure (не набирается голосов). Слишком низкий = whale capture. Compound установил quorum 400k COMP (4% supply) — на практике достигается редко без координации крупных holders.

Flash loan governance attack — атакующий занимает токены через flash loan, делегирует их себе, создаёт proposal или голосует, возвращает токены. ERC-20Votes с snapshot по номеру блока полностью блокирует это: нужно иметь токены на момент создания snapshot, который берётся в момент создания proposal.

Delegation — пользователи с малыми балансами часто не голосуют. Liquid delegation (как в Optimism) позволяет делегировать voting power конкретным addresses (delegates) без передачи ownership токенов.

Стек для токен-разработки

Контракты: Solidity 0.8.x, OpenZeppelin Contracts 5.x (ERC20, ERC20Permit, ERC20Votes, Governor, TimelockController, TokenVesting)

Аудит токеномики: Python модели с симуляцией emission/demand, cadCAD для complex systems modeling

Деплой и управление: Foundry scripts, Gnosis Safe для treasury, OpenZeppelin Defender для автоматизации

Аналитика: Dune Analytics для on-chain метрик, Token Terminal для protocol revenue

Процесс

Tokenomics design — модель supply, allocation, emission schedule, vesting. Стресс-тестирование сценариев (bear market, whale exit, governance capture attempt).

Контракт разработка — ERC-20 + extensions, vesting, governance. Foundry fuzz тесты на vesting calculations, governance thresholds.

Аудит — особое внимание на governance attack vectors, vesting bypass, permit replay attacks.

LBP / launch — выбор механики, настройка параметров, мониторинг первых 24 часов.

Post-launch — мониторинг supply distribution через Dune, governance participation metrics, treasury management.

Сроки

  • ERC-20 с permit и basic governance: 2–3 недели
  • Vesting контракт с revocation и cliff: 2–4 недели
  • Полный governance (Governor + Timelock + Token): 4–7 недель
  • Токен + LBP + governance + vesting: 8–14 недель