Skip to content

Deploy Vesting

Distribute tokens on a linear schedule with an optional cliff. Useful for team allocations, advisor grants, or token unlocks.

Form fields

FieldNotes
TokenAddress of the token being vested
BeneficiaryWallet that can release()
StartUnix timestamp when vesting begins
Cliff (seconds)Time before any tokens are claimable
Duration (seconds)Total time over which all tokens vest linearly
Total amountTokens locked into the contract

Example schedule for a 6-month cliff + 24-month linear:

FieldValue
Startnow
Cliff15724800 (6 months in seconds)
Duration63072000 (24 months)

How releases work

The beneficiary calls release(token) on the vesting contract. The contract computes how many tokens have vested up to block.timestamp minus what's already been released, and transfers the difference.

Anyone can call release(token) — only the beneficiary receives the tokens. This means a relayer or the team can pay gas for the beneficiary.

Funding the contract

After deploy you must transfer the total amount of tokens to the vesting contract. The dApp prompts for this in a follow-up step.

bash
ERC20(vestingToken).transfer(vestingContract, totalAmount);

If the contract is underfunded, releases will partial-succeed up to the contract's balance.

Revoke

The factory has an optional revocable flag. If set:

  • the owner (deployer) can call revoke(token) to claw back unvested tokens.
  • anything already vested still belongs to the beneficiary.

If revocable = false the contract is immutable — once funded, only the beneficiary can withdraw.

For team / advisor grants, default to revocable = false so beneficiaries trust the schedule.

Released under the MIT License.