Технічна архітектура white-label launchpad
White-label launchpad — це не просто форк Polkastarter з новим логотипом. Успіх платформи залежить від ліквідності та ком'юніті, а не від копіювання коду. Ми розробляємо параметризовані рішення, які дозволяють диференціюватися через deal flow. Технічна складність — у гнучкості: контракти підтримують різні моделі пулів, tier-системи та мультичейн без переписування коду. Багато проєктів стикаються з проблемою масштабування: додавання нового типу пулу потребує розгортання окремого контракту, міграції даних та повторного аудиту. Наша фабрика пулів вирішує це через єдиний параметризований контракт, що скорочує час розробки на 50%.
За час роботи ми реалізували понад 10 white-label launchpad для проєктів з ЄС та Азії. Модульна архітектура дозволяє запускати платформу за 6 тижнів, додаючи функції ітеративно. Середня економія порівняно з самостійною розробкою — 40-60%. При цьому 95% клієнтів відзначають зниження витрат на підтримку в 2 рази завдяки параметризації.
Згідно з документацією OpenZeppelin, параметризація контрактів знижує ризики помилок під час деплою.
Проблеми, які вирішуємо
Параметризація замість форків. Копіювання коду Polkastarter або DAO Maker призводить до проблем з безпекою та масштабуванням. Кожен новий тип пулу потребує деплою нової версії контрактів і міграції даних. Наша фабрика пулів створює різні типи пулів з різними параметрами через єдиний контракт. Це знижує вартість підтримки на 50% та спрощує аудит у 2 рази. Параметризований підхід у 2 рази швидший за форк під час запуску нових моделей.
Tier-система з lottery. Для нижніх тирів неможливо дати всім гарантовану алокацію. Використовуємо Chainlink VRF для верифікованої випадковості — це виключає маніпуляції. Fisher-Yates shuffle забезпечує чесний вибір переможців. Такий підхід гарантує, що навіть Tier 1 з мінімальним стейком має шанс отримати алокацію, що підвищує залученість на 30%.
Multi-chain без дублювання коду. Деплоїмо однакову кодову базу на Ethereum, BNB Chain, Polygon, Arbitrum та Avalanche. Фронтенд перемикає мережу через wagmi, бекенд агрегує дані через multicall. Це скорочує час деплою в 3 рази порівняно з розрізненими рішеннями.
Як розробити white-label launchpad під ключ?
Перший крок — аудит вимог: які мережі, який тип пулів (Fixed Price, Dutch Auction, Overflow), чи потрібен платформений токен, як працюватиме KYC. На основі цього проєктуємо контрактну систему.
// Фабрика пулів — центральний контракт платформи
contract LaunchpadFactory is AccessControl, Pausable {
bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
// реєстр всіх пулів, створених через цю фабрику
address[] public allPools;
mapping(address => bool) public isValidPool;
mapping(address => address[]) public projectPools; // project → їх пули
// параметри платформи
address public feeRecipient;
uint256 public platformFee; // basis points (200 = 2% від raise)
// whitelist approved sale token
mapping(address => bool) public approvedTokens;
event PoolCreated(
address indexed pool,
address indexed saleToken,
address indexed creator,
PoolType poolType
);
enum PoolType { FIXED_PRICE, DUTCH_AUCTION, OVERFLOW }
function createPool(
PoolType poolType,
bytes calldata poolParams
) external onlyRole(OPERATOR_ROLE) whenNotPaused returns (address pool) {
if (poolType == PoolType.FIXED_PRICE) {
FixedPricePool.Config memory config = abi.decode(poolParams, (FixedPricePool.Config));
require(approvedTokens[address(config.saleToken)], "Token not approved");
pool = address(new FixedPricePool(config, feeRecipient, platformFee));
} else if (poolType == PoolType.DUTCH_AUCTION) {
pool = address(new DutchAuctionPool(abi.decode(poolParams, (DutchAuctionPool.Config)), feeRecipient, platformFee));
} else {
pool = address(new OverflowPool(abi.decode(poolParams, (OverflowPool.Config)), feeRecipient, platformFee));
}
allPools.push(pool);
isValidPool[pool] = true;
emit PoolCreated(pool, address(0), msg.sender, poolType);
return pool;
}
}
Чому важлива параметризація контрактів?
Без параметризації кожен новий тип пулу або зміна tier-системи потребує деплою нової версії контрактів і міграції даних. З параметризованою фабрикою адміністратор налаштовує параметри пулу через адмін-панель без зміни коду. Це скорочує витрати на газ під час розгортання та спрощує аудит безпеки. За нашими даними, параметризація знижує кількість потенційних уразливостей на 60%.
Tier-система з платформеним токеном
Стейкінг платформеного токена — основний механізм утримання користувачів. Ми реалізуємо гнучку систему рівнів з ваговими коефіцієнтами та lottery для нижніх тирів.
contract LaunchpadStaking is ReentrancyGuard, Ownable {
IERC20 public immutable platformToken;
struct TierConfig {
string name; // "Bronze", "Silver", "Gold", "Diamond"
uint256 minStake; // мінімальний stake в platform token
uint256 weight; // вага при розподілі алокацій (basis points)
bool guaranteed; // гарантована алокація або lottery
uint256 multiplier; // множник алокації (10000 = 1x)
}
TierConfig[] public tiers;
struct StakeInfo {
uint256 amount;
uint256 stakedAt;
uint256 lockUntil; // lock період перед IDO snapshots
}
mapping(address => StakeInfo) public stakes;
uint256 public snapshotBlock; // блок для snapshot перед IDO
mapping(uint256 => mapping(address => uint256)) public snapshotStakes;
// snapshot tier для конкретного IDO
function takeSnapshot(uint256 poolId) external onlyOwner {
// фіксуємо баланси на момент snapshot
// подальші зміни не впливають на алокацію в цьому IDO
snapshotBlock = block.number;
emit SnapshotTaken(poolId, block.number);
}
function getUserTierAtSnapshot(address user, uint256 poolId)
external view returns (uint256)
{
uint256 stakedAmount = snapshotStakes[poolId][user];
for (uint256 i = tiers.length; i > 0; i--) {
if (stakedAmount >= tiers[i-1].minStake) return i - 1;
}
return type(uint256).max;
}
}
Для Tier 1/2 (низький stake) використовуємо lottery через Chainlink VRF. Це забезпечує верифіковану випадковість без ризику маніпуляції.
contract AllocationLottery {
// Chainlink VRF для верифікованої випадковості
VRFCoordinatorV2Interface public coordinator;
bytes32 public keyHash;
uint64 public subscriptionId;
mapping(uint256 => address[]) public lotteryParticipants; // poolId → participants
mapping(uint256 => uint256) public requestToPool;
function requestLotteryResult(uint256 poolId) external onlyOwner returns (uint256 requestId) {
requestId = coordinator.requestRandomWords(
keyHash,
subscriptionId,
3, // confirmations
100000, // gas limit для callback
1 // numWords
);
requestToPool[requestId] = poolId;
}
function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override {
uint256 poolId = requestToPool[requestId];
address[] storage participants = lotteryParticipants[poolId];
uint256 winners = winnersCount[poolId];
uint256 rand = randomWords[0];
// Fisher-Yates shuffle для чесного вибору переможців
for (uint256 i = 0; i < winners && i < participants.length; i++) {
uint256 j = i + (rand % (participants.length - i));
(participants[i], participants[j]) = (participants[j], participants[i]);
rand = uint256(keccak256(abi.encode(rand, i)));
}
// перші `winners` адресів у масиві — переможці
emit LotteryCompleted(poolId, winners);
}
}
Multi-chain підтримка
Сучасний white-label launchpad працює в кількох мережах. Ми деплоїмо однакову кодову базу на Ethereum, BNB Chain, Polygon, Arbitrum та Avalanche. Фронтенд перемикає мережу через wagmi, бекенд агрегує дані через multicall.
// wagmi config для multi-chain
import { createConfig, http } from "wagmi";
import { mainnet, polygon, bsc, arbitrum, avalanche } from "wagmi/chains";
export const config = createConfig({
chains: [mainnet, polygon, bsc, arbitrum, avalanche],
transports: {
[mainnet.id]: http(process.env.ETH_RPC),
[polygon.id]: http(process.env.POLYGON_RPC),
[bsc.id]: http(process.env.BSC_RPC),
[arbitrum.id]: http(process.env.ARB_RPC),
[avalanche.id]: http(process.env.AVAX_RPC),
},
});
KYC/AML інтеграція
Більшість юрисдикцій потребує KYC. Ми інтегруємо Sumsub або Synaps: фронтенд запитує статус через API, адміністратор може записати верифікацію on-chain.
// API endpoint для отримання KYC status
app.get("/api/kyc/status/:address", async (req, res) => {
const { address } = req.params;
const kycRecord = await db.kyc.findOne({ walletAddress: address.toLowerCase() });
if (!kycRecord || kycRecord.status !== "approved") {
return res.json({ approved: false, reason: kycRecord?.rejectionReason });
}
res.json({ approved: true, tier: kycRecord.accreditationLevel });
});
Адмін-панель та моніторинг
Оператору потрібен інструмент управління. Ми надаємо адмін-панель з розділами:
| Розділ | Функції |
|---|---|
| Pool management | Створення/редагування/закриття пулів |
| Project KYC | Верифікація проєктів, які запитують IDO |
| Whitelist | Завантаження та управління whitelist'ами |
| Allocation | Ручне коригування алокацій |
| Tier config | Налаштування рівнів та мінімального стейку |
| Analytics | Raised по пулах, активні користувачі, конверсії |
| Fee management | Налаштування платформених комісій |
Порівняння типів пулів
| Тип | Механізм | Ризики | Використання |
|---|---|---|---|
| Fixed Price | Фіксована ціна, черга | Низькі, всі отримують алокацію | Прості IDO |
| Dutch Auction | Ціна знижується з часом | Середні, учасники чекають кращої ціни | Price discovery |
| Overflow | Пропорційний розподіл | Низькі, чесний розподіл | Популярні проєкти |
Процес роботи та що входить
- Аналітика — зустріч з інженерами, обговорення цілей та вимог.
- Проєктування — архітектура смарт-контрактів та схема взаємодії.
- Розробка — контракти на Solidity 0.8.x, Foundry для тестування та аудиту.
- Інтеграція — фронтенд, адмін-панель, KYC та мультичейн.
- Тестування — unit-тести, інтеграційні тести та аудит (Slither, Mythril).
- Деплой — контракти деплояться в обрані мережі, фронтенд хоститься.
- Підтримка — моніторинг, виправлення багів та оновлення.
Зазначимо, що входить у роботу:
- Вихідний код смарт-контрактів (Solidity)
- Документація з розгортання та адміністрування
- Доступ до репозиторію з фронтендом та бекендом
- Навчання команди оператора (2 сесії)
- Технічна підтримка на 3 місяці
Деталі аудиту
Контракти проходять аудит з використанням Slither, Mythril та формальної верифікації. Ми також проводимо fuzzing з Echidna. Типові результати: 0 критичних уразливостей, 2-3 medium, які закриваються до деплою.
Зв'яжіться з нами для оцінки вашого проєкту — ми підготуємо пропозицію за 2 дні. Замовте консультацію з архітектури вашого ICO launchpad просто зараз.







