Skip to main content
A vesting schedule policy that manages token distribution over time with a 12-month cliff continuous release for the remaining 3 years. This is accomplished by enforcing a minimum balance on the wallet consistent with the unvested amount remaining.

Policy JSON

{
  "Policy": "Vesting Schedule",
  "Description": "4-year vesting schedule with 12-month cliff and monthly distribution",
  "PolicyType": "open",
  "CallingFunctions": [
    {
      "Name": "Transfer",
      "FunctionSignature": "transfer(address to, uint256 value)",
      "EncodedValues": "address to, uint256 value, uint256 senderBalance"
    },
    {
      "Name": "TransferFrom",
      "FunctionSignature": "transferFrom(address from, address to, uint256 value)",
      "EncodedValues": "address from, address to, uint256 value, uint256 senderBalance"
    }
  ],
  "ForeignCalls": [],
  "MappedTrackers": [
    {
      "Name": "VestAmount",
      "KeyType": "address",
      "ValueType": "uint256",
      "InitialKeys": [],
      "InitialValues": []
    },
    {
      "Name": "VestStart",
      "KeyType": "address",
      "ValueType": "uint256",
      "InitialKeys": [],
      "InitialValues": []
    }
  ],
  "Trackers": [],
  "Rules": [
    {
      "Name": "Enforce Vesting",
      "Description": "Ensure 12-month cliff has passed",
      "Condition": "(GV:BLOCK_TIMESTAMP - TR:VestStart(GV:MSG_SENDER) > 31536000) AND (senderBalance - value) > ((TR:VestStart(GV:MSG_SENDER) / 126144000) * ((TR:VestStart(GV:MSG_SENDER) + 126144000) - GV:BLOCK_TIMESTAMP))",
      "PositiveEffects": [],
      "NegativeEffects": ["revert(\"Still in cliff period\")"],
      "CallingFunction": "Transfer"
    },
    {
      "Name": "Enforce Vesting TransferFrom",
      "Description": "Ensure 12-month cliff has passed",
      "Condition": "(GV:BLOCK_TIMESTAMP - TR:VestStart(from) > 31536000) AND (senderBalance - value) > ((TR:VestStart(from) / 126144000) * ((TR:VestStart(from) + 126144000) - GV:BLOCK_TIMESTAMP))",
      "PositiveEffects": [],
      "NegativeEffects": ["revert(\"Still in cliff period\")"],
      "CallingFunction": "TransferFrom"
    }
  ]
}

How to Initialize Vesting

To set up vesting for an investor, you’ll need to initialize the mapped trackers:
Coming soon!

Vesting Schedule Breakdown

  • Year 1: 0% vested (cliff period)
  • Month 12: 25% becomes available (cliff release)
  • Months 13-48: Remaining 75% vests per second
  • Month 48: 100% fully vested

Time Constants

  • Cliff period: 31,536,000 seconds (12 months)
  • Total vesting period: 126,144,000 seconds (4 years)