ארכיטקטורה טכנית של Launchpad במותג לבן
Launchpad במותג לבן אינו עותק של Polkastarter עם לוגו חדש. הצלחת הפלטפורמה תלויה בנזילות ובקהילה, לא בהעתקת קוד. אנו מפתחים פתרונות פרמטריים המאפשרים בידול באמצעות זרם העסקאות. המורכבות הטכנית טמונה בגמישות: החוזים תומכים במודלי בריכה שונים, מערכות דרגות ורב-רשתות ללא צורך בשכתוב קוד. פרויקטים רבים נתקלים בבעיות מדרגיות: הוספת סוג בריכה חדש דורשת פריסת חוזה נפרד, העברת נתונים ובדיקת אבטחה חוזרת. מפעל הבריכות שלנו פותר זאת באמצעות חוזה פרמטרי יחיד, ומפחית את זמן הפיתוח ב-50%.
במהלך הרקורד שלנו יישמנו יותר מ-10 Launchpad במותג לבן עבור פרויקטים מהאיחוד האירופי ומאסיה. הארכיטקטורה המודולרית מאפשרת השקת פלטפורמה תוך 6 שבועות, עם הוספת תכונות באופן אינקרמנטלי. החיסכון הממוצע בהשוואה לפיתוח פנימי הוא 40-60%. יתרה מכך, 95% מהלקוחות מציינים הפחתה של פי 2 בעלויות התמיכה הודות לפרמטריזציה.
לפי תיעוד OpenZeppelin, פרמטריזציה של חוזים מפחיתה את הסיכונים לשגיאות פריסה.
בעיות שאנו פותרים
פרמטריזציה במקום עותקים. העתקת קוד מ-Polkastarter או DAO Maker מובילה לבעיות אבטחה ומדרגיות. כל סוג בריכה חדש דורש פריסת גרסת חוזה חדשה והעברת נתונים. מפעל הבריכות שלנו יוצר סוגי בריכות שונים עם פרמטרים שונים באמצעות חוזה יחיד. זה מפחית את עלויות התמיכה ב-50% ומפשט את הבדיקה פי 2. הגישה הפרמטרית מהירה פי 2 מהעתקה בעת השקת מודלים חדשים.
מערכת דרגות עם הגרלה. עבור דרגות נמוכות, אי אפשר להבטיח הקצאה לכולם. אנו משתמשים ב-Chainlink VRF לאקראיות ניתנת לאימות — מה שמונע מניפולציות. ערבוב Fisher-Yates מבטיח בחירת זוכים הוגנת. גישה זו מבטיחה שגם דרגה 1 עם החזקה מינימלית יש לה סיכוי לקבל הקצאה, מה שמגביר את המעורבות ב-30%.
רב-רשתות ללא כפילות קוד. אנו פורסים את אותו קוד בסיס על Ethereum, BNB Chain, Polygon, Arbitrum ו-Avalanche. הפרונטאנד מחליף רשת באמצעות wagmi, והבקאנד מאגד נתונים באמצעות multicall. זה מפחית את זמן הפריסה פי 3 בהשוואה לפתרונות מפוצלים.
כיצד לפתח 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;
}
} מדוע פרמטריזציה של חוזים חשובה
ללא פרמטריזציה, כל שינוי בסוג בריכה או במערכת דרגות דורש פריסת גרסת חוזה חדשה והעברת נתונים. עם מפעל פרמטרי, המנהל מגדיר פרמטרי בריכה דרך פאנל ניהול ללא שינויי קוד. זה מפחית את עלויות הגז לפריסה ומפשט את בדיקת האבטחה. לפי הנתונים שלנו, פרמטריזציה מפחיתה את מספר נקודות התורפה הפוטנציאליות ב-60%.
מערכת דרגות עם טוקן פלטפורמה
החזקת טוקן פלטפורמה היא מנגנון השימור העיקרי של משתמשים. אנו מיישמים מערכת דרגות גמישה עם מקדמי משקל והגרלה לדרגות נמוכות.
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;
}
}עבור דרגות 1/2 (החזקה נמוכה), אנו משתמשים בהגרלה באמצעות 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);
}
} תמיכה רב-רשתית
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, והמנהל יכול לרשום אישור על השרשרת.
// 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 });
}); פאנל ניהול וניטור
מפעילים זקוקים לכלי ניהול. אנו מספקים פאנל ניהול עם סעיפים:
| סעיף | פונקציות |
|---|---|
| ניהול בריכות | יצירה/עריכה/סגירת בריכות |
| KYC לפרויקטים | אימות פרויקטים המבקשים IDO |
| רשימת לבן | העלאה וניהול רשימות לבן |
| הקצאה | התאמות הקצאה ידניות |
| הגדרת דרגות | הגדרת דרגות והחזקה מינימלית |
| אנליטיקה | גיוסים לפי בריכה, משתמשים פעילים, המרות |
| ניהול עמלות | הגדרת עמלות פלטפורמה |
השוואת סוגי בריכות
| סוג | מנגנון | סיכונים | מקרה שימוש |
|---|---|---|---|
| Fixed Price | מחיר קבוע, תור | נמוך, כולם מקבלים הקצאה | IDO פשוטים |
| Dutch Auction | המחיר יורד עם הזמן | בינוני, משתתפים ממתינים למחיר טוב יותר | גילוי מחיר |
| Overflow | חלוקה פרופורציונלית | נמוך, חלוקה הוגנת | פרויקטים פופולריים |
תהליך עבודה ומה כלול
- אנליטיקה — פגישה עם מהנדסים, דיון במטרות ודרישות.
- עיצוב — ארכיטקטורת חוזים חכמים וסכמת אינטראקציה.
- פיתוח — חוזים ב-Solidity 0.8.x, Foundry לבדיקות ובדיקת אבטחה.
- אינטגרציה — פרונטאנד, פאנל ניהול, KYC ורב-רשתות.
- בדיקות — בדיקות יחידה, בדיקות אינטגרציה ובדיקת אבטחה (Slither, Mythril).
- פריסה — חוזים נפרסים לרשתות שנבחרו, פרונטאנד מתארח.
- תמיכה — ניטור, תיקוני באגים ועדכונים.
שים לב שהעבודה כוללת:
- קוד מקור של חוזים חכמים (Solidity)
- תיעוד פריסה וניהול
- גישה למאגר עם פרונטאנד ובקאנד
- הדרכת צוות מפעילים (2 מפגשים)
- תמיכה טכנית למשך 3 חודשים
פרטי בדיקת אבטחה
החוזים עוברים בדיקת אבטחה באמצעות Slither, Mythril ואימות פורמלי. אנו גם מבצעים fuzzing עם Echidna. תוצאות אופייניות: 0 נקודות תורפה קריטיות, 2-3 בעיות בינוניות שנסגרות לפני הפריסה.
צור קשר להערכת פרויקט — נכין הצעה תוך יומיים. בקש ייעוץ על ארכיטקטורת ה-ICO launchpad שלך היום.







