Параметризованный white-label launchpad: разработка IDO/ICO платформы

Техническая архитектура white-label launchpad White-label launchpad — это не форк Polkastarter с новым логотипом. Успех платформы зависит от ликвидности и комьюнити, а не от копирования кода. Мы разрабатываем параметризованные решения, которые позволяют дифференцироваться через deal flow. Техниче

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1452
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1005
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1270
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1011

Техническая архитектура white-label launchpad

White-label launchpad — это не форк Polkastarter с новым логотипом. Успех платформы зависит от ликвидности и комьюнити, а не от копирования кода. Мы разрабатываем параметризованные решения, которые позволяют дифференцироваться через deal flow. Техническая сложность — в гибкости: контракты поддерживают разные модели пулов, tier-системы и мультичейн без переписывания кода. Многие проекты сталкиваются с проблемой масштабирования: добавление нового типа пула требует развертывания отдельного контракта, миграции данных и повторного аудита. Наша фабрика пулов решает это через единый параметризованный контракт, что сокращает время разработки на 50%.

За 5 лет мы реализовали более 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 Пропорциональное распределение Низкие, честное распределение Популярные проекты

Процесс работы и что входит

  1. Аналитика — встреча с инженерами, обсуждение целей и требований.
  2. Проектирование — архитектура смарт-контрактов и схема взаимодействия.
  3. Разработка — контракты на Solidity 0.8.x, Foundry для тестирования и аудита.
  4. Интеграция — фронтенд, админ-панель, KYC и мультичейн.
  5. Тестирование — unit-тесты, интеграционные тесты и аудит (Slither, Mythril).
  6. Деплой — контракты деплоятся в выбранные сети, фронтенд хостится.
  7. Поддержка — мониторинг, исправление багов и обновления.

Отметим, что входит в работу:

  • Исходный код смарт-контрактов (Solidity)
  • Документация по развертыванию и администрированию
  • Доступ к репозиторию с фронтендом и бэкендом
  • Обучение команды оператора (2 сессии)
  • Техническая поддержка на 3 месяца
Детали аудита

Контракты проходят аудит с использованием Slither, Mythril и формальной верификации. Мы также проводим fuzzing с Echidna. Типичные результаты: 0 критических уязвимостей, 2-3 medium, которые закрываются до деплоя.

Свяжитесь с нами для оценки вашего проекта — мы подготовим предложение за 2 дня. Закажите консультацию по архитектуре вашего ICO launchpad уже сегодня.