Автоматическая миграция токенов с дедлайном и сжиганием

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

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

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

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

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

Представьте: вы развернули новый ERC-20 токен с улучшенной токеномикой или исправили критическую уязвимость в старом контракте. Теперь нужно, чтобы все держатели перешли на новый токен. Если нет механизма дедлайна, часть пользователей никогда не мигрирует — старые токены остаются в обороте, протокол обязан держать ликвидность вечно, а рынок страдает от параллельного обращения двух активов. Мы разрабатываем системы миграции, решающие эту проблему полностью: автоматическая миграция с дедлайном и сжиганием. За 50+ проектов мы выработали стандартную архитектуру, которая покрывает 90% сценариев. Оптимизация газовых расходов может сэкономить держателям до $0.50 за транзакцию, а проекту — до $2000 на контрактной архитектуре. Оцените ваш проект за один день — просто свяжитесь с нами.

Как работает система миграции: архитектура контракта

Система состоит из трёх участников: OldToken — существующий ERC-20, NewToken — новый токен с функцией mint или достаточным запасом, и MigrationContract — контракт-посредник, управляющий обменом, дедлайном и сжиганием.

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

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

contract TokenMigration is Ownable2Step, ReentrancyGuard {
    IERC20 public immutable oldToken;
    IERC20 public immutable newToken;
    
    uint256 public immutable migrationDeadline;
    uint256 public immutable migrationRatio; // новых токенов за 1 старый (18 decimals)
    
    uint256 public totalMigrated;
    bool public unmigatedBurned;
    
    event Migrated(address indexed user, uint256 oldAmount, uint256 newAmount);
    event UnmigratedBurned(uint256 amount);
    
    constructor(
        address _oldToken,
        address _newToken,
        uint256 _deadline,    // Unix timestamp
        uint256 _ratio        // 1e18 = 1:1, 2e18 = 2 новых за 1 старый
    ) Ownable2Step(msg.sender) {
        require(_deadline > block.timestamp + 30 days, "Deadline too soon");
        oldToken = IERC20(_oldToken);
        newToken = IERC20(_newToken);
        migrationDeadline = _deadline;
        migrationRatio = _ratio;
    }
    
    function migrate(uint256 amount) external nonReentrant {
        require(block.timestamp < migrationDeadline, "Migration closed");
        require(amount > 0, "Zero amount");
        
        uint256 newAmount = amount * migrationRatio / 1e18;
        require(newAmount > 0, "Below minimum");
        
        totalMigrated += amount;
        
        // Получаем старые токены от пользователя
        oldToken.transferFrom(msg.sender, address(this), amount);
        
        // Выдаём новые токены
        newToken.transfer(msg.sender, newAmount);
        
        emit Migrated(msg.sender, amount, newAmount);
    }
}

Почему Ownable2Step важен для контрактов миграции?

Обычный Ownable позволяет передать ownership в один шаг: transferOwnership(newOwner). Если вы ошиблись в адресе — контракт потерян навсегда. Ownable2Step (документация OpenZeppelin) требует, чтобы новый owner принял права отдельной транзакцией. По документации OpenZeppelin, двухшаговое владение предотвращает случайную потерю контроля. Для контракта, управляющего миграцией токенов с дедлайном, это критично — ошибка может стоить контроля над всей миграцией.

Механизм сжигания после дедлайна

После истечения дедлайна все немигрированные старые токены, которые накопились на контракте, должны быть сожжены. Также нужно вернуть или сжечь неиспользованные новые токены.

function burnUnmigrated() external onlyOwner {
    require(block.timestamp >= migrationDeadline, "Deadline not reached");
    require(!unmigatedBurned, "Already burned");
    
    unmigatedBurned = true;
    
    // Сжигаем старые токены, которые пришли через migrate()
    uint256 oldBalance = oldToken.balanceOf(address(this));
    if (oldBalance > 0) {
        IBurnable(address(oldToken)).burn(oldBalance);
        // Если старый токен не имеет burn() — отправляем на dead address
        // oldToken.transfer(address(0xdead), oldBalance);
    }
    
    // Возвращаем нераспределённые новые токены в treasury
    uint256 newBalance = newToken.balanceOf(address(this));
    if (newBalance > 0) {
        newToken.transfer(owner(), newBalance);
    }
    
    emit UnmigratedBurned(oldBalance);
}

Что делать, если старый токен не имеет функции burn()?

Большинство legacy токенов не имеют функции сжигания. Варианты:

  1. Отправить на 0x000...dEaD — неофициальный burn address, токены навсегда недоступны.
  2. Отправить на address(0) — только если токен позволяет transfer to zero address (многие проверяют to != address(0)).
  3. Собственная функция сжигания в MigrationContract через IUpgradeableToken(oldToken).burnFrom() — только если у контракта миграции есть BURNER_ROLE.

Сравнение вариантов сжигания для токенов без burn

Метод Обратимость Адрес Риски
Передача на dead address Нет 0x000...dEaD Неофициальный, может быть очищен
Передача на address(0) Нет 0x000...000 Многие контракты проверяют != 0
Вызов burnFrom с ролью Да, если отозвать роль Внутренний burn Требуется настройка ролей

Сравнение методов миграции

Метод Газ для пользователя Требуется approve Риск при дедлайне Подходит для
Прямая (transferFrom) Высокий (2 tx) Да Устаревшие токены остаются у пользователя Простые кейсы, ERC-20 с burn
Снапшот + Merkle Proof Низкий (1 tx) Нет Токены не изымаются, требуется доверие Пост-хаки, обновления без временного окна
Сжигание через dead address Средний (1 tx) Нет Обратимость невозможна Когда нет функции burn

Как работает снапшотная миграция? (Merkle Proof)

Если миграция основана на снапшоте (балансы на конкретный блок, до деплоя нового контракта), пользователи не отдают токены — они доказывают право на получение новых через Merkle Proof. Это снижает газовые затраты на 40-60% по сравнению с прямой миграцией. Прямая миграция с transferFrom требует двух транзакций — approve и migrate. Снапшотная миграция с Merkle Proof быстрее в 2 раза, так как нужна только одна транзакция claim, а газовые расходы снижаются в 2-3 раза. Мы используем библиотеку OpenZeppelin MerkleProof для верификации.

contract SnapshotMigration is Ownable2Step {
    bytes32 public immutable merkleRoot;
    mapping(address => bool) public claimed;
    
    constructor(bytes32 _merkleRoot, uint256 _deadline) {
        merkleRoot = _merkleRoot;
        migrationDeadline = _deadline;
    }
    
    function claim(uint256 amount, bytes32[] calldata proof) external {
        require(block.timestamp < migrationDeadline, "Expired");
        require(!claimed[msg.sender], "Already claimed");
        
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender, amount));
        require(MerkleProof.verify(proof, merkleRoot, leaf), "Invalid proof");
        
        claimed[msg.sender] = true;
        newToken.transfer(msg.sender, amount);
        
        emit Claimed(msg.sender, amount);
    }
}

Генерация Merkle Tree off-chain через @openzeppelin/merkle-tree или custom скрипт на основе снапшота баланса. Снапшот делается через The Graph subgraph или archival node query.

Как учитываются токены в вестинг-контрактах при миграции?

Если старые токены находятся в vesting контрактах — их нельзя напрямую мигрировать пользователем. Нужны либо:

  1. Специальная функция для admin, которая мигрирует токены прямо из vesting контракта (требует интеграции с конкретным vesting контрактом).
  2. Автоматическая миграция через Tenderly Web3 Actions или keeper после истечения вестинга.

Уведомление пользователей и мониторинг прогресса

Контракт должен выдавать события с достаточной информацией для построения дашборда:

event MigrationProgress(
    uint256 totalMigrated,
    uint256 totalOldSupply,
    uint256 deadline,
    uint256 timestamp
);

Subgraph на The Graph индексирует события и предоставляет GraphQL API для frontend: сколько процентов миграции завершено, сколько уникальных адресов мигрировало, кинетика по времени.

Важный практический момент: крупные держатели (>1% supply) нужно уведомить напрямую до запуска публичной миграции. Биржи, протоколы, фонды — у них могут быть внутренние процессы, которые требуют времени. Дедлайн должен давать минимум 90 дней даже для простых миграций.

Что мы поставляем: полный пакет

В состав работы входит:

  • Разработка смарт-контрактов миграции (Solidity 0.8.x, OpenZeppelin).
  • Интеграция с существующим токеном (OldToken) и деплой нового (NewToken).
  • Настройка механизма дедлайна и сжигания.
  • Разработка snapshot-based миграции (Merkle Proof) при необходимости.
  • Сабграф для мониторинга и фронтенд-дэшборд (React + The Graph).
  • Аудит контрактов с отчётом (в партнёрстве с сертифицированными аудиторами).
  • Пост-миграционная поддержка в течение 30 дней.
  • Документация для пользователей и инструкции по интеграции.

Сроки и стоимость

Сроки разработки: 3-5 рабочих дней для базовой системы миграции, 7-10 дней для snapshot-based с Merkle Proof и subgraph. Стоимость рассчитывается индивидуально — запросите коммерческое предложение. Оцените ваш проект бесплатно — наши инженеры с 10+ годами опыта в блокчейн-разработке проанализируют вашу архитектуру и предложат оптимальное решение. Запросите консультацию прямо сейчас.

Разработка смарт-контрактов

Мы столкнулись с ситуацией: контракт задеплоен, через две недели приходит сообщение — пул дренирован на $800k. Смотрим транзакцию в Tenderly: атакующий вызвал deposit(), внутри callback на ERC-777 повторно вызвал withdraw() — баланс обновился только после второго выхода. Классическая reentrancy, но не через ETH transfer, а через хук ERC-777. ReentrancyGuard стоял только на withdraw().

Такие случаи — не редкость. Смарт-контракт — это финансовая логика без возможности пропатчить её ночью. Наша команда разрабатывает контракты под ключ, встраивая защиту от reentrancy, MEV и gas-атак на ранних этапах.

Как мы разрабатываем смарт-контракты под ключ

Начинаем с аудита бизнес-логики и выбора стека. Solidity 0.8.x — стандарт для EVM-совместимых чейнов: Ethereum, Arbitrum, Optimism, Polygon, BSC, Avalanche C-Chain. Для Solana используем Rust и Anchor: модель аккаунтов и программ требует явного объявления всех ресурсов. Для проектов с формальной верификацией подходит Move (Aptos, Sui) — линейные типы языка исключают копирование ресурсов на уровне компилятора. Vyper выбираем для контрактов, где критична простота аудита (Curve Finance).

Язык Модель исполнения Типичная область Риски
Solidity 0.8.x EVM, последовательное исполнение DeFi, NFT, токены Reentrancy, переполнение (unchecked)
Rust (Anchor) Solana, параллельное Высоконагруженные DEX, игры Неправильное объявление аккаунтов
Move Aptos/Sui, ресурсная Крупные протоколы Сложность экосистемы
Vyper EVM, ограниченный синтаксис Критические контракты (Curve) Зависимость от стабильности компилятора

Gas optimization — не преждевременная оптимизация, а архитектурное решение. На Ethereum mainnet деплой плохо спроектированного контракта может стоить 2–5 ETH только из-за неоптимального storage layout. Переупаковка структуры Proposal с 7 слотов до 4 сэкономила 18k gas на каждом голосовании — около $1.5 при gas price 30 gwei. Экономия на масштабе протокола с тысячами голосований в день даёт ощутимую годовую выгоду.

Типичные ошибки в gas: передача массивов через memory вместо calldata в external функциях (дороже в 2–3 раза); использование require с длинными строками вместо custom error error InsufficientBalance(...). Кастомные ошибки дешевле на 50–200 gas на revert и передают структурированные данные фронтенду.

Почему аудит смарт-контрактов критичен для безопасности

Аудит — не разовая проверка, а встроенный этап разработки. Используем три уровня:

  1. Статический анализSlither (30 секунд в CI) выявляет reentrancy, неинициализированные переменные, опасный delegatecall.
  2. Фаззинг и invariant тестыFoundry с --fuzz-runs 50000 находит edge cases, которые пропускают сотни unit-тестов. Реальный кейс: AMM контракт с кастомной математикой после 150 тестов в Hardhat — Foundry нашёл integer division truncation, позволявший пылевой атаке копить dust на контракте. Echidna проверяет инварианты («сумма всех балансов ≤ totalSupply»).
  3. Ручной code review — наши инженеры с опытом 10+ лет в блокчейне выявляют логические ошибки, которые не ловят инструменты. Для протоколов с TVL > $1M обязателен внешний аудит со стороны Trail of Bits, Consensys Diligence или OpenZeppelin. Срок — 2–4 недели.

Любой апгрейдируемый протокол должен иметь timelock. TimelockController из OpenZeppelin: операция предлагается → ждёт минимальный delay (48–72 часа) → выполняется. Без timelock один скомпрометированный deployer wallet = потеря всего пула.

Какие паттерны апгрейда выбираем

Паттерн Механизм Риск Когда использовать Наш опыт
Transparent Proxy (OZ) admin vs user разделение Storage collision, centralization Стандартные проекты 15+ реализаций
UUPS Логика апгрейда в implementation Забыть _authorizeUpgrade → контракт навсегда сломан Газ-оптимизированные проекты 7 проектов
Diamond (EIP-2535) Множество facets Сложность аудита Крупные протоколы с 10+ контрактами 3 внедрения
Beacon Proxy Один beacon для множества proxies Beacon = single point of failure Фабрики однотипных контрактов 5 фабрик

Storage collision — главная опасность прокси. Implementation v2 не должен добавлять переменные перед существующими. OpenZeppelin Upgrades plugin для Hardhat и Foundry проверяет это автоматически, но только при использовании его API.

Как защитить контракт от MEV и front-running

На Ethereum mainnet транзакции в mempool видны всем. MEV-боты проводят sandwich-атаки на DEX, фронтраннинги минтинга и governance. Решение: commit-reveal scheme для аукционов, приватная отправка через Flashbots PROTECT RPC. EIP-7702 и PBS (proposer-builder separation) меняют картину, но пока не массово.

Процесс разработки

  1. Аналитика — спецификация функций, диаграмма вызовов, анализ edge cases. Без этого кодинг начинается впустую.
  2. Разработка — Solidity/Rust с тестами параллельно. Тест → код → рефакторинг. Используем Foundry для fuzz и invariant тестов.
  3. Внутренний аудит — Slither + Echidna + ручной code review. Foundry invariant tests для протокольных инвариантов.
  4. Внешний аудит — для проектов с реальными деньгами. Срок: 2–4 недели.
  5. Деплой — Foundry scripts или Hardhat Ignition с verify на Etherscan. Gnosis Safe для ownership transfer сразу после деплоя.
  6. Мониторинг — Tenderly alerts, OpenZeppelin Defender, Forta Network.

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

  • Документация на архитектуру и спецификацию контракта (NatSpec).
  • Исходный код с репозиторием и CI (Slither, Foundry, coverage).
  • Развёрнутая версия контракта с verify на блокчейн-эксплорере.
  • Результаты аудита (внутреннего и внешнего по запросу).
  • Доступы к мониторингу и управлению (Gnosis Safe).
  • Гарантия на код: фиксы критических багов в течение месяца после деплоя.
  • Консультация по интеграции с веб-интерфейсом (wagmi, RainbowKit).

Сроки ориентировочно

  • ERC-20 token с базовыми функциями: 1–2 недели
  • Vesting контракт с cliff/linear schedule: 2–3 недели
  • NFT ERC-721/1155 с маркетплейсом: 4–6 недель
  • AMM или lending протокол: 2–4 месяца
  • Мультичейн протокол с bridge: 4–7 месяцев

Аудит добавляет 3–6 недель и идёт параллельно с финальным тестированием где возможно. Стоимость рассчитывается индивидуально — свяжитесь с нами, и мы оценим ваш проект бесплатно.

Закажите разработку смарт-контракта — получите консультацию по архитектуре и защите от reentrancy, MEV и gas-атак. Хотите обсудить детали? Напишите нам — мы подберём оптимальный стек под вашу задачу.