Проблема: 90% IDO оказываются несправедливыми — инсайдеры получают аллокации, а розничные инвесторы покупают по завышенным ценам в 3–5 раз. Мы разрабатываем fair launch платформы, которые это исключают: ни pre-sale, ни team allocation, ни венчурных инвесторов с дисконтом. Все участники получают токены по одинаковым условиям с самого начала. YFI (Yearn Finance) стал каноническим примером — 30 000 токенов распределены исключительно через yield farming, Андре Кронье не оставил себе ни одного. Yearn.Finance Наш опыт в blockchain-разработке — несколько лет, мы реализовали свыше 30 DeFi-проектов с совокупным TVL более $200 млн.
На практике «fair» — это спектр. Полностью fair launch встречается редко. Чаще: минимальный team allocation (3–5%) + fair distribution механизм для остальных. Задача платформы — реализовать distribution механизм, который действительно минимизирует преимущество ранних инсайдеров.
Как работает Liquidity Bootstrapping Pool?
LBP (популяризован Balancer) — динамический AMM пул, в котором веса токенов меняются со временем. Стартуя с высоким весом проектного токена (например 96% TOKEN / 4% USDC), пул создаёт высокую начальную цену, которая органически снижается по мере изменения весов к конечному значению (50/50 или другому). Типичная длительность LBP — 72 часа.
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 позволяет собрать 80–90% от целевого cap.
Реализация кастомного 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 — ошибки в расчётах ведут к неправильным ценам. Наш контракт использует 18 знаков точности и протестирован на форк-мейннете с объемом ликвидности до $10 млн.
Почему важны антибот механизмы?
Commit-reveal. Участники сначала коммитят hash своей заявки, затем раскрывают. Боты не знают заранее сколько других заявок — не могут оптимально front-run. Это повышает стоимость атаки в десятки раз.
Max contribution cap per address. Ограничение на адрес снижает whale domination, но легко обходится через множество кошельков. Поэтому мы комбинируем с другими методами.
Proof-of-humanity или Gitcoin Passport. Требуем on-chain верификацию личности. Дороже для пользователей, но честнее. В наших проектах это снизило долю ботов до 5%.
Дополнительные fair launch механизмы
Batch auction (Gnosis Auction / Fjord Foundry)
Все участники подают заявки в течение auction window. После окончания определяется clearing price — единая цена, при которой спрос равен предложению. Все покупатели платят одинаковую цену независимо от времени подачи заявки. Batch auction в 2–3 раза эффективнее LBP по объёму собранных средств — достигает 95–100% от cap.
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
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);
}
Сравнение механизмов распределения
| Механизм | Честность | Сложность | Антибот защита | Регуляторный комплаенс | Эффективность сбора средств |
|---|---|---|---|---|---|
| LBP | Высокая | Средняя | Высокая | Низкий | Средняя (80-90% от cap) |
| Batch auction | Очень высокая | Высокая | Средняя | Средний | Высокая (95-100%) |
| Фиксированная цена | Низкая | Низкая | Низкая | Низкий | Зависит от шума |
Пример параметров LBP
| Параметр | Значение |
|---|---|
| Продолжительность | 72 часа |
| Начальный вес токена | 96% |
| Конечный вес токена | 50% |
| Начальный вес коллатерала | 4% |
| Конечный вес коллатерала | 50% |
| Max cap на адрес | 5000 USDC |
| Всего выпущенных токенов | 10 000 000 TOKEN |
Технический стек
Контракты: 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 недель. Свяжитесь с нами, чтобы обсудить ваш проект и получить оценку сроков и стоимости.
Что входит в работу
- Документация: спецификация механизма, архитектура, инструкции по развёртыванию.
- Смарт-контракты: LBP, vesting, whitelist (с полным покрытием тестами, покрытие >95%).
- Фронтенд: дашборд для участия и отслеживания вестинга.
- Аудит: внутренний и внешний (Slither, Mythril, Echidna).
- Развёртывание: на mainnet Ethereum/L2 (Polygon, Arbitrum, Optimism) — газ оптимизирован на 35%.
- Поддержка: 3 месяца после запуска (исправление багов, мониторинг).
Оцените ваш проект — свяжитесь с нами для консультации. Получите детальный breakdown механизма и точные сроки.







