Modules
/
Vesting

Vesting Module

This module allows multiple, isolated streams of tokens (Vesting Streams) to vest to an address (Beneficiary) over a set period of time (Vesting Period). All Vesting Streams within a Vesting Module share a Vesting Period, but each Vesting Stream may begin vesting or release tokens independently.

How It Works

  • Each Vesting Module has a payable address to which ETH and ERC20 tokens can be sent.

  • Tokens sent to the Vesting Module are held until a Vesting Stream is started. Vesting Streams are token-specific. Multiple Vesting Streams may exist simultaneously within the same Vesting Module.

  • Once a Vesting Stream has begun, tokens in that stream will vest linearly and all tokens will be 100% vested by the end of the Vesting Period. At any time, anyone may release the vested portion from the Vesting Module to the Beneficiary.

            EXTERNAL ACCOUNT/SMART CONTRACT
    
                           │
                           │ ETH/ERC20s
                           ▼
    Vesting Module────────────────────────────────┐
    │                      │                      │
    │          ┌───────────┘                      │
    │          ▼                                  │
    │     ┌─────────┐             ┌─────────┐     │
    │     │ Pending │────────────▶│ Vested  │     │
    │     └─────────┘             └─────────┘     │
    │     start vest                   │          │
    │                      ┌───────────┘          │
    │                      ▼  release vested      │
    └─────────────────────────────────────────────┘
                           │
    0xSplits───────────────┼──────────────────────┐
    │                      │                      │
    │                      ▼                      │
    │         ┌─────────────────────────┐         │
    │         │ Mutable Split Contract  │         │
    │         └─────────────────────────┘         │
    │                      │                      │
    │                  distribute                 │  ┌──────────┐
    │          ┌───────────┼───────────┐          │  │Controller│
    │          │           │           │          │  └──────────┘
    │  ┌ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ┐  │        ●
    │          ▼           ▼           ▼          │        │
    │  │  ┌─────────┐ ┌─────────┐ ┌─────────┐  │  │  Controller
    │     │Recipient│ │Recipient│ │Recipient│   ●─┼──can change
    │  │  └─────────┘ └─────────┘ └─────────┘  │  │  recipients
    │          │           │           │          │
    │  └ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ┘  │
    │          │           │           │          │
    └──────────┼───────────┼───────────┼──────────┘
               │           │           │
               ▼           ▼           ▼
    
            EOA/SC      EOA/SC      EOA/SC
    

Addresses

Mainnet Deployments

Ethereum - 1
Optimism – 10
Polygon – 137
Arbitrum – 42161

Testnet Deployments

Goerli - 5
Optimism Goerli – 420
Polygon Mumbai – 80001
Arbitrum Goerli – 421613

How To Use

  1. Navigate to an existing Split page and hit "New Vesting Module" within the Address section.
  2. A dialog will appear, and the Beneficiary's address is pre-filled with the Split you're viewing. Enter the Vesting Period (in days) and approve the transaction.
  3. Once the transaction has been confirmed, you'll see the Vesting Module listed on the Split page in the Address section under "Vesting Modules".
  4. Click on the Vesting Module and send tokens to it like you would a Split or any other payable address.
  5. Tokens received by the Vesting Module are held in a "Pending" state until a Vesting Stream has begun. Multiple deposits may occur before a Vesting Stream is started. Select the Vesting Streams to start, and hit "Start Vests".
  6. Once a Vesting Stream stream is active, select the tokens to release and click "Release Streams". Once the transaction is confirmed, the vested tokens will be sent to the Split.
  7. From here you can interact with the Split as you normally would. If you wish to distribute the released tokens, navigate to the Split page and select the balances to distribute. Or sit back and let the network handle this if a Distributor Fee has been set.

Notes

  • This module is immutable. Once it's been created, it cannot be changed.
  • This module is designed to be used in conjunction with a Mutable Split. Technically it works with an immutable Split, however, vesting tokens to an immutable Split is equivalent to sending all tokens at once.
  • Vesting Modules must be unique. Multiple Vesting Modules can point to the same Beneficiary, however, no two Vesting Modules can have identical Beneficiaries and Vesting Periods. You can always create a new Vesting Stream within the existing Vesting Module – it's unnecessary to duplicate an existing Vesting Module.

Code & Natspec

Github