Розробка vesting-schedule для токенів команди та інвесторів — завдання, яке часто недооцінюють. Без правильно налаштованого cliff та механізму відкликання проєкт ризикує втратити контроль над розподілом токенів. Ми розробляємо кастомні vesting-схеми, враховуючи специфіку токеноміки та юридичні аспекти. Стандартний industrial-підхід — контракти на базі OpenZeppelin VestingWallet з можливістю відкликання (revoke) для співробітників. Vesting без cliff — типова помилка: засновник може піти з повною алокацією в перші ж місяці. У наших проєктах використовуємо перевірені практики: 1 рік cliff + 3 роки лінійного розподілу для команди, 6–12 міс cliff + 18–24 міс для інвесторів. Оцінимо ваш токеномічний план — зв'яжіться з нами для консультації.
Ми забезпечуємо повний цикл: від проектування схеми до деплою на мейннет і подальшої підтримки. Наш досвід — 7+ років у блокчейн-розробці, понад 50 розгорнутих vesting-контрактів для проєктів із сукупним TVL > $10M. Гарантуємо прозорість та безпеку кожної угоди.
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 для співробітників?
Невідкличний vesting підходить для інвесторів, але для команди він небезпечний. Якщо співробітник звільняється, компанія втрачає токени, які вже залочені, але ще не вестнулися. Revocable контракт дозволяє повернути нерозподілену частину в казну. Наприклад, співробітник відпрацював 1 рік із 4, у нього пройшов cliff, але залишилося 3 роки вестингу. При звільненні ми відкликаємо невестнуту частину, а вже залочені токени переходять співробітнику. Це стандартна практика в топ-проєктах: Uniswap, Arbitrum використовують revocable vesting для команди.
Технічно реалізація через RevocableVesting контракт, який успадковує Ownable2Step. Функція 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);
}
}
Як фабрика контрактів спрощує процес?
Вручну деплоїти по контракту на кожного отримувача — помилконебезпечно і довго. Фабрика (VestingFactory) створює всі контракти одним викликом batchCreate. Ви передаєте масив параметрів: адреса бенефіціара, сума, 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 | Revocable |
|---|---|---|---|
| Засновники | 12 міс | 36 міс після cliff | Так |
| Ранні співробітники | 12 міс | 24–36 міс після cliff | Так |
| Seed інвестори | 6–12 міс | 12–24 міс після cliff | Ні |
| Стратегічні партнери | 6 міс | 12–18 міс | Частково |
| Радники | 3–6 міс | 12–18 міс | Ні |
Для інвесторів контракт нерідко невідкличний — це умова інвестиційної угоди. Ми завжди узгоджуємо тип vesting з юридичною командою.
Порівняння revocable та non-revocable vesting
| Характеристика | Revocable | Non-revocable |
|---|---|---|
| Підходить для | Команда, співробітники | Інвестори, партнери |
| Можливість відкликання | Так | Ні |
| Ризик для компанії | Низький | Високий при звільненні |
| Типовий термін cliff | 12 міс | 6–12 міс |
| Типовий vesting | 24–36 міс | 12–24 міс |
Що входить в розробку vesting-схеми під ключ
- Аналіз токеноміки та дорожньої карти проєкту
- Проектування параметрів: cliff, vesting, revocability для кожної категорії
- Написання смарт-контрактів:
VestingWalletабо кастомнийRevocableVesting+ фабрика - Розробка тестів (Foundry/Hardhat) з покриттям edge-кейсів: часткові відкликання, кілька релізів, переповнення
- Деплой на тестову мережу, перевірка через Tenderly
- Аудит коду (опціонально, рекомендується для сум >$500k)
- Документація для команди: як релізити токени, як відкликати, як стежити за балансом
- Підтримка після запуску: допомога в першій транзакції
release
Терміни та бюджет
Розробка стандартної схеми займає 3–5 робочих днів. Включає: написання контрактів, тести, деплой на Goerli/Sepolia та мейннет. Для великих проєктів з кастомною логікою (наприклад, клаузи на досягнення віх) термін може розширитися до 2 тижнів. Вартість розраховується індивідуально — залежить від складності схем, кількості контрактів та необхідності стороннього аудиту. Оцініть ваш проєкт: напишіть нам. Замовте розробку vesting-схеми зараз — ми підготуємо індивідуальну пропозицію протягом дня.
Висновок
Правильний vesting — фундамент довіри спільноти та інвесторів. Ми беремо на себе всю технічну частину: від концепції до підпису транзакцій. Отримайте консультацію щодо вашого токен-розподілу.







