Open-Cap-Format-OCF icon indicating copy to clipboard operation
Open-Cap-Format-OCF copied to clipboard

[Enhancement]: Add support for amending a vesting schedule

Open MattCantor opened this issue 1 year ago • 3 comments

Moved to Discussion #540


Description of Enhancement :

Support instituting a new vesting schedule after an equity issuance transaction has occurred.

Why is this Needed?

Sometimes vesting schedules are amended. When this happens, it's not always as straightforward as partially accelerating the award. Changes can be made to the frequency, cadence, and duration of the schedule as well.

Anything else we need to know?

Would this be considered a Change Event contemplated by PR #530, or would it need its own transaction type?

MattCantor avatar Nov 05 '24 03:11 MattCantor

I suppose one approach could be to create a transaction with the following fields: id, security_id, date, vesting_terms_id, and vestings.

If this transaction is present, then the vesting_terms_id, and vestings fields take precedence over the vesting_terms_id and vestings fields in the original equity compensation issuance transaction for the security_id, from and after the date.

MattCantor avatar Nov 05 '24 12:11 MattCantor

Alternatively, we could think about combining this functionality with the acceleration transaction.

As described in issue #538, a partial acceleration requires additional information in order to determine the vesting schedule for the remaining unvested amount.

In theory the acceleration could be achieved via a vesting schedule amendment, thereby combining what would otherwise be two different kinds of transactions into one.

One potential downside is that it could make a simple acceleration more complicated to describe. For instance, instead of simply designating the amount to be accelerated and how to apply it (e.g., prorata), you'd need to provide either vesting_terms_id or vestings that achieve the same result.

MattCantor avatar Nov 05 '24 12:11 MattCantor

Proposal from #540

Replace the TX_VESTING_ACCELERATION transaction with the following TX_VESTING_MODIFICATION transaction.

In addition:

  • create an Allotment_Type enum
  • create a VestingAcceleration type

Enum - Allotment Type

Proposed Implementation

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "https://schema.opencaptablecoalition.com/v/1.2.0/enums/AllotmentType.schema.json",
  "title": "Enum - Allotment Type",
  "description": "Enumeration of allotment types to use as a helper when accelerating a vesting schedule. `Ascending` applies the acceleration to the shares that would have vested first in time. `Descending` applies the acceleration to the shares that would have vested last in time. `Prorata` applies the acceleration pro rata across the remaining vesting installments",
  "type": "string",
  "enum": ["Ascending", "Descending", "Prorata"],
  "$comment": "Copyright © 2024 Open Cap Table Coalition (https://opencaptablecoalition.com) / Original File: https://github.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/tree/v1.2.0/schema/enums/AllotmentType.schema.json"
}

VestingAcceleration Type

Proposed Implementation

{
  "$schema": "https://json-schema.org/draft-07/schema",
  "$id": "https://schema.opencaptablecoalition.com/v/1.2.0/types/vesting/VestingAcceleration.schema.json",
  "title": "Type - Vesting Acceleration",
  "description": "Describes the terms of a vesting schedule modification that accelerates unvested shares.",
  "type": "object",
  "properties": {
    "id": {
      "description": "Reference identifier for this vesting acceleration",
      "type": "string",
      "minLength": 1
    },
    "quantity": {
      "description": "If provided, the number of shares vesting ahead of schedule. If none of `quantity` or `portion` are provided, then all of the remaining unvested shares are assumed to be accelerated.",
      "$ref": "https://schema.opencaptablecoalition.com/v/1.2.0/types/Numeric.schema.json"
    },
    "portion": {
      "description": "If provided, the fractional part of the _whole_ security that is vesting ahead of schedule, e.g. 25:100 for 25%. Use `quantity` for a fixed vesting amount. If none of `quantity` or `portion` are provided, then all of the remaining unvested shares are assumed to be accelerated.",
      "$ref": "https://schema.opencaptablecoalition.com/v/1.2.0/types/vesting/VestingConditionPortion.schema.json"
    },
    "allotment_type": {
      "description": "If provided, an allotment type to use as a helper when modifying a vesting schedule. If none of `quantity` or `portion` are provided, then all of the remaining unvested shares are assumed to be accelerated.",
      "$ref": "https://schema.opencaptablecoalition.com/v/1.2.0/enums/AllotmentType.schema.json",
    }
  }
}

TX_Vesting_Modification Transaction

Proposed Implementation

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "https://schema.opencaptablecoalition.com/v/1.2.0/objects/transactions/vesting/VestingModification.schema.json",
  "title": "Object - Vesting Modification Transaction",
  "description": "Object describing a modification of vesting terms, which may include a full or partial vesting of shares ahead of the schedule specified in security's vesting terms.",
  "type": "object",
  "allOf": [
    {
      "$ref": "https://schema.opencaptablecoalition.com/v/1.2.0/primitives/objects/Object.schema.json"
    },
    {
      "$ref": "https://schema.opencaptablecoalition.com/v/1.2.0/primitives/objects/transactions/Transaction.schema.json"
    },
    {
      "$ref": "https://schema.opencaptablecoalition.com/v/1.2.0/primitives/objects/transactions/SecurityTransaction.schema.json"
    }
  ],
  "properties": {
    "object_type": {
      "const": "TX_VESTING_MODIFICATION"
    },
    "reason_text": {
      "description": "Reason for the acceleration; unstructured text",
      "type": "string"
    },
    "id": {},
    "comments": {},
    "date": {},
    "security_id": {},
    "vestings": {
      "title": "Equity Compensation Issuance - Vestings Array",
      "description": "If provided, the list of exact vesting dates and amounts for this security. Takes precedence over `vesting_terms_id` and `allotment_type`. If none of `vesting_terms_id`, `vestings` or `allotment_type` are present, then the security is fully vested on issuance.",
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "https://schema.opencaptablecoalition.com/v/1.2.0/types/Vesting.schema.json"
      }
    },
    "vesting_terms_id": {
      "description": "If provided, the identifier of the VestingTerms to which this security is subject. Takes precedence over `allotment_type. If none of `vesting_terms_id`, `vestings` or `allotment_type` are present, then the security is fully vested on issuance.",
      "type": "string"
    },
    "vesting_acceleration": {
      "description": "If provided, describes the terms of a vesting schedule modification that accelerates unvested shares. If none of `vestings`, `vesting_terms_id` or `vesting_acceleration` are present, then the security is treated as fully vested as a result of this vesting schedule modification.",
      "$ref": "https://schema.opencaptablecoalition.com/v/1.2.0/types/vesting/VestingAcceleration.schema.json",
    }
  }
  "additionalProperties": false,
  "required": ["reason_text"],
  "$comment": "Copyright © 2024 Open Cap Table Coalition (https://opencaptablecoalition.com) / Original File: https://github.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/tree/v1.2.0/schema/objects/transactions/vesting/VestingModification.schema.json"
}

MattCantor avatar Jan 21 '25 22:01 MattCantor