Proposals Regarding Vesting Lifecycle #540
Replies: 6 comments 5 replies
-
Per the TWG discussion today - chiming in with some scenarios where we've seen amendments to vesting schedules taking place:
Regarding the latter scenario, one thing that comes to mind is whether capturing events in which options that will never vest could be "returned" to the available option count (for lack of a better description) is something we would want OCF to account for? e.g. Conditional/milestone-based vesting where the condition has failed to be met. |
Beta Was this translation helpful? Give feedback.
-
Next steps from 2024-11-07 Technical Working Group Meeting
|
Beta Was this translation helpful? Give feedback.
-
Two additional thoughts: Tie-breaks for EARLIER_OF relationships. I was a bit hasty to say we should entirely abandon the priority of vesting conditions in the Priority of |
Beta Was this translation helpful? Give feedback.
-
@MattCantor Still digesting after a few reads :) but it is making sense to me. I am currently thinking about this in three layers.
You have presented several use cases for vesting in your discussion:
Is this list an accurate read-back of your discussion? If so, do these use cases capture the "common real world" entirely and do we need all of them to capture the "common real world"?
Does this list capture them all and which ones of them are dependent on others? (i.e. which are alternatives and which are dependencies?) |
Beta Was this translation helpful? Give feedback.
-
An implementation of the vesting model with the EARLIER_OF and LATER_OF relationships is available in this branch of the OCF-Tools repository |
Beta Was this translation helpful? Give feedback.
-
The proposals in this discussion have been included in issues #542, #539, and #514. |
Beta Was this translation helpful? Give feedback.
-
This document provides a deep dive into the vesting model (v.1.2.0).
We begin with an inventory of the files, transactions, objects, types, and enums that are included in the vesting model.
Then we analyze the vesting model and attempt to articulate the assumptions on which it is based and describe certain of its characteristics.
Finally we consolidate various proposals to modify the schema as it pertains to the vesting model.
The first proposal represents a significant change to the workings of the model. So it should be read as a "softer" proposal than the ones that follow.
My hope is that even if we do not adopt the first proposal, others may benefit from the deep dive regardless and that certain sections may serve as the basis for additional documentation.
Inventory
The following files, transactions, objects, types, and enums are included in the vesting model (v.1.2.0):
Files
OCF_TRANSACTIONS_FILE
OCF_VESTING_TERMS_FILE
Transactions
TX_EQUITY_COMPENSATION_ISSUANCE
TX_STOCK_ISSUANCE
TX_EQUITY_COMPENSATION_ACCEPTANCE
TX_VESTING_START
TX_VESTING_EVENT
TX_VESTING_ACCELERATION
TX_EQUITY_COMPENSATION_CANCELLATION
Objects
VestingTerms
Types
Vesting
VestingCondition
VestingConditionPortion
VestingEventTrigger
VestingPeriodInDays
VestingPeriodInMonths
VestingScheduleAbsoluteTrigger
VestingScheduleRelativeTrigger
VestingStartTrigger
Enums
AllocationType
CompensationType
OptionType
VestingDayOfMonth
VestingTriggerType
Design Overview
Vesting Terms
The vesting model is intended to support arbitrarily-complex trees of dependent vesting conditions that can mix time-based and event-based vesting.
Vesting information is stored in
VestingTerms
objects, each of which expresses the vesting terms for an equity award as a graph ofVestingCondition
s.Each
VestingCondition
(node) in the graph specifies theVestingTrigger
(edge) for entering that condition, upon which someVestingConditionPortion
orquantity
of the associated equity award vests.Each
VestingCondition
also then lists all possible subsequent conditions in thenext_condition_ids
field. An empty array in thenext_condition_ids
field indicates a terminal node in the graph and the end of vesting.A
TX_EQUITY_COMPENSATION_ISSUANCE
transaction is associated with aVestingTerms
object via the transaction'svesting_terms_id
.VestingTerms
objects are generally more verbose thanTX_EQUITY_COMPENSATION_ISSUANCE
transactions. Therefore, we prioritize the re-use ofVestingTerms
objects where possible, even if this requires more transactions to be recorded.Vesting Triggers
There are four types of
VestingTrigger
s:VestingStartTrigger. Describes the vesting condition that sets a vesting schedule in motion, via the recording of a transaction.
VestingCondition
in aVestingTerms
object to facilitate re-use of theVestingTerms
object for multiple equity awards. For instance, an array of vesting conditions that describes a 4-year monthly vesting schedule can be used for multiple awards if the vesting start date is triggered "from the outside" via recording a transaction.VestingEventTrigger. Describes a vesting condition satisfied when a particular unscheduled event occurs. Functionally equivalent to the
VestingStartTrigger
, but semantically implies unscheduled event-based vesting, such as the achievement of a performance goal.VestingScheduleRelativeTrigger. Describes a vesting condition satisfied when another vesting condition is satisfied, or when a period of time has elapsed since that vesting condition was satisfied. See further discussion below.
VestingScheduleAbsoluteTrigger. Describes a vesting condition satisfied on an absolute date. This type of trigger does not require a transaction to be recorded. Instead this trigger is satisfied implicitly via the passage of time.
VestingScheduleAbsoluteTrigger
is used as the initialVestingCondition
in aVestingTerms
object, then the vesting schedule would be set in motion implicitly via the passage of time, rather than requiring a separate transaction to be recorded. However, theVestingTerms
object would not be reusable for an equity award with a different vesting start date.Assumptions
The discussion that follows is based on the following assumptions:
Each graph of
VestingConditions
is required to be directed and acyclic. Below we discuss whether we permit multiple root nodes, and whether branches are allowed to converge.A vesting condition is considered to be within the execution path of the vesting graph if and only if that vesting condition's trigger has been satisfied.
The vesting conditions in a
next_condition_ids
array are evaluated in the order in which they appear in the array, and the execution path will follow only one of the vesting conditions in the array. If a vesting condition's trigger is satisfied, any subsequent vesting conditions in the array will not be analyzed. See example two here.Vesting schedules are ultimately ordered chronologically, with a monotonic progress of time.
Validation and Pathfinding
We further assume that that we will require two traversals in order to create the vesting graph and then determine the execution path through it.
First Traversal
The first traversal will create the vesting graph and validate that it is directed and acyclic. This traversal should be uncoupled with business logic, as it pertains solely to the structure of the vesting graph.
Second Traversal
The second traversal determines determines which nodes are included in the execution path as a result of their triggers having been satisfied, whether as a result of a transaction being recorded or implicitly via the passage of time.
Creating a Vesting Schedule
When vesting condition is included in the execution path as a result its trigger having been satisfied, a vesting installment is created, consisting of an amount of shares that vest as of a specific date.
The vesting schedule of a security is the collection of all vesting installments that have been created.
Creating a Vesting Schedule Via Vesting Conditions
The approach described above constructs the vesting graph from vesting conditions, with the vesting triggers acting as rules for determining how vesting installments should be created.
Normal Case
When utilizing this approach, the vesting date of each vesting installment is determined based on the vesting trigger that was utilized:
VestingStartTrigger
, the vesting date is the date of theTX_VESTING_START
transaction,VestingEventTrigger
, the vesting date is the date of theTX_VESTING_EVENT
transaction,VestingScheduleAbsoluteTrigger
, the vesting date is date provided in thedate
field of the trigger object.The amount of vested shares is determined from the
portion
orquantity
field of the applicable vesting condition.Special Case - Vesting Schedule Relative Trigger
Overview
The
VestingScheduleRelativeTrigger
is a special case which signifies a vesting condition that is not triggered by the recording of a transaction or implicitly via the passage of time.Instead, this trigger is utilized when the vesting date is intended to be determined relative to another vesting condition in the execution path.
It may also be utilized to create a collection of vesting installments under the hood, which would be onerous to create by hand and would likely not be re-usable for other securities.
Utilization
The trigger's
relative_to_condition_id
field indicates the "earlier" vesting condition that is being "referred back to".The trigger must include one of two types of
period
objects - one of which designates a monthly cadence, and the other of which designates a daily cadence.Each
period
object includes fields fortype
,length
andoccurrences
. Aday_of_month
field is also included to determine the vesting dates, in the case of a monthly- or yearly-based periodic vesting schedule.The
length
field designates the duration of the monthly or daily cadence, in the form of an integer which may be zero. Theoccurrences
field designates the quantity of installments to be created under the hood, in the form of an integer one or greater.A
length
of zero would indicate a vesting condition with the same vesting date as the "related" vesting condition referenced in therelative_to_condition_id
field.When
length
andoccurrences
are both greater than one, a periodic vesting schedule is created under the hood.Since the duration of the monthly or daily cadence is designated by the
length
field and does not change, this creates a periodic vesting schedule with an equal number of shares vesting in each installment, other that to the extent required to take into account rounding of partial shares as indicated by theallocation_type
field in theVestingTerms
object.For example, the following
period
object would produce a 4-year monthly vesting schedule with equal amounts vesting in each installment, other than to the extent required to take into account rounding:If the vesting condition referred to in the
relative_to_condition_id
field is not in the execution graph, then no vesting installments should be created under the hood. See the Two Tier Vesting example below.Below we discuss methods for implementing a cliff vesting date with this sort of periodic time-based vesting.
Creating a Vesting Schedule Imperatively
The model alternatively supports creating a vesting schedule imperatively, by providing an array of objects each consisting of an amount of shares vesting and a specific vesting date. Each of these objects is referred to in the schema as a
Vesting
.REQUIRED
REQUIRED
Examples
Event Based Vesting with Expiration
This example shows event based vesting with an expiration date.
The event condition and the expiration condition are siblings nodes in the vesting graph, and they are processed in the second traversal based on their order in the
next_condition_ids
array of the vesting start condition.As noted above, the execution path may only follow one sibling node. In this way the sibling nodes behave as mutually exclusive nodes in an XOR relationship.
The ordering of the conditions in the
next_condition_ids
is crucial. Since the expiration condition is a leaf node with 0 shares vesting, if its condition is satisfied then the execution path will terminate at that node.The only way for any shares to vest in this example is for the expiration trigger to not be satisfied, so that the event condition can be triggered. Any
TX_VESTING_EVENT
transaction recorded after the expiration condition has been triggered will be ignored.Two Independent Events With Expiration Dates
Consider a security with two independent event-based vesting conditions, and each event has its own expiration date. For instance, 1/4 of the shares vest whenever event A is achieved, and the remaining 3/4 of the shares vest whenever event B is achieved.
A vesting installment should be created whenever the trigger for condition A or condition B is satisfied, and each is independent of the other. Both should be allowed to enter the execution path, even if they occur on different dates.
The way to approach this is to define all possible permutations and then ensure there is a branch that addresses each. In other words,
in this scenario we are forced into an imperative paradigm.
For this example, we'll assume the expiration date for event A is before the expiration date for event B.
At first glance it may appear that there are 8 permutations:
However, we know that A cannot occur or expire after B has expired.
Therefore there are only 7 permutations:
This requires care to set up correctly, and a lot of nodes.
One may suggest that these two vesting conditions could in principal be separated into separate securities. But it would be unfortunate if we had to impose this real world constraint.
Interdependent Events with Expiration Dates
Consider the same security as above, except that vesting only occurs once the outcome of both events has been resolved. 1/4 of the shares will vest if event A is achieved, and the remaining 3/4 of the shares will vest if event B is achieved.
But vesting will not occur until it is known whether both events have been achieved or will expire, and we don't know which of event A or B will occur first.
This example utilizes the same vesting graph as the example above, except that we must ensure that the proper number of shares vest in the terminal node of each branch.
Periodic Vesting with a Cliff
A periodic vesting schedule with a cliff is created with:
VestingScheduleRelativeTrigger
that refers back to the vesting start condition, andVestingScheduleRelativeTrigger
that refers back to the cliff condition.See example here.
The periodic vesting condition is displayed in the graph below as a stack in order to convey that it utilizes the
period
object to create a collection of vesting installments.The blue arrows in the graph below only indicate the vesting condition's
relative_to_condition_id
, and do not constitute cycles in the vesting graph.Presumably we also enforce a constraint that the vesting condition referenced in
relative_to_condition_id
must be in the execution path?Both the cliff and the periodic vesting condition utilize the
allocation_type
from theVestingTerms
object that contains this array of vesting conditions.However, this runs into a problem with certain allocation types, as discussed in OCF Issue #514.
Consider a grant of 125 options that is intended to vest over 10 periodic installments, with an allocation type of
CUMULATIVE_ROUND_DOWN
and a cliff at the 5th installment.How does the periodic vesting condition that follows the cliff know that there a cumulative remainder of 0.5 shares after the cliff installment?
We propose a way to handle this below.
Two Tier Vesting
Consider a security with time-based vesting schedule where an event serves as the vesting commencement date, and the event may expire before it occurs.
This is straight forward to implement under the vesting model.
Now instead consider a security where the event is a vesting condition, but the periodic vesting refers back to the start date.
This is an example of "two-tier" vesting, which is a common approach for private company restricted stock units.
Overview of Two Tier Resting
A two-tier RSU vests based on two requirements: a time-based requirement and an event-based requirement, both of which must be achieved in order for the shares to vest.
The event-based requirement is typically a "liquidity event", meaning a change in control or IPO. The event-based requirement typically has an expiration date, after which it can no longer be achieved (typically 7 years from the grant date).
If the liquidity event is achieved before the end of the time-based vesting schedule, then the RSU vests at the time of the liquidity event to the extent that the time-based vesting requirement has been satisfied. The RSU then continues to vest after the liquidity event in accordance with the remainder of the time-based vesting schedule.
If the liquidity event is achieved after the end of the time-based vesting schedule, then the RSU vests in full upon th eachievement of the liquidity event.
If the liquidity event is not achieved, then the RSU never vests.
The Liquidity Event Behaves as a Cliff
The liquidity event conceptually behaves as a cliff, because the periodic vesting does not start until the later of the liquidity event and the vesting start date of the periodic vesting schedule. Except unlike a standard cliff, it is based on an unscheduled event, rather than on a certain vesting installment or date.
Note that if the time-based vesting schedule has its own cliff, then the RSU first vests at the later of the liquidity event and the cliff installment.
Vesting Graph
This utilizes the same vesting graph as described above, except that the periodic vesting schedule refers back to the vesting start condition,
rather than to the event condition.
Recall that in the case of time-based vesting with a
VestingScheduleRelativeTrigger
, theperiod
object creates a collection of vesting installments under the hood.How would we ensure that that the liquidity event behaves as a cliff for the periodic vesting schedule?
Perhaps it would be reasonable to introduce additional business logic such that:
the vesting date cannot be earlier than the date of any ancestor node in the execution path, and
This would have the effect treating the event condition as a cliff for the periodic vesting condition that follows.
Observations regarding sibling nodes
The vesting model assumes all siblings are EARLIER_OF
As shown above, the vesting model forces all sibling nodes into an XOR relationship,
by way of the assumption that sibling nodes will be evaluated in the order in which they appear in the parent node's
next_condition_ids
array, and the execution path will only follow the vesting condition that occurs first in time.This has the effect of creating an EARLIER_OF relationship between sibling nodes.
Creating AND relationships is complex
Since sibling nodes are in an EARLIER_OF relationship, creating an AND relationship requires care and familiarity with the workings of the model, because each possible permutation of the events must be enumerated explicitly.
AND relationships are synonymous with LATER_OF
We may also observe that in the case of a security that vests based on a requirement that more than one vesting condition occurs,
the vesting installment cannot be created until the "later of" the dates that the vesting conditions are achieved.
Likewise, in the case of a security that vests based on the later of two vesting conditions, each vesting condition must "wait and see" what happens with the other.
Therefore LATER_OF vesting behaves as an AND logical relationship.
The amount that vests may be determined by various methods
The LATER_OF distinction implies a focus on the date of the vesting installment. But what about the the amount that vests?
In most cases of an AND relationship, either:
the amount that vests is determined by aggregating the amounts from the sibling nodes, or
one of the sibling nodes operates only with respect to the date dimension and does not contribute to the amount vested.
Interdependent events is an example of the former.
As shown in the Independent Events With Expiration Dates example above, we aggregated the amounts in the terminal node of the execution path. But other methods are common, such as determining the amount that vests based on the greater of, lesser of, average, or other methodology.
Two-tier vesting is an example of the latter. The liquidity event condition acts as a cliff (delays the ultimate vesting date), but does not influence the quantity of shares that vest.
Independent events are forced to be modeled as AND relationships
Given that the vesting model forces all sibling nodes into an XOR relationship, independent events must be modeled as an AND relationship, with the permutations of the two independent events enumerated explicitly, as shown above.
We discuss proposals to address these observations below.
Vesting Schedule Generator
Before moving on to the proposals, we summarize the business logic required in the second traversal of the vesting graph in order to create the vesting installments that comprise a vesting schedule.
Identify the root nodes of the graph (if more than one root node is permitted).
Traverse the vesting conditions from [each] root note in order to create the vesting graph and validate that it is directed and acyclical.
Traverse the graph from [each] root node a second time to determine which vesting conditions are in the execution path, based on whether the vesting condition's trigger has been satisfied.
If two vesting conditions are sibling nodes, enforce the constraint that only one sibling node will enter the execution path, based on which vesting condition is achieved first.
If the vesting condition utilizes a
VestingScheduleRelativeTrigger
to create a periodic time-based vesting schedule:use the
period
object to create a collection of vesting installments under the hood, so long as the vesting condition referenced inrelative_to_condition_id
is in the execution path.If the period time-based vesting schedule utilizes a cliff, implement the cliff when recording the vesting installments.
Create a vesting installment for each vesting condition in the execution path. Ensure that the vesting date occurs no later than the date of any ancestor node, and accumulate any shares that would have vested on an earlier vesting date.
Proposals
EARLIER_OF and LATER_OF Relationships
As seen above, creating AND logic within the current model is complex and requires familiarity with how the ordering of the vesting conditions in the
next_condition_ids
array impacts the second traversal.Similarly, creating expiration dates via leaf nodes with 0 quantity of vesting shares relies on business logic to enforce the constraint that only one sibling node will be included in the execution path, based on whichever occurs first in time.
Perhaps we could facilitate both of these while making the business logic we are relying on more explicit.
Enum - Vesting Trigger Type
Current Implementation
Proposed Implementation
Add
VESTING_RELATIONSHIP_LATER_OF
andVESTING_RELATIONSHIP_EARLIER_OF
theenum
field.Enum - Later Of Calculation Type
Proposed Implementation
LATER_OF Vesting Trigger Type
Proposed Implementation
VESTING_RELATIONSHIP_LATER_OF
REQUIRED
STRING
]REQUIRED
Enum - Quantity Treatment
ONE OF:
- SUM
- MIN
- MAX
- MEAN
- MODE
REQUIRED
EARLIER_OF Vesting Trigger Type
Proposed Implementation
VESTING_RELATIONSHIP_EARLIER_OF
REQUIRED
STRING
]REQUIRED
Examples
In this section we provide examples of common vesting terms utilizing this proposal.
All of the examples below make use of the following
TX_EQUITY_COMPENSATION_ISSUANCE
transaction:Event Based Vesting With Expiration
Using an EARLIER_OF relationship makes transparent that business logic will be used to ensure that only one of the sibling nodes will enter the execution path.
Two Independent Events with Expiration Dates
We are no longer required to explicitly enumerate all possible permutations, thereby facilitating a more declarative paradigm.
We also save the need for duplicate versions of the same vesting condition, at the cost of creating two new vesting conditions to represent the relationships.
Each EARLIER_OF relationship selects a vesting condition to include in the execution path.
By allowing more than one sibling node to be included in the execution path, we can simply allow a vesting installment to be created once the relationship is resolved.
Interdependent Events with Expiration Dates
In the case of interdependent events where only a single vesting installment is intended, we utilize the vesting graph from the example above with an additional LATER_OF relationship.
We ensure that the correct number of shares vest in the final installment by utilizing the
calculation_type
field.Two-Tier Vesting
This is essentially the same pattern as the Two Tier Vesting example above, other than the EARLIER_OF relationship to signal the business logic used for the liquidity condition and its expiration. The event condition includes a reference to the relative condition, in order to indicate how the execution path should proceed in the event the event condition occurs first.
This would rely on the business logic rule described above to ensure that the liquidity event operates as a cliff for the periodic vesting schedule.
Indeterminate Vesting Terms
There are some vesting terms that we will not be able to describe as a vesting graph, such as vesting contingent on the achievement of a performance goal, where the amount of vested shares depends on the degree to which the goal is achieved.
For instance, consider a restricted stock unit over 2X shares, where X shares vest if the company achieves $Y of revenue, all 2X shares vest if the company achieves $2Y of revenue, and in the case of revenue between $Y and $2Y, the number of shares that vest is determined by interpolating between the two thresholds.
Given the that any quantity of shares between X and 2X may ultimately vest (or 0 shares), it would be unmagageable to encode all possible outcomes in a
VestingTerms
object.Should we include a way to indicate that the intent is to create indeterminate vesting terms?
For instance, to create the vesting terms above we could require only an initial vesting condition with a
VestingStartTrigger
, followed by a vesting condition with an e.g.,VESTING_SCHEDULE_INDETERMINATE
trigger. This would semantically indicate that the vesting schedule is intentionally leaving some shares that can only be vested via an acceleration transaction.If a
VESTING_SCHEDULE_INDETERMINATE
trigger isn't provided, then we'd throw a validation error if a vesting graph does not include any execution paths that would result in all shares vesting.Or alternatively we could allow vesting terms that can only be fully vested via an acceleration transaction, without requiring any indication that it was intentional, and instead of throwing a validation error we could provide a validation warning.
Handling Employment Terminations
The vesting model tacitly assumes we are concerned with service-based vesting.
Continued employment is therefore an implicit vesting condition within each
VestingTerms
object. Utilizing the framework described above, every vesting condition is in an implicit EARLIER_OF relationship an employment termination event.Cliff
As discussed in the Periodic Vesting With a Cliff example above, the exact number of shares that should vest on a cliff requires first applying the
VestingScheduleRelativeTrigger
with the relevantAllocationType
from theVestingTerms
, in order to determine the number of shares that would have vested on each installment prior to and including the cliff installment, as well as any fractional shares remaining after the cliff installment.However, the current implementation of
VestingConditions
instead assumes that we will resolve theVestingStartTrigger
, then move to the cliff condition, and then to theVestingScheduleRelativeTrigger
.Vesting Period Primitive Type
Current Implementation
INTEGER
type
units of time; e.g. for 3 months, this would be3
; for 30 days, this would be30
REQUIRED
Enum - Period Type
Description: Enumeration of time period types
ONE OF:
• DAYS
• MONTHS
• YEARS
MONTHS
orDAYS
REQUIRED
INTEGER
36
REQUIRED
Proposed Implementation
Add the following optional field to the
properties
object:INTEGER
Example
The classic 4-year monthly vesting schedule with a 1-year cliff is created with:
VestingStartTrigger
VestingScheduleRelativeTrigger
, andTX_VESTING_START
transaction to set the vesting schedule in motion.A cliff is added to the period vesting schedule by designating a
cliff_installment
in theperiod
object of theVestingScheduleRelativeTrigger
.The
vesting_schedule_generator
utility inOCF-Tools
calculates the periodic time-based vesting schedule, but accrues and aggregates the amounts that vests on each installment until it reaches thecliff_installment
.Acceleration
As discussed in OCF Issue #538, the current implementation of
TX_VESTING_ACCELERATION
is ambiguous in the case of a partial acceleration.Specifically, if the
quantity
is less than the total remaining number of unvested shares, it is unclear which vesting installments the vesting acceleration is intended to apply to.The most typical approach is for a partial vesting acceleration to apply 'pro-rata' across all unvested shares. In other words, the cadence and duration of the vesting schedule remains the same, but the quantity that vests on each remaining installment is reduced proportionally.
But other approaches are available, such as:
We could address this ambiguity as follows:
Current Implementation
STRING
REQUIRED
STRING
]TX_VESTING_ACCELERATION
Defined in [schema/enums/ObjectType]
REQUIRED
REQUIRED
STRING
id
field which identifies the issuance transaction object itself. All future transactions on the security (e.g. acceptance, transfer, cancel, etc.) must reference thissecurity_id
to qualify which security the transaction applies to.REQUIRED
REQUIRED
STRING
REQUIRED
Enum - Allotment_Type
Proposed Implementation
TX_Vesting_Accceleration
Proposed Implementation
STRING
REQUIRED
STRING
]TX_VESTING_ACCELERATION
Defined in [schema/enums/ObjectType]
REQUIRED
REQUIRED
STRING
id
field which identifies the issuance transaction object itself. All future transactions on the security (e.g. acceptance, transfer, cancel, etc.) must reference thissecurity_id
to qualify which security the transaction applies to.REQUIRED
portion
. If none ofquantity
orportion
are provided, then all of the remaining unvested shares are assumed to be accelerated.quantity
for a fixed vesting amount. If none ofquantity
orportion
are provided, then all of the remaining unvested shares are assumed to be accelerated.STRING
REQUIRED
vesting_terms_id
andallotment_type
. If none ofvesting_terms_id
,vestings
orallotment_type
are present, then the security is fully vested on issuance.STRING
allotment_type. If none of
vesting_terms_id,
vestingsor
allotment_type` are present, then the security is fully vested on issuance.Enum - Allotment Type
Description: Enumeration of allotment types to use as a helper when modifying 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 proportionally across the remaining vesting installmentsvestings
,vesting_terms_id
orallotment
are present, then the security is treated as fully vested.Vesting Schedule Modification
When vesting schedules are modified, changes can be made to the frequency, cadence, and duration of the schedule. As discussed in OCF Issue #539, I don't think there is currently any way to modify a vesting schedule.
But isn't modification to a vesting schedule a superset of a vesting acceleration?
In which case, the changes proposed in the Acceleration Proposal above could be expanded to facilitate any type of vesting schedule modification, by removing the
quantity
andportion
fields from the transaction object and replacing theallotment_type
field with aVestingAcceleration
type as follows:Enum - Allotment_Type
Proposed Implementation
VestingAcceleration Type
Proposed Implementation
STRING
REQUIRED
quantity
for a fixed vesting amount. If none ofquantity
orportion
are provided, then all of the remaining unvested shares are assumed to be accelerated.Enum - Allotment Type
Description: Enumeration of allotment types to use as a helper when modifying 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 proportionally across the remaining vesting installmentsquantity
orportion
are provided, then all of the remaining unvested shares are assumed to be accelerated.TX_Vesting_Modification Transaction
Proposed Implementation
STRING
REQUIRED
STRING
]TX_VESTING_MODIFICATION
Defined in [schema/enums/ObjectType]
REQUIRED
REQUIRED
STRING
id
field which identifies the issuance transaction object itself. All future transactions on the security (e.g. acceptance, transfer, cancel, etc.) must reference thissecurity_id
to qualify which security the transaction applies to.REQUIRED
STRING
REQUIRED
vesting_terms_id
andallotment_type
. If none ofvesting_terms_id
,vestings
orallotment_type
are present, then the security is fully vested on issuance.STRING
allotment_type. If none of
vesting_terms_id,
vestingsor
allotment_type` are present, then the security is fully vested on issuance.vestings
,vesting_terms_id
orvesting_acceleration
are present, then the security is treated as fully vested as a result of this vesting schedule modification.Cancellation
The
TX_EQUITY_COMPENSATION_CANCELLATION
transaction avoids the issue described above regarding theTX_VESTING_ACCELERATION
transaction by assuming that in the case of a partial cancellation there will be anothersecurity_id
that holds the remaining balance.If this assumption is acceptable, then no changes would be proposed for the
TX_EQUITY_COMPENSATION_CANCELLATION
transaction.Beta Was this translation helpful? Give feedback.
All reactions