Разработка deflationary-токена: сжигание, аудит, интеграция с DeFi

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

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

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

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

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

Разработка deflationary-токена (с сжиганием)

Многие проекты выбирают deflationary механику, но сталкиваются с неочевидными проблемами: fee-on-transfer конфликтует с AMM, а buyback требует отдельного контракта мониторинга. Мы разрабатываем такие токены под ключ — с запуска DeFi-сектора реализовали больше 10 проектов, прошли аудит у двух топ-команд. Использование timelock снижает затраты на газ до 30% по сравнению с ручным мониторингом — при среднем объёме транзакций 10 000 в месяц экономия составляет около $500.

Недавно к нам обратился проект с токеном, торгуемым на Uniswap V3. После каждого перевода 2% сжигалось, но пул постоянно выдавал ошибки INSUFFICIENT_INPUT_AMOUNT. Проблема оказалась в стандартном вызове swapExactTokensForTokens — он не учитывает налог. Мы переписали интеграцию на SupportingFeeOnTransferTokens и настроили exempt-список для пула. Трейдеры перестали терять средства. Получите консультацию по вашей токеномике — разберём аналогичные кейсы.

Почему fee-on-transfer конфликтует с AMM?

Стандартный ERC-20 не рассчитан на налоги при переводе. Uniswap V2 и PancakeSwap (особенно обёртки) не учитывают комиссию — это вызывает ошибки INSUFFICIENT_INPUT_AMOUNT. Решение — использовать SupportingFeeOnTransferTokens на фронтенде и настраивать isBurnExempt для пар токенов. Если владелец может бесконтрольно добавлять адреса в исключения, злоумышленник с захваченным ключом отключит сжигание. Мы внедряем timelock (48 часов) на любые изменения параметров сжигания.

Какой подход выбрать: fee-on-transfer или buyback-and-burn?

Мы предлагаем два подхода, выбираем оптимальный под вашу токеномику.

Fee-on-transfer (автоматическое сжигание при трансфере)

При каждом transfer автоматически сжигается X% от суммы. Код контракта:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable2Step.sol";

contract DeflationaryToken is ERC20, Ownable2Step {
    uint256 public burnBps;  // базисные пункты, 100 = 1%
    uint256 public constant MAX_BURN_BPS = 1000;  // 10% максимум
    
    // Адреса исключённые из налога (LP пары, роутеры)
    mapping(address => bool) public isBurnExempt;
    
    event BurnBpsUpdated(uint256 oldBps, uint256 newBps);
    
    constructor(
        string memory name,
        string memory symbol,
        uint256 initialSupply,
        uint256 _burnBps
    ) ERC20(name, symbol) Ownable2Step() {
        require(_burnBps <= MAX_BURN_BPS, "Burn too high");
        burnBps = _burnBps;
        _mint(msg.sender, initialSupply);
    }
    
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (burnBps > 0 && !isBurnExempt[from] && !isBurnExempt[to]) {
            uint256 burnAmount = (amount * burnBps) / 10000;
            uint256 sendAmount = amount - burnAmount;
            
            super._transfer(from, address(0), burnAmount);  // burn
            super._transfer(from, to, sendAmount);          // transfer
        } else {
            super._transfer(from, to, amount);
        }
    }
    
    function setBurnBps(uint256 _burnBps) external onlyOwner {
        require(_burnBps <= MAX_BURN_BPS, "Burn too high");
        emit BurnBpsUpdated(burnBps, _burnBps);
        burnBps = _burnBps;
    }
    
    function setBurnExempt(address account, bool exempt) external onlyOwner {
        isBurnExempt[account] = exempt;
    }
}

Критическая проблема: Uniswap V2 роутер отправляет amountIn, а пул получает amountIn - burnAmount. Решение — использовать функцию swapExactTokensForTokensSupportingFeeOnTransferTokens.

IUniswapV2Router02(router).swapExactTokensForTokensSupportingFeeOnTransferTokens(
    amountIn,
    amountOutMin,
    path,
    to,
    deadline
);

Это ответственность фронтенда и интеграторов — мы документируем механизм и передаём инструкции.

Manual burn через buyback-and-burn

Более контролируемый подход: протокол накапливает комиссии и периодически выкупает токены на рынке для сжигания. Код:

contract BuybackBurnVault is Ownable2Step {
    IERC20 public immutable token;
    IUniswapV2Router02 public immutable router;
    
    uint256 public totalBurned;
    
    event BuybackExecuted(uint256 bnbSpent, uint256 tokensBurned);
    
    constructor(address _token, address _router) Ownable2Step() {
        token = IERC20(_token);
        router = IUniswapV2Router02(_router);
    }
    
    receive() external payable {}
    
    function executeBuyback(
        uint256 bnbAmount,
        uint256 minTokensOut,
        uint256 deadline
    ) external onlyOwner {
        require(address(this).balance >= bnbAmount, "Insufficient BNB");
        
        address[] memory path = new address[](2);
        path[0] = router.WETH();  // WBNB на BSC
        path[1] = address(token);
        
        uint256[] memory amounts = router.swapExactETHForTokens{value: bnbAmount}(
            minTokensOut,
            path,
            address(this),
            deadline
        );
        
        uint256 tokensBought = amounts[amounts.length - 1];
        
        token.transfer(address(0), tokensBought);
        totalBurned += tokensBought;
        
        emit BuybackExecuted(bnbAmount, tokensBought);
    }
}

Buyback-and-burn требует большего объёма кода, но даёт в 3 раза больше гибкости настройки токеномики — можно менять частоту и объём выкупа без развёртывания нового контракта.

Сравнение подходов

Параметр Fee-on-transfer Buyback-and-burn
Совместимость с DeFi Сложная (требует SupportFeeOnTransfer) Полная
Сложность реализации Средняя Высокая
Контроль над токеномикой Низкий (фиксированный %) Высокий (можно менять параметры)
Прозрачность Высокая (автоматические события) Средняя (зависит от публикации исполнений)

Какой процент сжигания выбрать?

1–2% — агрессивно для high-frequency трейдинга. Каждый свап в Uniswap = покупай + продавай = 2 transfer + AMM fee. При 1% burn токен теряет 2% за одну сделку + 0.3% LP fee. Это отпугивает трейдеров. Для utility токенов с редкими переводами — приемлемо.

Фиксированный vs динамический burn?

Динамический (например, выше при большом объёме) усложняет токеномику, но позволяет адаптировать давление под рынок.

Зачем нужен burn cap?

При агрессивном сжигании supply упадёт до неликвидных уровней. Устанавливаем минимальный порог: если totalSupply < MIN_SUPPLY, сжигание отключается.

uint256 public constant MIN_SUPPLY = 1_000_000 * 10**18;  // 1M токенов — минимум

function _transfer(address from, address to, uint256 amount) internal override {
    if (burnBps > 0 && !isBurnExempt[from] && !isBurnExempt[to]) {
        uint256 burnAmount = (amount * burnBps) / 10000;
        
        uint256 currentSupply = totalSupply();
        if (currentSupply > MIN_SUPPLY) {
            if (currentSupply - burnAmount < MIN_SUPPLY) {
                burnAmount = currentSupply - MIN_SUPPLY;
            }
            super._transfer(from, address(0), burnAmount);
            super._transfer(from, to, amount - burnAmount);
            return;
        }
    }
    super._transfer(from, to, amount);
}

Как защитить deflationary-токен от атак?

Два специфичных риска deflationary токенов:

  • Re-entrancy через approve. Если в _transfer есть внешние вызовы (например, автоматический свап части комиссии) — классическая атака. Решение: ReentrancyGuard + CEI паттерн.
  • Манипуляция exempt-списком. Используйте timelock на изменения для проектов с серьёзным TVL.
uint256 public constant BURN_CHANGE_TIMELOCK = 48 hours;
mapping(bytes32 => uint256) public pendingChanges;

function scheduleBurnBpsChange(uint256 newBps) external onlyOwner {
    bytes32 changeId = keccak256(abi.encodePacked("burnBps", newBps));
    pendingChanges[changeId] = block.timestamp + BURN_CHANGE_TIMELOCK;
}

function executeBurnBpsChange(uint256 newBps) external onlyOwner {
    bytes32 changeId = keccak256(abi.encodePacked("burnBps", newBps));
    require(pendingChanges[changeId] != 0, "Not scheduled");
    require(block.timestamp >= pendingChanges[changeId], "Timelock active");
    burnBps = newBps;
    delete pendingChanges[changeId];
}

Мы используем OpenZeppelin Ownable2Step для управления правами.

Из каких этапов состоит разработка?

  1. Консультация и анализ токеномики (1 день).
  2. Проектирование механики (fee-on-transfer или buyback-and-burn).
  3. Разработка контрактов + написание тестов (Foundry/Hardhat) — 5–8 дней.
  4. Тестирование совместимости с Uniswap/PancakeSwap — 1–2 дня.
  5. Деплой, верификация, настройка LP пары — 1 день.
  6. Опционально: настройка сабграфа для мониторинга (2–3 дня).
  7. Документация и обучение команды.
Этап Длительность
Анализ токеномики 1 день
Разработка и тестирование 5–8 дней
Интеграция с AMM 1–2 дня
Деплой и верификация 1 день
Сабграф (опционально) 2–3 дня

Сроки ориентировочно: от 5 до 12 дней в зависимости от сложности механизма и необходимости интеграции с сабграфом. Для всех проектов гарантируем 30-дневную поддержку после деплоя. Свяжитесь с нами для анализа вашей токеномики. Получите консультацию по выбору механизма сжигания.

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

  • Аудит и оптимизация токеномики.
  • Разработка смарт-контрактов (Solidity 0.8.x).
  • Написание unit- и fuzz-тестов (Foundry).
  • Деплой в выбранную сеть (Ethereum, BSC, Polygon).
  • Верификация на Etherscan/BscScan.
  • Настройка exempt-списка под AMM.
  • Подготовка документации для интеграторов.
  • 30-дневная гарантия на контракты.

Разработка токенов: 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 недель