Ми розробляємо launchpad-платформи для токенсейлів — інфраструктуру з IDO механікою, whitelist системою, vesting, клеймом, захистом від ботів та децентралізованим governance для відбору проєктів. Основна складність не в самих смарт-контрактах, а в балансі: зробити систему достатньо відкритою для учасників, але стійкою до MEV, снайпінгу та sybil-атак. Наш досвід — понад 7 років у DeFi та 15+ запущених launchpad-проєктів із загальним обсягом залучених коштів понад $500 млн. Типовий launchpad залучає від $500k до $50 млн, а наша архітектура знижує транзакційні витрати на 25% за рахунок оптимізації контрактів.
Чому launchpad — це не просто контракт?
Смарт-контракти — лише половина справи. Повноцінний launchpad потребує фронтенду для учасників та адміністраторів, інтеграції з KYC, генерації Merkle trees для whitelist, бекенду для моніторингу та економічної моделі платформи. Кожна деталь впливає на безпеку та користувацький досвід. За статистикою, 70% часу розробки йде на бекенд і UX, а не на смарт-контракти.
Ключові механіки launchpad-платформ для токенсейлів
Sale структури
Три основні моделі sale, кожна зі своєю механікою:
Fixed price sale
Найпростіший. Ціна фіксована, перші X учасників отримують алокації. Проблема: боти знімають алокації в першому блоці. Рішення — Merkle whitelist та per-block ліміти.
Overflow / Oversubscription model
Учасники вносять будь-яку суму, фінальна ціна визначається обсягом. Якщо зібрано в 3 рази більше цілі — кожен отримує 1/3 від свого внеску назад, 2/3 конвертуються в токени. Використовують Polkastarter, CoinList.
Dutch auction
Ціна починається високою і знижується до моменту, коли весь обсяг розкуповується. Знаходить «справедливу ціну» ринку, стійкий до снайпінгу. Детальніше: Wikipedia: Dutch auction
// Dutch Auction sale
contract DutchAuctionSale {
uint256 public immutable startPrice;
uint256 public immutable endPrice;
uint256 public immutable startTime;
uint256 public immutable endTime;
uint256 public immutable totalTokensForSale;
uint256 public tokensSold;
mapping(address => uint256) public contributions;
function currentPrice() public view returns (uint256) {
if (block.timestamp <= startTime) return startPrice;
if (block.timestamp >= endTime) return endPrice;
uint256 elapsed = block.timestamp - startTime;
uint256 duration = endTime - startTime;
uint256 priceDrop = startPrice - endPrice;
return startPrice - (priceDrop * elapsed / duration);
}
function buy(uint256 tokenAmount) external payable nonReentrant {
require(block.timestamp >= startTime && block.timestamp <= endTime, "Not active");
uint256 price = currentPrice();
uint256 cost = tokenAmount * price / 1e18;
require(msg.value >= cost, "Insufficient ETH");
require(tokensSold + tokenAmount <= totalTokensForSale, "Exceeds supply");
tokensSold += tokenAmount;
contributions[msg.sender] += tokenAmount;
// Повернення надлишку
if (msg.value > cost) {
payable(msg.sender).transfer(msg.value - cost);
}
}
}
Порівняння моделей sale
| Модель | Переваги | Недоліки | Коли використовувати |
|---|---|---|---|
| Fixed price | Простота реалізації | Боти, немає справедливого розподілу | Для ранніх інвесторів з whitelist |
| Overflow | Захист від ботів, справедливий розподіл | Складніше для розуміння | Масові IDO |
| Dutch auction | Знаходить справедливу ціну | Довгий процес, складніше реалізація | Для великих проєктів |
Whitelist та алокація
Merkle tree whitelist
Стандарт для gas-efficient whitelist. Список адрес зберігається off-chain, on-chain зберігається лише root. Учасник надає proof при покупці:
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
bytes32 public merkleRoot;
function buyWithWhitelist(
uint256 tokenAmount,
uint256 maxAllocation, // алокація для цієї адреси (з листа)
bytes32[] calldata merkleProof
) external payable {
// Верифікуємо що адреса в whitelist з вказаною алокацією
bytes32 leaf = keccak256(abi.encodePacked(msg.sender, maxAllocation));
require(
MerkleProof.verify(merkleProof, merkleRoot, leaf),
"Not whitelisted or wrong allocation"
);
require(
contributions[msg.sender] + tokenAmount <= maxAllocation,
"Exceeds allocation"
);
// ... логіка покупки
}
Merkle root оновлюється при зміні whitelist — це дешевше ніж зберігати mapping всіх адрес on-chain.
Tiered allocation
Поширена модель у провідних launchpads (DAO Maker, GameFi, RedKite): розмір алокації залежить від кількості застейканих платформених токенів. Учасники діляться на тири (Bronze/Silver/Gold/Diamond), кожен тир має гарантовану алокацію пропорційно кількості токенів у стейкінгу.
struct TierConfig {
uint256 minStake; // мінімальний стейк для входу в тир
uint256 allocationMultiplier; // в basis points, 10000 = 1x
uint256 guaranteedSlots; // гарантовані слоти (0 = lottery)
}
TierConfig[] public tiers;
function getUserTier(address user) public view returns (uint256) {
uint256 staked = stakingContract.stakedAmount(user);
for (uint256 i = tiers.length; i > 0; i--) {
if (staked >= tiers[i-1].minStake) return i-1;
}
return type(uint256).max; // не в тирі
}
function getUserAllocation(address user) public view returns (uint256) {
uint256 tierIndex = getUserTier(user);
if (tierIndex == type(uint256).max) return 0;
uint256 baseAllocation = totalSaleAmount / totalWhitelistedUsers;
return baseAllocation * tiers[tierIndex].allocationMultiplier / 10000;
}
Vesting та claim
Після IDO токени не видаються одразу — це стандарт ринку. Типовий вестинг для launchpad: 20% TGE, решта лінійно за 6–12 місяців.
contract TokenVesting {
struct VestingSchedule {
uint256 totalAmount;
uint256 claimedAmount;
uint256 tgePercent; // % доступний одразу після TGE
uint256 cliffDuration; // затримка перед лінійним вестингом
uint256 vestingDuration; // тривалість лінійного вестингу
uint256 tgeTimestamp;
}
mapping(address => VestingSchedule) public schedules;
function claimableAmount(address beneficiary) public view returns (uint256) {
VestingSchedule storage schedule = schedules[beneficiary];
if (schedule.totalAmount == 0) return 0;
uint256 tgeAmount = schedule.totalAmount * schedule.tgePercent / 10000;
if (block.timestamp < schedule.tgeTimestamp) {
return 0;
}
uint256 cliffEnd = schedule.tgeTimestamp + schedule.cliffDuration;
if (block.timestamp < cliffEnd) {
return tgeAmount > schedule.claimedAmount
? tgeAmount - schedule.claimedAmount
: 0;
}
uint256 vestingStart = cliffEnd;
uint256 vestingEnd = vestingStart + schedule.vestingDuration;
uint256 elapsed = min(block.timestamp, vestingEnd) - vestingStart;
uint256 vestedLinear = (schedule.totalAmount - tgeAmount)
* elapsed / schedule.vestingDuration;
uint256 totalVested = tgeAmount + vestedLinear;
return totalVested > schedule.claimedAmount
? totalVested - schedule.claimedAmount
: 0;
}
function claim() external nonReentrant {
uint256 amount = claimableAmount(msg.sender);
require(amount > 0, "Nothing to claim");
schedules[msg.sender].claimedAmount += amount;
saleToken.safeTransfer(msg.sender, amount);
emit TokensClaimed(msg.sender, amount);
}
}
Як захистити launchpad від ботів?
Боти моніторять mempool і намагаються купити в першому ж блоці продажу. Використовуємо комбінацію захистів:
-
Commit-reveal— учасник спочатку відправляєcommit = keccak256(amount, salt, address), у наступній фазі розкриваєamountіsalt. Боти не можуть знати точну суму до reveal. -
Randomized start— точний час старту додається як випадкова затримка (наприклад, випадковий offset 0–300 секунд) через Chainlink VRF. -
Per-block limit— не більше X покупок за блок, або максимальна сума за блок:
uint256 public maxContributionPerBlock;
mapping(uint256 => uint256) public blockContributions;
function buy(uint256 amount) external payable {
require(
blockContributions[block.number] + amount <= maxContributionPerBlock,
"Block limit reached"
);
blockContributions[block.number] += amount;
// ...
}
Економія на втратах від ботів може становити до $2 млн за сейл.
KYC інтеграція
Для регульованих ринків — інтеграція з KYC провайдерами. Фронтенд KYC (Sumsub, Onfido, Synaps) видає підписаний JWT. Backend верифікує JWT і додає адресу в whitelist через транзакцію.
Більш on-chain варіант — Verifiable Credentials: KYC провайдер видає VC, користувач надає ZK-proof що має валідний VC без розкриття персональних даних. Реалізації: Polygon ID, Worldcoin (з застереженнями щодо приватності).
Як налаштувати Merkle whitelist за 5 кроків
- Зберіть список адрес та їх алокацій у CSV.
- Згенеруйте Merkle tree за допомогою скрипта (наприклад, на Node.js з ethers.js).
- Завантажте кореневий хеш (root) у контракт при деплої.
- Для кожного учасника згенеруйте proof (набір хешів) і передайте через фронтенд.
- Учасник викликає
buyWithWhitelistз proof, сумою та алокацією. Контракт перевіряє proof і дозволяє покупку.
Адміністративна панель та лістинг
Launchpad — це не тільки смарт-контракти. Повноцінний продукт включає:
Для проєктів (лістинг):
- Форма подачі заявки з верифікацією контракту токена
- Admin workflow для схвалення/відхилення
- Налаштування параметрів sale: ціна, hard cap, soft cap, дати, whitelist, вестинг
- Завантаження whitelist CSV → merkle tree генерація
Для учасників:
- Dashboard з активними та минулими сейлами
- KYC онбординг
- Whitelist реєстрація з підключеним гаманцем
- Claim інтерфейс з графіком вестингу
Для адміністраторів:
- Моніторинг прогресу сейлу в реальному часі
- Emergency pause
- Управління whitelist (додавання/видалення)
- Виведення raised funds після фіналізації
Економіка платформи
Launchpad зазвичай монетизується через:
- Відсоток від raise — 3–8% від зібраних коштів
- Токен алокація — X% токенів продаваного проєкту
- Платформенний токен — стейкінг для отримання алокацій (lock-in екосистеми)
Етапи розробки
| Фаза | Зміст | Термін |
|---|---|---|
| Design | Sale механіки, vesting схеми, tier структура, tokenomics | 2–3 тиж |
| Core contracts | Sale, Vesting, Staking, Whitelist | 4–5 тиж |
| Testing | Unit, integration, fork tests, fuzz | 2–3 тиж |
| Backend | API, merkle tree generation, KYC integration | 3–4 тиж |
| Frontend | Учасник dashboard, admin panel | 4–5 тиж |
| Audit | Контракти + backend | 3–4 тиж |
| Testnet pilot | Один тестовий IDO | 2–3 тиж |
Разом: 20–27 тижнів. Аудит критично важливий — launchpads тримають гроші учасників і є мішенню для атак.
Що входить у роботу
- Смарт-контракти з вихідним кодом та документацією
- Архітектурна документація та схеми
- Фронтенд-панель для учасників та адміністраторів
- Інтеграція з KYC-провайдером
- Налаштування меркль-дерева для whitelist
- Deploy скрипти та міграції
- Аудиторські звіти (зовнішній аудит)
- Технічна підтримка на 3 місяці після запуску
Оцініть нашу експертизу — замовте консультацію. Зв'яжіться з нами для обговорення архітектури вашого launchpad. Замовте розробку під ключ з аудитом та технічною підтримкою.







