Ми проектуємо launchpad контракти, які обслуговують TVL до $50M, економлять до 40% газу завдяки Merkle tree whitelist та блокують 99% ботів через Dutch auction і anti-sniping. Якщо контракт не оптимізовано, газові витрати на участь можуть перевищити очікування, а боти викуповують алокації раніше реальних користувачів. Розберемо, як ми будуємо контракти, які витримують аудит та працюють з TVL до мільйонів доларів.
Стандартний launchpad-контракт включає seed, private та public раунди з різними цінами та лімітами. Для розмежування доступу використовуємо Merkle tree whitelist — це в 1000 разів ефективніше за зберігання всіх адрес on-chain. Кожен раунд має свої параметри: старт, ціну, мінімальний/максимальний ліміт, загальний cap. Whitelist реалізовано через Merkle tree, що дозволяє перевіряти належність до групи без зберігання всього списку, економлячи газ. KYC-перевірка проходить на рівні frontend, а контракт отримує Merkle root від перевірених учасників.
Типовий проект включає seed-раунд для інвесторів з дисконтом, private-раунд з обмеженим доступом та public-раунд для всіх. Для кожного раунду задаються терміни, ціна, ліміти. Щоб керувати доступом, ми використовуємо Merkle tree — це дозволяє пускати тільки тих, хто пройшов KYC, не розкриваючи весь список. Структура раунду виглядає так:
Як працює whitelist з Merkle tree?
struct Round { uint256 startTime; uint256 endTime; uint256 price; // в stablecoin (6 decimals для USDC) uint256 minAllocation; uint256 maxAllocation; uint256 totalCap; uint256 raised; bytes32 merkleRoot; // whitelist bool requiresKYC; bool isActive; } Функція participate верифікує учасника через Merkle proof та перевіряє KYC. Ліміти на гаманець захищають від whale-концентрації. Алгоритм Merkle tree описано в Wikipedia.
Чому vesting — головна технічна складність?
Більшість вразливостей launchpad контрактів — у vesting. Edge cases: TGE частина, revoke при відкликанні, precision loss. Нижче — коректна реалізація claimable з урахуванням cliff.
function claimable(address beneficiary) public view returns (uint256) { VestingSchedule memory schedule = vestingSchedules[beneficiary]; if (block.timestamp < schedule.cliffEnd) return 0; uint256 elapsed = block.timestamp - schedule.vestingStart; uint256 total = schedule.vestingEnd - schedule.vestingStart; uint256 vested = elapsed >= total ? schedule.totalAmount : (schedule.totalAmount * elapsed) / total; return vested - schedule.claimed; } Як уникнути reentrancy в launchpad?
Reentrancy — одна з найкритичніших вразливостей смарт-контрактів. В launchpad вона може виникнути при поверненні коштів або при виклику external-контрактів. Ми використовуємо модифікатор nonReentrant (від OpenZeppelin) та слідуємо патерну Checks-Effects-Interactions. Додатково всі зовнішні виклики здійснюються в кінці функцій, після оновлення стану.
Обробка softcap та refund
Якщо сума зборів менша за softcap, активується refund: кожен учасник може повернути свої кошти. Це захищає інвесторів від невдалих раундів.
function finalizeSale() external onlyOwner { require(block.timestamp > saleEndTime, "Sale not ended"); if (getTotalRaised() < softcap) { status = SaleStatus.Failed; } else { status = SaleStatus.Finalized; paymentToken.transfer(treasury, getTotalRaised()); } } Anti-whale та антибот захист
- Max allocation per wallet — базове обмеження.
- AntiSnipe-модифікатор: перші 30 секунд раунду доступні тільки tier-1 учасникам.
- Dutch auction: ціна знижується з часом, що робить ботів неефективними.
Інтеграція з токеном
Launchpad не видає токени одразу — алокації фіксуються, токени розподіляються через vesting. Є два підходи: pre-funded (токени переводяться на контракт заздалегідь) або mint-on-claim (контракт отримує роль MINTER та чеканить токени при клеймі). Другий варіант популярніший для проектів з гнучким total supply. Наш досвід показує, що mint-on-claim знижує навантаження на ліквідність, оскільки токени не блокуються заздалегідь.
Порівняння підходів до розподілу токенів
| Підхід | Переваги | Недоліки |
|---|---|---|
| Pre-funded | Токени на контракті з моменту деплою; не потрібна роль мінтингу | Блокування капіталу; ризик втрати при помилці |
| Mint-on-claim | Гнучкість total supply; економія газу на деплої | Потрібна роль MINTER; залежність від токена |
Процес роботи над IDO контрактом на Solidity
- Аналітика: збір вимог, визначення кількості раундів, цін, лімітів, vesting параметрів.
- Проектування: архітектура контракту, Merkle tree, KYC, anti-whale.
- Реалізація: написання Solidity коду з використанням Foundry, unit-тести.
- Аудит: статичний аналіз (Slither), fuzz-тестування (Echidna), ручний review, fork testing на основній мережі.
- Деплой та запуск: розгортання на цільовій мережі (Ethereum, Polygon, Arbitrum), налаштування Tenderly для моніторингу.
Ми гарантуємо, що кожен етап проходить перевірку та відповідає найкращим практикам безпеки. Наш досвід у розробці децентралізованих проектів налічує кілька років, і ми завжди готові поділитися експертизою.
Що входить в роботу
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика | 1-2 тижні | Технічне завдання |
| Проектування | 1-2 тижні | Архітектура контракту |
| Реалізація | 3-5 тижнів | Вихідний код, тести |
| Аудит | 2-3 тижні | Звіт аудиту |
| Деплой | 1 тиждень | Розгорнутий контракт, документація |
Орієнтовний термін повного циклу — 8-14 тижнів. Вартість розраховується індивідуально в залежності від складності проекту.
Якщо вам потрібен надійний launchpad контракт, отримайте консультацію – оцінимо ваш проект. Ми надаємо launchpad розробку під ключ з повним циклом аудиту та fork testing.







