Разработка 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 — фундамент доверия сообщества и инвесторов. Мы берём на себя всю техническую часть: от концепции до подписи транзакций. Получите консультацию по вашему токен-распределению.







