Разработка платформы fair launch

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1 услугВсе 1306 услуг
Разработка платформы fair launch
Средняя
~1-2 недели
Часто задаваемые вопросы
Направления блокчейн-разработки
Этапы блокчейн-разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1221
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1163
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    855
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1056
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    828

Разработка платформы fair launch

«Fair launch» означает запуск токена без pre-sale, без team allocation, без венчурных инвесторов с дисконтированными токенами — все участники получают токены по одинаковым условиям с самого начала. YFI (Yearn Finance) в 2020 году стал каноническим примером: 30 000 токенов распределены исключительно через yield farming, Андре Кронье не оставил себе ни одного.

На практике «fair» — это спектр. Полностью fair launch встречается редко. Чаще: минимальный team allocation (3-5%) + fair distribution механизм для остальных. Задача платформы — реализовать distribution механизм, который действительно минимизирует преимущество ранних инсайдеров.

Liquidity Bootstrapping Pool (LBP): основной механизм

LBP (popularized Balancer) — динамический AMM пул, в котором веса токенов меняются со временем. Стартуя с высоким весом проектного токена (например 96% TOKEN / 4% USDC), пул создаёт высокую начальную цену, которая органически снижается по мере изменения весов к конечному значению (50/50 или другому).

LBP механика:
t=0:   weight [TOKEN: 96%, USDC: 4%] → цена TOKEN высокая
t=T/2: weight [TOKEN: 72%, USDC: 28%] → цена снижается
t=T:   weight [TOKEN: 50%, USDC: 50%] → финальный вес

Математика: price = (reserve_USDC / weight_USDC) / (reserve_TOKEN / weight_TOKEN)
При снижении weight_TOKEN — denominator растёт → цена снижается автоматически

Это решает проблему bots и sniper: нет фиксированной низкой цены в момент запуска, которую можно немедленно арбитражить. Ботам невыгодно покупать сразу — цена будет ниже позже. Создаётся natural price discovery.

Реализация кастомного LBP контракта

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

contract LiquidityBootstrappingPool {
    address public immutable token;        // Проектный токен
    address public immutable collateral;   // USDC/ETH
    
    uint256 public startTime;
    uint256 public endTime;
    
    uint256 public startWeightToken;   // e.g. 96e16 (96%)
    uint256 public endWeightToken;     // e.g. 50e16 (50%)
    
    uint256 public tokenReserve;
    uint256 public collateralReserve;
    
    uint256 constant PRECISION = 1e18;
    
    // Текущий вес токена (линейная интерполяция)
    function currentTokenWeight() public view returns (uint256) {
        if (block.timestamp <= startTime) return startWeightToken;
        if (block.timestamp >= endTime)   return endWeightToken;
        
        uint256 elapsed  = block.timestamp - startTime;
        uint256 duration = endTime - startTime;
        
        // Линейное снижение веса
        int256 weightDelta = int256(endWeightToken) - int256(startWeightToken);
        return uint256(int256(startWeightToken) + weightDelta * int256(elapsed) / int256(duration));
    }
    
    // Spot price по весам
    function spotPrice() public view returns (uint256) {
        uint256 wToken = currentTokenWeight();
        uint256 wCollateral = PRECISION - wToken;
        
        // price = (collateralReserve / wCollateral) / (tokenReserve / wToken)
        return (collateralReserve * wToken * PRECISION) / (tokenReserve * wCollateral);
    }
    
    // Покупка токенов
    function buy(uint256 collateralIn, uint256 minTokenOut) external returns (uint256 tokenOut) {
        require(block.timestamp >= startTime && block.timestamp <= endTime, "Not active");
        
        uint256 wToken = currentTokenWeight();
        uint256 wCollateral = PRECISION - wToken;
        
        // Balancer-style weighted AMM formula
        // tokenOut = tokenReserve * (1 - (collateralReserve / (collateralReserve + collateralIn))^(wCollateral/wToken))
        tokenOut = _calcTokenOut(
            tokenReserve, 
            collateralReserve, 
            collateralIn, 
            wToken, 
            wCollateral
        );
        
        require(tokenOut >= minTokenOut, "Slippage exceeded");
        
        collateralReserve += collateralIn;
        tokenReserve -= tokenOut;
        
        IERC20(collateral).transferFrom(msg.sender, address(this), collateralIn);
        IERC20(token).transfer(msg.sender, tokenOut);
        
        emit Swap(msg.sender, collateralIn, tokenOut, spotPrice());
    }
}

Математика weighted AMM (Balancer invariant): Σ(balance_i / weight_i) = constant при trades сохраняющих invariant. Для двух-ассетного пула формула упрощается, но требует точного fixed-point arithmetic — ошибки в расчётах ведут к неправильным ценам.

Интеграция с Balancer V2

Вместо кастомного LBP контракта — использовать Balancer V2 LBP (существующий аудированный контракт):

import { BalancerSDK } from "@balancer-labs/sdk"

const balancer = new BalancerSDK({
  network: Network.MAINNET,
  rpcUrl: "https://mainnet.infura.io/v3/...",
})

// Создание LBP через Balancer V2 Vault
const lbpParams = {
  name: "My Token LBP",
  symbol: "MTK-LBP",
  tokens: [collateralAddress, tokenAddress].sort(), // должны быть sorted
  weights: ["0.04", "0.96"],        // начальные веса: 4% USDC, 96% TOKEN
  endWeights: ["0.50", "0.50"],     // финальные веса
  swapFeePercentage: "0.01",        // 1% swap fee
  owner: projectOwner,
  swapEnabledOnStart: true,
  startTime: Math.floor(Date.now() / 1000) + 3600, // через час
  endTime:   Math.floor(Date.now() / 1000) + 3600 + 3 * 86400, // 3 дня
}

Дополнительные fair launch механизмы

Batch auction (Gnosis Auction / Fjord Foundry)

Все участники подают заявки в течение auction window. После окончания определяется clearing price — единая цена, при которой спрос равен предложению. Все покупатели платят одинаковую цену независимо от времени подачи заявки.

Batch auction flow:
1. Window: 24-72 часа
2. Участники: submit bid (amount USDC, min acceptable price)
3. После window: sort bids по убыванию цены
4. Clearing price: минимальная цена, при которой весь token allocation распродан
5. Bids >= clearing price: исполняются по clearing price
6. Bids < clearing price: refunded

Преимущество над LBP: нет ценового давления времени — нет смысла ждать «правильного момента», все платят одно и то же.

Vesting контракт для купленных токенов

Fair launch не означает немедленную доступность токенов — иначе первые покупатели немедленно дампят на следующих. Стандартный паттерн: купленные токены vest линейно 6-12 месяцев.

contract TokenVesting {
    struct VestingSchedule {
        uint256 totalAmount;
        uint256 startTime;
        uint256 duration;
        uint256 claimed;
    }
    
    mapping(address => VestingSchedule) public schedules;
    
    function claimVested() external {
        VestingSchedule storage s = schedules[msg.sender];
        require(s.totalAmount > 0, "No vesting");
        
        uint256 elapsed = block.timestamp - s.startTime;
        uint256 vested = elapsed >= s.duration 
            ? s.totalAmount 
            : (s.totalAmount * elapsed) / s.duration;
        
        uint256 claimable = vested - s.claimed;
        require(claimable > 0, "Nothing to claim");
        
        s.claimed += claimable;
        token.transfer(msg.sender, claimable);
    }
}

Whitelist и KYC

Для регуляторного compliance некоторые платформы добавляют whitelist. Merkle tree approach: off-chain список approved адресов → on-chain Merkle root → пользователь доказывает inclusion при участии в launch.

function participate(
    uint256 amount,
    bytes32[] calldata whitelistProof
) external {
    // Верифицировать whitelist membership
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify(whitelistProof, whitelistRoot, leaf), "Not whitelisted");
    
    // Участие в launch
    _acceptContribution(msg.sender, amount);
}

Anti-bot механизмы

Commit-reveal. Участники сначала коммитят hash своей заявки, затем раскрывают. Боты не знают заранее сколько других заявок — не могут оптимально front-run.

Max contribution cap per address. Ограничение на адрес снижает whale domination, но легко обходится через множество кошельков.

Proof-of-humanity или Gitcoin Passport. Требуем on-chain верификацию личности. Дороже для пользователей, но честнее.

Технический стек

Контракты: Foundry + OpenZeppelin. LBP: Balancer V2 или кастомный. Frontend: wagmi + viem + React. Auction: Gnosis Auction (существующий аудированный контракт — переиспользовать). Analytics: Dune Analytics для отслеживания distribution.

Процесс работы

Экономический дизайн (1 неделя). Выбор механизма (LBP vs batch auction vs hybrid), параметры (duration, weights, max cap), vesting schedule. Это определяет всё остальное.

Разработка (3-5 недель). Auction/LBP контракт → vesting контракт → admin controls (emergency pause, sweep unclaimed) → тесты с fork mainnet симуляцией.

Frontend (2-3 недели). Real-time price chart, contribution UI, vesting claim dashboard.

Аудит (1-2 недели). Приоритет: контракт принимает реальные деньги. Даже для простого механизма — минимум один внешний аудит.

Полная платформа (LBP + vesting + UI) — 6-10 недель.