On 2 October 2026, DoubleZero’s one-year lock ended and about 1.655 billion 2Z tokens unlocked in a single day. That added about 47.7% to the tokens in the market, per DefiLlama data cited by CryptoTicker. Every number in that event was set months earlier, inside a token vesting smart contract.
The contract enforces whatever you decide. So the real work is choosing the start date, the cliff, the length and who can cancel a grant. One small setting can turn a smooth unlock into a single big sell day.
This guide covers the setup in the current OpenZeppelin release, a worked schedule with real numbers, Solana options, an audit checklist and build costs.
In this guide:
- OpenZeppelin Contracts 5.7.0 (29 July 2026) ships VestingWallet for linear unlocks and VestingWalletCliff for a cliff. Neither can be revoked.
- A cliff is not a delay. With a 4-year schedule and a 1-year cliff, 25% of the grant unlocks on the cliff date. Move the start date if you want no lump.
- Grants you can cancel suit staff and advisors. Investors who paid for tokens should get fixed terms.
- On Solana, Streamflow charges about 0.17 SOL per contract plus 0.19% of tokens (October 2026). Jupiter Lock is free and audited.
- Most vesting hacks hit setup and cancel paths, not the unlock math. DAO Maker lost about $4 million and Hedgey Finance about $44.7 million that way.
What Is a Token Vesting Smart Contract?
A token vesting smart contract holds tokens and releases them to a holder on a fixed schedule. Nobody has to trust the team’s word. Anyone can read the contract and see how many tokens are locked and when they unlock.
This is an old worry. A 2018 BitcoinTalk thread asked how to find an ICO’s vesting dates on Etherscan, and the reply noted that some teams only promised not to sell. A contract turns the promise into code.
Four terms come up in every schedule:
- TGE (token generation event): the day the token goes live. Most schedules count from here.
- Cliff: a period when nothing can be claimed.
- Linear vesting: tokens unlock bit by bit, often every second, until the end date.
- TGE unlock: a share released on day one, common for investors.
Common Vesting Schedule Types
| Schedule | How tokens unlock | Typical use | Contract support |
| Linear | A steady stream from start to end | Team, ecosystem funds | OpenZeppelin VestingWallet |
| Cliff then linear | Nothing until the cliff, then a stream | Founders, early staff | VestingWalletCliff, or a later start date |
| TGE unlock then linear | A share on day one, the rest streams | Seed and private rounds | Two transfers, or a custom contract |
| Monthly steps | Fixed chunks on set dates | Advisors | Custom contract or Sablier monthly tranches |
| Milestone | Releases when a goal is met | Grants, partners | Custom contract with an oracle or multisig |
| Timelock | Everything on one date | Treasury, liquidity | VestingWallet with duration 0 |
How to Set a Cliff and Linear Schedule With OpenZeppelin
OpenZeppelin is the default library for EVM vesting. The current release, OpenZeppelin Contracts 5.7.0, came out on 29 July 2026. Its finance folder holds two short contracts.
VestingWallet takes three values: the holder’s address, a start time and a duration, both in seconds. It holds ETH and any ERC-20 token. The vested amount follows one rule:
vested = total allocation x (now – start) / duration
Before the start nothing has vested, and after the end everything has. There is no TGE unlock setting, so send any day-one share directly. The holder calls `release(token)` to claim what has vested so far.
VestingWalletCliff, added in version 5.1, takes one more value: the cliff length in seconds, counted from the start. Until the cliff date, the vested amount reads as zero. Deployment fails if the cliff is longer than the duration.
Here is a minimal team vesting contract:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {VestingWallet} from "@openzeppelin/contracts/finance/VestingWallet.sol";
import {VestingWalletCliff} from "@openzeppelin/contracts/finance/VestingWalletCliff.sol";
contract TeamVesting is VestingWalletCliff {
constructor(address beneficiary, uint64 startTimestamp, uint64 durationSeconds, uint64 cliffSeconds)
VestingWallet(beneficiary, startTimestamp, durationSeconds)
VestingWalletCliff(cliffSeconds)
{}
}
Deploy one per holder, then send it the tokens. Now for the part most guides skip.
The Cliff Lump Trap
The cliff hides tokens. It does not pause the clock. Vesting still runs from the start date, so everything that built up during the cliff unlocks at once when it ends.
Take a 200 million token team grant with a 48-month duration and a 12-month cliff. On the cliff date, 12/48 of the grant, or 50 million tokens, becomes claimable in one block. That is the classic “1-year cliff, 4-year vest.” It is fine if you want it, but many teams do not realise they chose it.
For nothing in year one and a smooth stream after, skip the cliff contract. Use plain VestingWallet, set the start one year after TGE, and set the duration to 36 months. The total time is the same, with no lump.

Other OpenZeppelin Traps to Know
From the OpenZeppelin source notes and forum:
- Holders can sell the locked grant. VestingWallet uses Ownable, so the holder can transfer the whole wallet, locked tokens included. OpenZeppelin notes this is hard to block, as EIP-7702 (live since May 2025) lets normal wallets run code. To stop it, override `transferOwnership` and `renounceOwnership` to revert.
- Renouncing can strand tokens. Releases go to the owner, so a holder who renounces leaves the rest with nowhere to go.
- Late deposits vest at once. Tokens sent after the start count as if they were there from day one. Send 1 million halfway through and 500,000 are claimable at once. Fund each wallet before its start.
- Overloaded functions. `release()` and `release(address)` both exist. One OpenZeppelin forum thread shows tests failing with “release is not a function” until the full signature was used.
- Odd tokens break the math. Rebasing and fee-on-transfer tokens change balances, so plan for them.
- Months are not fixed. The contract counts seconds. Pick one rule, such as 30 days, and use it everywhere.
Worked Example: A Vesting Schedule for Team, Investors and Advisors
Let us put real numbers on a launch. A project has 1 billion tokens and a TGE on 1 December 2026 at 00:00 UTC (Unix time 1796083200). Three groups need vesting.
| Group | Tokens | TGE unlock | Cliff | Linear after cliff | Revocable? | Contract settings |
| Team | 200M (20%) | 0 | 12 months | 36 months | No (yes for staff) | VestingWallet, start 1827619200, duration 94,608,000 s |
| Seed investors | 150M (15%) | 10% (15M) | 6 months | 18 months | No | 15M sent at TGE; 135M in VestingWallet, start 1811808000, duration 47,260,800 s |
| Advisors | 30M (3%) | 0 | 6 months | 18 months | Yes | Revocable contract, same dates as investors |
The settings use 182 days for 6 months, 365 for 12, 547 for 18 and 1,095 for 36. Each cliff is a later start date, so no group gets a lump.
Here is what the three groups can claim over time, in millions of tokens:
| Month after TGE | Team | Investors | Advisors | Total unlocked | Share of supply |
| 0 | 0 | 15 | 0 | 15 | 1.5% |
| 6 | 0 | 15 | 0 | 15 | 1.5% |
| 12 | 0 | 60 | 10 | 70 | 7.0% |
| 18 | 33.3 | 105 | 20 | 158.3 | 15.8% |
| 24 | 66.7 | 150 | 30 | 246.7 | 24.7% |
| 36 | 133.3 | 150 | 30 | 313.3 | 31.3% |
| 48 | 200 | 150 | 30 | 380 | 38.0% |
The biggest single-day release is the 15 million at TGE. Every row can also be read from the contracts on-chain. Exchanges ask for exactly this table, as our guide on how to list a token explains.
With the cliff-style team grant instead, day 365 would add 50 million tokens, more than three times the TGE release.
A Reddit thread on tokenomics asked how to reward early users without heavy selling later. Vesting their rewards on the same smooth curve helps. The sale side is in our ICO presale guide.
Revocable vs Non-Revocable Vesting
A revocable grant lets an admin stop it early. The holder keeps what has vested, and the rest goes back to the treasury. A non-revocable grant cannot be touched by anyone.
OpenZeppelin’s VestingWallet has no admin and no cancel function. That is a strength for investors and a problem for staff who might leave.
So how do teams revoke? An OpenZeppelin feature request asks for one contract that holds many plans and has a manager who can revoke. It points to Maker’s dss-vest, where each plan has a start, a cliff and an optional manager who can “yank” it when a contributor leaves. On the hosted side, Sablier lets you mark a stream as cancelable.
| Question | Non-revocable | Revocable |
| Who it suits | Investors, public buyers, founders | Employees, advisors, contractors |
| What the holder trusts | Only the code | The code and the revoke key holder |
| Main risk | No way out if a holder leaves early | Abuse or theft of the revoke key |
| OpenZeppelin support | VestingWallet, VestingWalletCliff | None built in |
| Audit focus | Schedule math, funding | Revoke path, refunds, approvals, roles |
The rule most teams settle on: never make a purchased allocation revocable. Use revocable grants only for people paid in tokens for future work, and put the revoke key in a multisig with a timelock.
Milestone and Price-Based Unlocks
Some grants unlock when a goal is met, such as a mainnet launch. The code is easy. Proving the goal is hard. An oracle invites price games around the unlock, and a multisig sign-off brings back human trust. Use milestones for grants and partners. Keep investor terms tied to dates.
Token Vesting on Solana
Solana has no OpenZeppelin, so teams pick a ready program or build their own in Rust with Anchor.
| Option | What it is | Cost (October 2026) | Best for |
| Streamflow | Hosted vesting and lock app with an SDK | 0.16 SOL fee + about 0.0147 SOL network fee per contract, plus 0.19% of tokens | Fast setup, many holders, no code |
| Jupiter Lock | Free lock and vesting tool, audited by OtterSec and Sec3 | Free, plus network fees | Team and investor locks with a cliff |
| Bonfida token-vesting | Open-source Rust program with a 2021 security review | Your own deploy and running costs | Self-hosting; last updated June 2024 |
| Custom Anchor program | Your own vesting logic | Build and audit cost | Revocation, milestones, your own portal |
Streamflow’s 0.19% is added on top of the vested amount, not taken out of it, and its fee table changes, so check it on the day. For the token itself, see our Solana token development page.
Many Holders: Multi-Holder Contracts, Merkle Claims and the Claim Portal
VestingWallet means one contract per holder. That works for five founders, but not for 2,000 presale buyers, which is the exact complaint in the OpenZeppelin feature request.
Large groups use one of two designs:
- A multi-holder contract: one deployment stores a schedule per wallet, as dss-vest does.
- A Merkle claim: you publish one root hash of the full list. Each buyer proves their share with a short proof when they claim.
Either way, holders need a claim portal showing locked, vested and claimed amounts, the next unlock and a claim button, plus a link to the verified contract.
Not sure which design fits your groups? This tree sums up the choices.

Launch Vesting Your Investors Can Verify on Day One
Token Vesting Smart Contract Development — done right.
- Cliff and Linear Schedules: Team, investor and advisor grants set to the exact dates in your token paper.
- Revocable Grants: Manager roles, refunds and multisig control for staff and advisor allocations.
- Claim Portal: Locked, vested and claimed balances with one-click claims for every holder.
- EVM and Solana: Contracts on Ethereum, BNB Chain, Base, Solana and more, tested and audit-ready.
Get a free estimate for your vesting contracts and claim portal.
Book a Free Demo to map your cliff and linear schedules with our team.
Security Audit Checklist for a Token Vesting Smart Contract
The unlock math rarely breaks. Setup and cancel paths do. In September 2021, an attacker took about $4 million from DAO Maker’s vesting contracts because `init()` did not check who called it, per SlowMist’s analysis. In April 2024, Hedgey Finance lost about $44.7 million after its cancel function left a token approval live, Cointelegraph reported.

Run this list before mainnet, and hand it to your auditor:
- Setup: can `init`, schedule edits and funding run only once, and only from the right role?
- Roles: are admin, manager and revoke rights in a multisig with a timelock?
- Revoke path: does it pay out vested tokens, return the rest and clear every approval?
- Funding: is each schedule fully funded before its start? Does the total match the token paper?
- Math: test the cliff edge, the end date, a zero duration and rounding on small grants.
- Time: are all values in seconds, with one month rule?
- Token quirks: does the contract handle or refuse fee-on-transfer and rebasing tokens?
- Ownership and upgrades: can holders transfer or renounce, and who can upgrade the contract?
- Tests: fuzz vested amounts over random times, then rehearse the full launch on testnet.
- Re-audit: any change after the audit, even one line, goes back to the auditor.
Rules That Shape Your Vesting Schedule
Vesting is also a legal tool. This is not legal advice.
In the US, tokens sold in a private round are often treated as restricted securities. Under the SEC’s Rule 144 guide, these must be held for one year before public resale when the company does not file SEC reports. That is one reason so many investor locks run 12 months. The SEC also proposed “Regulation Crypto Assets” on 18 August 2026, with comments closing on 20 October 2026. It is still a proposal.
In the EU, MiCA requires a white paper for most public token offers, and you are liable for what it says. If the paper promises a 12-month lock, the contract must enforce one.
Cost and Timeline to Build a Token Vesting Smart Contract
A hosted tool or an OpenZeppelin VestingWallet per holder costs little beyond fees, gas and testing. A custom contract with a claim portal costs far more, but you own it.
Published 2026 cost guides put a token with vesting, staking, tax or governance logic at about $15,000 to $50,000 or more. An audit for simple to mid-level contracts adds about $5,000 to $70,000 and 1 to 4 weeks. Our guide to the cost to create a crypto token breaks down the full launch budget.
What moves the price:
- Rules: each extra group, schedule type or revoke path adds code, tests and audit scope.
- Holders: Merkle claims and multi-holder contracts cost more than a few wallets.
- Chains: each extra chain, or a mix of EVM and Solana, adds builds and audits.
- Portal and audit loop: dashboards add build time, and the retest after fixes often sets the end date.
On timing, our crypto token development page lists 3 to 5 weeks for a token with vesting, a claim page, the allocations and the audit. Coinsclone has been building since 2018 and has delivered 350+ platforms for 200+ clients across 20 industries.
How to Choose a Partner and What to Prepare Before a Scoping Call
A good partner asks hard questions about your schedule before writing code. Be wary of anyone who quotes a price without seeing your allocation table.
Bring these to the first call:
- Allocation table: each group’s share, TGE unlock, cliff, length and step size.
- TGE date, time zone and month rule.
- Revocation policy: who can be revoked, and who holds the key.
- Holder count per group, and whether buyers claim or receive tokens.
- Chain: EVM, Solana or both.
- Portal needs and multisig signers.
- Audit plan and timeline.
Then ask: which library and version do you use, how do you test the cliff edge, and can you show a verified vesting contract you shipped?
Frequently Asked Questions
What is token vesting in crypto?
Token vesting is a schedule that releases tokens to a holder over time instead of all at once. A smart contract usually enforces it, so the team cannot change the terms after launch. It keeps team, investor and advisor tokens from being sold all on day one.
How do I add a cliff to OpenZeppelin’s VestingWallet?
Since version 5.1, OpenZeppelin ships VestingWalletCliff, which adds a cliff length in seconds from the start. Nothing can be claimed before the cliff date. Tokens build up during the cliff, so a share unlocks at once when it ends. To avoid that lump, use plain VestingWallet with a later start date.
When does a token vesting period start?
There is no fixed rule. Most projects count from the TGE, but some start at the end of the sale or at a listing date. Whatever you pick, write it in the token paper and set the same timestamp in the contract.
Can a token vesting contract be cancelled or revoked?
Only if it was built to allow it. OpenZeppelin’s VestingWallet cannot be revoked by anyone. Maker’s dss-vest and cancelable Sablier streams let a manager stop a grant, pay out what has vested and return the rest.
How can I check a project’s vesting schedule on-chain?
Find the vesting contract address in the project’s docs and open it on a block explorer such as Etherscan. If the source is verified, read start, duration, cliff, released and releasable. If a team cannot point you to a contract, its tokens may not be locked at all.
How does token vesting work on Solana?
Solana teams use hosted tools like Streamflow and Jupiter Lock, an open program like Bonfida’s, or their own Anchor program. In October 2026, Streamflow charges about 0.17 SOL per contract plus 0.19% of tokens, and Jupiter Lock is free.
How much does a token vesting smart contract cost?
A hosted tool or a single OpenZeppelin VestingWallet costs little more than fees and gas. Published 2026 cost guides put a custom token with vesting logic at about $15,000 to $50,000 or more, plus about $5,000 to $70,000 for an audit. Holder count, revocation and the portal drive most of the gap.