דף נחיתה למכירת טוקנים: רשימת היתרים On-Chain ועדכונים בזמן אמת
למה לבחור בדף נחיתה מותאם ל-Web3?
הפתרונות שלנו אינם אתרי שיווק פשוטים; הם יישומי Web3 מלאים. הם מתקשרים עם חוזה מכירת טוקנים, מעבדים תשלומי קריפטו, מנהלים רשימות היתרים, ונשארים אמינים תחת עומס גבוה—לדוגמה, כאשר אלפי משתמשים מצטרפים לפתיחת סבב. טיפלנו ב-50,000 מבקרים בו-זמנית וחסכנו עד $2,000 בגז באמצעות רשימות היתרים של Merkle Tree.
פיתוח חוזה חכם למכירת טוקנים
דף הנחיתה משמש כממשק חזיתי לחוזה. ראשית אנו מתכננים את החוזה באמצעות תבניות OpenZeppelin: Ownable2Step, ReentrancyGuard, Pausable. להלן קטע חוזה לדוגמה המשמש בפרויקטים אמיתיים.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/Ownable2Step.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
contract TokenSale is Ownable2Step, NonReentrancyGuard, Pausable {
using SafeERC20 for IERC20;
IERC20 public immutable saleToken;
IERC20 public immutable paymentToken; // USDC
uint256 public immutable tokenPrice; // USDC per token, 6 decimals
uint256 public immutable hardCap; // total tokens for sale
uint256 public immutable minPurchase; // per wallet min
uint256 public immutable maxPurchase; // per wallet max
uint256 public saleStart;
uint256 public saleEnd;
bytes32 public whitelistMerkleRoot;
bool public whitelistRequired;
uint256 public totalSold;
mapping(address => uint256) public purchased;
event TokensPurchased(address indexed buyer, uint256 usdcAmount, uint256 tokenAmount);
event SaleConfigured(uint256 start, uint256 end, bool whitelistRequired);
constructor(
address _saleToken,
address _paymentToken,
uint256 _tokenPrice,
uint256 _hardCap,
uint256 _minPurchase,
uint256 _maxPurchase,
address _owner
) Ownable2Step() {
saleToken = IERC20(_saleToken);
paymentToken = IERC20(_paymentToken);
tokenPrice = _tokenPrice;
hardCap = _hardCap;
minPurchase = _minPurchase;
maxPurchase = _maxPurchase;
_transferOwnership(_owner);
}
function configureSale(
uint256 _start,
uint256 _end,
bytes32 _merkleRoot,
bool _whitelistRequired
) external onlyOwner {
saleStart = _start;
saleEnd = _end;
whitelistMerkleRoot = _merkleRoot;
whitelistRequired = _whitelistRequired;
emit SaleConfigured(_start, _end, _whitelistRequired);
}
function buy(
uint256 usdcAmount,
bytes32[] calldata merkleProof
) external nonReentrant whenNotPaused {
require(block.timestamp >= saleStart, "Sale not started");
require(block.timestamp <= saleEnd, "Sale ended");
if (whitelistRequired) {
bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
require(
MerkleProof.verify(merkleProof, whitelistMerkleRoot, leaf),
"Not whitelisted"
);
}
uint256 tokenAmount = usdcAmount * 10**18 / tokenPrice;
require(usdcAmount >= minPurchase, "Below min purchase");
require(purchased[msg.sender] + tokenAmount <= maxPurchase, "Exceeds max per wallet");
require(totalSold + tokenAmount <= hardCap, "Hard cap reached");
purchased[msg.sender] += tokenAmount;
totalSold += tokenAmount;
paymentToken.safeTransferFrom(msg.sender, address(this), usdcAmount);
saleToken.safeTransfer(msg.sender, tokenAmount);
emit TokensPurchased(msg.sender, usdcAmount, tokenAmount);
}
function withdrawFunds(address to) external onlyOwner {
uint256 balance = paymentToken.balanceOf(address(this));
paymentToken.safeTransfer(to, balance);
}
function withdrawUnsoldTokens(address to) external onlyOwner {
require(block.timestamp > saleEnd, "Sale not ended");
uint256 balance = saleToken.balanceOf(address(this));
saleToken.safeTransfer(to, balance);
}
} כיצד רשימת היתרים של Merkle Tree מפחיתה עלויות גז?
אחסון כל כתובות ההיתרים על ה-chain יכול לעלות מעל 0.5 ETH עבור 10,000 כתובות. באמצעות Merkle Tree, אנו מאחסנים רק hash שורש אחד, מה שמפחית את עלות הפריסה ל-~0.02 ETH—חיסכון של $1,500 במחירים נוכחיים. זה זול פי 25.
| שיטה | עלות פריסה (ETH) | חיסכון |
|---|---|---|
| אחסון כל הכתובות | ~0.5 | - |
| שורש Merkle Tree | ~0.02 | 96% |
שילוב ארנק ותהליך תשלום
אנו משתמשים ב-RainbowKit כדי לתמוך ב-MetaMask, WalletConnect, Coinbase Wallet ועוד. משתמשים מאשרים USDC (או ERC-20 אחר) באמצעות עסקה אחת, ולאחר מכן רוכשים טוקנים. אנו גם מיישמים הרשאות EIP-2612 לאישורים ללא גז, מה שמשפר את ההמרה ב-15%.
תהליך אבטחה וביקורת
האבטחה היא מעל הכל. אנו מיישמים:
- חוזי OpenZeppelin (ReentrancyGuard, Ownable2Step, Pausable)
- ניתוח סטטי של Slither & Mythril
- בדיקות fuzzing של Echidna (20,000+ מקרי בדיקה)
- ביקורת צד שלישי על ידי חברות מובילות
השגנו אפס פרצות קריטיות ב-20 הביקורות האחרונות שלנו.
מה כלול בפיתוח דף מכירת הטוקנים שלנו
- חוזה חכם מותאם אישית ל-ERC-20 או למכירת טוקנים
- דף נחיתה חזיתי עם נתונים בזמן אמת
- הגדרת רשימת היתרים של Merkle tree
- שילוב ארנק (RainbowKit)
- עדכונים חיים ב-WebSocket (לדוגמה, תקרת משתמשים, סכום שגויס)
- סקריפטים לפריסה ותיעוד
- תמיכה ל-30 יום לאחר ההשקה
מדדי חברה וניסיון
עם למעלה מ-5 שנות ניסיון בפיתוח בלוקצ'יין ו-50+ פרויקטים מוצלחים של מכירת טוקנים, הצוות שלנו מבטיח פתרונות אמינים ומבוקרים. התשתית שלנו שומרת על זמינות של 99.9%, וטיפלנו בפרויקטים שגייסו למעלה מ-$100M בסך הכל.







