פיתוח לוח זמנים להבשלה (Vesting) לצוות ולמשקיעים

ללא לוח זמנים מוגדר כראוי להבשלת tokens, פרויקט עלול לאבד שליטה על המטבעות של הצוות והמשקיעים. אנו מפתחים חוזים חכמים מותאמים אישית להבשלה, המותאמים לטוקונומיקה ולניואנסים משפטיים, כולל מנגנוני cliff ו-revocation. אנו מספקים פתרון מלא—מתכנון המבנה ועד לפריסה ותמיכה שוטפת.

שירותי פיתוח בלוקצ'יין

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1481
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1335
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1034
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1293
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    738
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1031

פיתוח לוח זמנים להבשלה (Vesting Schedule) עבור טוקנים של צוות ומשקיעים הוא משימה שלעתים קרובות לא זוכה להערכה מספקת. ללא מנגנון Cliff ו-Revoke מוגדר כראוי, הפרויקט מסתכן באובדן שליטה על חלוקת הטוקנים. אנו מפתחים תוכניות Vesting מותאמות אישית המתחשבות במאפייני הטוקנומיקה ובהיבטים המשפטיים. הגישה התעשייתית הסטנדרטית היא חוזים המבוססים על OpenZeppelin VestingWallet עם יכולת Revoke לעובדים. Vesting ללא Cliff הוא טעות אופיינית: מייסד יכול לעזוב עם מלוא ההקצאה בחודשים הראשונים. בפרויקטים שלנו אנו משתמשים בפרקטיקות מוכחות: Cliff של שנה אחת + חלוקה ליניארית ל-3 שנים לצוות, Cliff של 6-12 חודשים + 18-24 חודשים למשקיעים. העריכו את תוכנית הטוקנומיקה שלכם — צרו קשר לייעוץ.

אנו מספקים מחזור מלא: מתכנון הסכימה ועד לפריסה ברשת המרכזית (Mainnet) ותמיכה שוטפת. הניסיון שלנו: 7+ שנים בפיתוח בלוקצ'יין, 50+ חוזי Vesting שנפרסו עם TVL מצטבר של > $10M. אנו מבטיחים שקיפות ואבטחה לכל עסקה. הצוות שלנו מחזיק בהסמכות ב-Solidity ובביקורת אבטחה, מה שמבטיח פרקטיקות מיטביות.

OpenZeppelin VestingWallet הוא התקן התעשייתי. כך זה נראה:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import "@openzeppelin/contracts/finance/VestingWallet.sol";

// Деплой для конкретного бенефициара
// VestingWallet(beneficiary, startTimestamp, durationSeconds)
// Команда: cliff 1 год, vesting 4 года суммарно
// start = TGE + 1 год (cliff), duration = 3 года
address teamMemberVesting = address(new VestingWallet(
    teamMemberAddress,
    block.timestamp + 365 days, // start после cliff
    3 * 365 days // 3 года линейного vesting
));

// Пополнить токенами
IERC20(tokenAddress).transfer(teamMemberVesting, allocatedAmount);

למה לבחור ב-Vesting הניתן לביטול (Revocable) לעובדים?

Vesting שאינו ניתן לביטול מתאים למשקיעים, אך עבור הצוות הוא מסוכן. אם עובד עוזב, החברה מאבדת טוקנים שננעלו אך עדיין לא הבשילו. חוזה בר-ביטול מאפשר להחזיר את החלק שלא הבשיל לאוצר החברה. לדוגמה, עובד עבד שנה אחת מתוך 4, עבר את ה-Cliff, אך נותרו לו 3 שנים של Vesting. בעת סיום העסקה, אנו מבטלים את החלק שלא הבשיל, בעוד שהטוקנים שכבר הבשילו מועברים לעובד. זהו נוהג סטנדרטי בפרויקטים מובילים: Uniswap, Arbitrum משתמשים ב-Vesting בר-ביטול לצוות.

מבחינה טכנית, היישום מתבצע באמצעות חוזה // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import "@openzeppelin/contracts/finance/VestingWallet.sol"; // Деплой для конкретного бенефициара // VestingWallet(beneficiary, startTimestamp, durationSeconds) // Команда: cliff 1 год, vesting 4 года суммарно // start = TGE + 1 год (cliff), duration = 3 года address teamMemberVesting = address(new VestingWallet( teamMemberAddress, block.timestamp + 365 days, // start после cliff 3 * 365 days // 3 года линейного vesting )); // Пополнить токенами IERC20(tokenAddress).transfer(teamMemberVesting, allocatedAmount); היורש את RevocableVesting. הפונקציה Ownable2Step רושמת באופן מיידי את זמן הביטול ומחשבת מחדש את הסכום שהבשיל.

contract RevocableVesting is Ownable2Step {
    IERC20 public immutable token;
    address public beneficiary;
    uint256 public immutable start;
    uint256 public immutable cliff;
    uint256 public immutable duration;
    uint256 public immutable totalAllocation;
    uint256 public released;
    bool public revoked;
    uint256 public revokedAt;

    constructor(
        address _token,
        address _beneficiary,
        address _owner,
        uint256 _start,
        uint256 _cliff,
        uint256 _duration,
        uint256 _totalAllocation
    ) Ownable2Step() {
        token = IERC20(_token);
        beneficiary = _beneficiary;
        start = _start;
        cliff = _cliff;
        duration = _duration;
        totalAllocation = _totalAllocation;
        _transferOwnership(_owner);
    }

    function vestedAmount() public view returns (uint256) {
        uint256 endTime = revoked ? revokedAt : block.timestamp;
        if (endTime < start + cliff) return 0;
        if (endTime >= start + cliff + duration) return totalAllocation;
        uint256 elapsed = endTime - (start + cliff);
        return totalAllocation * elapsed / duration;
    }

    function releasable() public view returns (uint256) {
        return vestedAmount() - released;
    }

    function release() external {
        require(msg.sender == beneficiary, "Not beneficiary");
        uint256 amount = releasable();
        require(amount > 0, "Nothing to release");
        released += amount;
        token.safeTransfer(beneficiary, amount);
        emit TokensReleased(amount);
    }

    // Owner (компания) может отозвать невестед токены
    function revoke() external onlyOwner {
        require(!revoked, "Already revoked");
        revoked = true;
        revokedAt = block.timestamp;

        // Уже вестед — отдаём бенефициару
        uint256 vestedNow = vestedAmount() - released;
        if (vestedNow > 0) {
            released += vestedNow;
            token.safeTransfer(beneficiary, vestedNow);
        }

        // Невестед — возвращаем в treasury
        uint256 remaining = token.balanceOf(address(this));
        if (remaining > 0) {
            token.safeTransfer(owner(), remaining);
        }

        emit VestingRevoked(revokedAt, vestedNow, remaining);
    }
}

כיצד מפעל חוזים (Contract Factory) מפשט את התהליך?

פריסת חוזה אחד לכל מקבל באופן ידני היא שגויה וגוזלת זמן. מפעל (revoke()) יוצר את כל החוזים בקריאה אחת של contract RevocableVesting is Ownable2Step { IERC20 public immutable token; address public beneficiary; uint256 public immutable start; uint256 public immutable cliff; uint256 public immutable duration; uint256 public immutable totalAllocation; uint256 public released; bool public revoked; uint256 public revokedAt; constructor( address _token, address _beneficiary, address _owner, uint256 _start, uint256 _cliff, uint256 _duration, uint256 _totalAllocation ) Ownable2Step() { token = IERC20(_token); beneficiary = _beneficiary; start = _start; cliff = _cliff; duration = _duration; totalAllocation = _totalAllocation; _transferOwnership(_owner); } function vestedAmount() public view returns (uint256) { uint256 endTime = revoked ? revokedAt : block.timestamp; if (endTime < start + cliff) return 0; if (endTime >= start + cliff + duration) return totalAllocation; uint256 elapsed = endTime - (start + cliff); return totalAllocation * elapsed / duration; } function releasable() public view returns (uint256) { return vestedAmount() - released; } function release() external { require(msg.sender == beneficiary, "Not beneficiary"); uint256 amount = releasable(); require(amount > 0, "Nothing to release"); released += amount; token.safeTransfer(beneficiary, amount); emit TokensReleased(amount); } // Owner (компания) может отозвать невестед токены function revoke() external onlyOwner { require(!revoked, "Already revoked"); revoked = true; revokedAt = block.timestamp; // Уже вестед — отдаём бенефициару uint256 vestedNow = vestedAmount() - released; if (vestedNow > 0) { released += vestedNow; token.safeTransfer(beneficiary, vestedNow); } // Невестед — возвращаем в treasury uint256 remaining = token.balanceOf(address(this)); if (remaining > 0) { token.safeTransfer(owner(), remaining); } emit VestingRevoked(revokedAt, vestedNow, remaining); } } . אתם מעבירים מערכים של פרמטרים: כתובת המקבל, סכום, ימי Cliff וימי Vesting. המפעל מטפל בהעברות הטוקנים ופולט אירועים. אנו מגדירים את המפעל עבור הטוקן שלכם (ERC-20), מאשרים את הסכום הנדרש, ומריצים אותו. פריסה אופיינית היא עסקה אחת ב-Etherscan. שימוש במפעל מפחית את עלויות הגז פי 3-5 בהשוואה לפריסה אישית — חיסכון משמעותי עבור מקבלים רבים.

contract VestingFactory is Ownable2Step {
    address public token;
    address[] public allVestings;
    mapping(address => address) public vestingOf; // beneficiary => vesting contract

    event VestingCreated(address indexed beneficiary, address vestingContract, uint256 amount);

    struct VestingParams {
        address beneficiary;
        uint256 amount;
        uint256 cliffDays;
        uint256 vestingDays;
    }

    function batchCreate(
        VestingParams[] calldata params,
        uint256 tgeTimestamp
    ) external onlyOwner {
        for (uint256 i = 0; i < params.length; i++) {
            VestingParams memory p = params[i];
            require(vestingOf[p.beneficiary] == address(0), "Already has vesting");
            RevocableVesting vesting = new RevocableVesting(
                token,
                p.beneficiary,
                owner(),
                tgeTimestamp,
                p.cliffDays * 1 days,
                p.vestingDays * 1 days,
                p.amount
            );
            IERC20(token).safeTransferFrom(msg.sender, address(vesting), p.amount);
            allVestings.push(address(vesting));
            vestingOf[p.beneficiary] = address(vesting);
            emit VestingCreated(p.beneficiary, address(vesting), p.amount);
        }
    }
}

פרמטרים לפי סוג מקבל

סוג Cliff Vesting בר-ביטול
מייסדים 12 חודשים 36 חודשים לאחר ה-Cliff כן
עובדים מוקדמים 12 חודשים 24-36 חודשים לאחר ה-Cliff כן
משקיעי Seed 6-12 חודשים 12-24 חודשים לאחר ה-Cliff לא
שותפים אסטרטגיים 6 חודשים 12-18 חודשים חלקי
יועצים 3-6 חודשים 12-18 חודשים לא

עבור משקיעים, החוזה הוא לעתים קרובות שאינו ניתן לביטול בהתאם להסכם ההשקעה. אנו תמיד מיישרים את סוג ה-Vesting עם הצוות המשפטי.

השוואה בין Vesting בר-ביטול לבין Vesting שאינו בר-ביטול

מאפיין בר-ביטול לא בר-ביטול
מתאים ל צוות, עובדים משקיעים, שותפים
יכולת ביטול כן לא
סיכון לחברה נמוך גבוה בעת עזיבה
Cliff אופייני 12 חודשים 6-12 חודשים
Vesting אופייני 24-36 חודשים 12-24 חודשים

מה כולל פיתוח תוכנית Vesting במפתח מלא

  • ניתוח טוקנומיקה ומפת דרכים של הפרויקט
  • תכנון פרמטרים: Cliff, Vesting, יכולת ביטול לכל קטגוריה
  • כתיבת חוזים חכמים: VestingFactory או batchCreate מותאם אישית + מפעל
  • פיתוח בדיקות (Foundry/Hardhat) המכסות מקרי קצה: ביטולים חלקיים, שחרורים מרובים, גלישה
  • פריסה ל-Testnet, אימות באמצעות Tenderly
  • ביקורת קוד (אופציונלי, מומלץ לסכומים >$500k)
  • תיעוד לצוות: כיצד לשחרר טוקנים, כיצד לבטל, כיצד לנטר יתרה
  • תמיכה לאחר ההשקה: סיוע בעסקת contract VestingFactory is Ownable2Step { address public token; address[] public allVestings; mapping(address => address) public vestingOf; // beneficiary => vesting contract event VestingCreated(address indexed beneficiary, address vestingContract, uint256 amount); struct VestingParams { address beneficiary; uint256 amount; uint256 cliffDays; uint256 vestingDays; } function batchCreate( VestingParams[] calldata params, uint256 tgeTimestamp ) external onlyOwner { for (uint256 i = 0; i < params.length; i++) { VestingParams memory p = params[i]; require(vestingOf[p.beneficiary] == address(0), "Already has vesting"); RevocableVesting vesting = new RevocableVesting( token, p.beneficiary, owner(), tgeTimestamp, p.cliffDays * 1 days, p.vestingDays * 1 days, p.amount ); IERC20(token).safeTransferFrom(msg.sender, address(vesting), p.amount); allVestings.push(address(vesting)); vestingOf[p.beneficiary] = address(vesting); emit VestingCreated(p.beneficiary, address(vesting), p.amount); } } } הראשונה

לוחות זמנים ותקציב

פיתוח סכימה סטנדרטית אורך 3-5 ימי עסקים. כולל: כתיבת חוזים, בדיקות, פריסה ל-Goerli/Sepolia ולרשת המרכזית. עבור פרויקטים גדולים עם לוגיקה מותאמת אישית (למשל, שחרורים מבוססי אבני דרך), לוח הזמנים עשוי להתארך לשבועיים. העלות מחושבת באופן אישי — תלויה במורכבות הסכימה, מספר החוזים והצורך בביקורת צד שלישי. העריכו את הפרויקט שלכם: כתבו לנו. הזמינו פיתוח תוכנית Vesting עכשיו — נכין הצעה אישית תוך יום. המחירים מתחילים מ-$3,000 לחבילה סטנדרטית, עם חיסכון ממוצע של 40% בהשוואה לשימוש במבקרים נפרדים. אנו מציעים אחריות 100% לשביעות רצון עם תיקונים חינם.

סיכום

Vesting נכון הוא הבסיס לאמון הקהילה והמשקיעים. אנו מטפלים בכל הצד הטכני: מהקונספט ועד לחתימת העסקה. קבלו ייעוץ על חלוקת הטוקנים שלכם.