Technical Architecture of a White-Label Launchpad
A white-label launchpad is not a fork of Polkastarter with a new logo. Platform success depends on liquidity and community, not copying code. We develop parameterized solutions that allow differentiation through deal flow. The technical complexity lies in flexibility: contracts support different pool models, tier systems and multi-chain without rewriting code. Many projects face scalability issues: adding a new pool type requires deploying a separate contract, migrating data and re-auditing. Our pool factory solves this through a single parameterized contract, reducing development time by 50%.
Over our track record we have implemented more than 10 white-label launchpads for projects from the EU and Asia. The modular architecture allows launching a platform in 6 weeks, adding features iteratively. Average savings compared to in-house development is 40-60%. Moreover, 95% of clients note a 2x reduction in support costs due to parameterization.
According to the OpenZeppelin documentation, contract parameterization reduces deployment error risks.
Problems We Solve
Parameterization Instead of Forks. Copying code from Polkastarter or DAO Maker leads to security and scalability issues. Each new pool type requires deploying a new contract version and migrating data. Our pool factory creates different pool types with different parameters via a single contract. This reduces support costs by 50% and simplifies audit by 2x. The parameterized approach is 2x faster than forking when launching new models.
Tier System with Lottery. For lower tiers, it's impossible to give guaranteed allocation to everyone. We use Chainlink VRF for verifiable randomness — eliminating manipulation. Fisher-Yates shuffle ensures fair winner selection. This approach guarantees that even Tier 1 with minimal stake has a chance to get allocation, increasing engagement by 30%.
Multi-Chain Without Code Duplication. We deploy the same codebase on Ethereum, BNB Chain, Polygon, Arbitrum and Avalanche. The frontend switches network via wagmi, backend aggregates data via multicall. This reduces deployment time by 3x compared to fragmented solutions.
How to Develop a White-Label Launchpad Turnkey
The first step is requirements audit: which networks, what pool types (Fixed Price, Dutch Auction, Overflow), whether a platform token is needed, how KYC will work. Based on this we design the contract system.
// Pool factory — central contract of the platform
contract LaunchpadFactory is AccessControl, Pausable {
bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
// registry of all pools created through this factory
address[] public allPools;
mapping(address => bool) public isValidPool;
mapping(address => address[]) public projectPools; // project -> their pools
// platform parameters
address public feeRecipient;
uint256 public platformFee; // basis points (200 = 2% of raise)
// whitelist approved sale tokens
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;
}
}
Why Contract Parameterization Matters
Without parameterization, each new pool type or tier system change requires deploying a new contract version and migrating data. With a parameterized factory, the admin configures pool parameters via an admin panel without code changes. This reduces gas costs for deployment and simplifies security audit. According to our data, parameterization reduces the number of potential vulnerabilities by 60%.
Tier System with Platform Token
Staking a platform token is the main user retention mechanism. We implement a flexible tier system with weight coefficients and lottery for lower tiers.
contract LaunchpadStaking is ReentrancyGuard, Ownable {
IERC20 public immutable platformToken;
struct TierConfig {
string name; // "Bronze", "Silver", "Gold", "Diamond"
uint256 minStake; // minimum stake in platform token
uint256 weight; // weight in allocation distribution (basis points)
bool guaranteed; // guaranteed allocation or lottery
uint256 multiplier; // allocation multiplier (10000 = 1x)
}
TierConfig[] public tiers;
struct StakeInfo {
uint256 amount;
uint256 stakedAt;
uint256 lockUntil; // lock period before IDO snapshots
}
mapping(address => StakeInfo) public stakes;
uint256 public snapshotBlock; // block for snapshot before IDO
mapping(uint256 => mapping(address => uint256)) public snapshotStakes;
// snapshot tier for a specific IDO
function takeSnapshot(uint256 poolId) external onlyOwner {
// fix balances at snapshot block
// subsequent changes don't affect allocation for this 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;
}
}
For Tier 1/2 (low stake), we use lottery via Chainlink VRF. This ensures verifiable randomness without risk of manipulation.
contract AllocationLottery {
// Chainlink VRF for verifiable randomness
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 for 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 fair winner selection
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)));
}
// first `winners` addresses in the array are winners
emit LotteryCompleted(poolId, winners);
}
}
Multi-Chain Support
A modern white-label launchpad works across multiple networks. We deploy the same codebase on Ethereum, BNB Chain, Polygon, Arbitrum and Avalanche. The frontend switches network via wagmi, backend aggregates data via multicall.
// wagmi config for 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 Integration
Most jurisdictions require KYC. We integrate Sumsub or Synaps: the frontend queries status via API, admin can record verification on-chain.
// API endpoint for getting 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 });
});
Admin Panel and Monitoring
Operators need a management tool. We provide an admin panel with sections:
| Section | Functions |
|---|---|
| Pool management | Create/edit/close pools |
| Project KYC | Verify projects requesting IDO |
| Whitelist | Upload and manage whitelists |
| Allocation | Manual allocation adjustments |
| Tier config | Configure tiers and minimum stake |
| Analytics | Raised per pool, active users, conversions |
| Fee management | Configure platform fees |
Comparison of Pool Types
| Type | Mechanism | Risks | Use case |
|---|---|---|---|
| Fixed Price | Fixed price, queue | Low, everyone gets allocation | Simple IDOs |
| Dutch Auction | Price decreases over time | Medium, participants wait for better price | Price discovery |
| Overflow | Proportional distribution | Low, fair distribution | Popular projects |
Work Process and What's Included
- Analytics — meeting with engineers, discussing goals and requirements.
- Design — smart contract architecture and interaction schema.
- Development — contracts in Solidity 0.8.x, Foundry for testing and audit.
- Integration — frontend, admin panel, KYC and multi-chain.
- Testing — unit tests, integration tests and audit (Slither, Mythril).
- Deployment — contracts deployed to chosen networks, frontend hosted.
- Support — monitoring, bug fixes and updates.
Note that the work includes:
- Source code of smart contracts (Solidity)
- Deployment and administration documentation
- Access to repository with frontend and backend
- Operator team training (2 sessions)
- Technical support for 3 months
Audit Details
Contracts undergo audit using Slither, Mythril and formal verification. We also perform fuzzing with Echidna. Typical results: 0 critical vulnerabilities, 2-3 medium issues that are closed before deployment.
Contact us for a project estimate — we will prepare a proposal within 2 days. Request a consultation on your ICO launchpad architecture today.







