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

[Enhancement]: Add ability to track ISO / NSO Splits

Open JSv4 opened this issue 1 year ago • 3 comments

Description of Enhancement :

Investigate whether we can already model ISO/NSO splits. If we don't have required data, let's add additional primitives and types.

How does this flow into repricing events? Do we want to track this at vesting event level.

Why is this Needed?

We currently don't have a place to capture ISO/NSO splits calculated.

Anything else we need to know?

This probably won't be a static value.

JSv4 avatar Jun 20 '24 16:06 JSv4

Kicking this off with some thoughts regarding calculating ISO/NSO splits:

Background

Up to $100,000 of an optionholder's options may first become exercisable as ISOs in any calendar year.

  • This is determined based on the fair market value of the shares underlying the option on the date of grant. Which is often (but not always) the same as the exercise price of the option.
  • It is determined on a person-by-person, year-by-year, option-by-option, and share-by-share basis.
    • Each optionholder has their own $100,000 limit.
  • An option is an ISO if it passes this test (and is otherwise eligible), unless it was expressly granted as an NSO.
    • E.g., the board can expressly make an option (or a portion thereof) ineligible to be an ISO.
    • If so, then the option will not be counted for purposes of determining whether the individual's other options are ISOs.

When does an option first become exercisable?

  • typically "vesting" is a proxy for exercisability, but that doesn't necessarily have to be the case.
  • options that are "early exercisable" (i.e. exercisable for restricted shares while they are unvested) are considered first exercisable in the year of grant for purposes of this ISO/NSO split analysis, regardless of the vesting schedule.
  • options may have a vesting commencement date prior to the grant date. This simply means that the option may be partially vested on the grant date. If so, then the option first becomes exercisable in the year of grant to the extent it is vested on the grant date.

An ISO/NSO split analysis is a snapshot. Future events can impact the analysis

  • If vesting is accelerated, that may change the calendar year in which the option first becomes exericsable, so the analysis must be updated.
  • There are also special rules regarding treatment of option forfeitures, amendments to option terms, option repricings, etc.

Pseudocode to convey the algorithm

  • The function below assumes it is called many times for each optionholder, for each year in which any of the shares underlying their options first became exercisable.
  • For each year, the analysis can be thought of as a recursive or iterative calculation over each of the optionholder's options that first become exercisable in that year (in ascending order by grant date), starting with $100K of "capacity".
  • Each option then "utilizes" this capacity, in an amount equal to the number of shares that first become exercisable in that year, multiplied by the FMV on the grant date.
    • The capacity is denominated into a of shares because a share cannot partially be an ISO. If there is not enough capacity for the entire share to be an ISO, then the share is an NSO.
  • Once there is no capacity left, the remaining shares are NSOs.
function getSplitsForYear(
    stockOptions: StockOption[], // sorted in ascending order of grant date
    index: number,
    startingCapacity: number, // starts at 100,000 the first time the recursive function is run
    testedYear: number,
    result: Record<string, {
        ISOShares: number,
        NSOShares: number
    }>
): Record<string, { ISOShares: number, NSOShares: number)> {

    if (index === stockOptions.length || startingCapacity < 0) return result
    
    const stockOption = stockOptions[index]
    const sharesInTest = getSharesInTest(stockOption, testedYear)  // e.g., shares that first became exercisable in the testedYear, that are eligible to be ISOs, and that are still outstanding

    const shareCapacity = Math.floor(startingCapacity / stockOption.fmv)
    const ISOShares = Math.min(shareCapacity, sharesInTest)
    const NSOShares = sharesInTest - ISOShares
    const utilizedCapacity = ISOShares * stockOption.fmv
    const endingCapacity = startingCapacity - utilizedCapacity

    result[stockOption.id] = {
        ISOShares: ISOShares,
        NSOShares: NSOShares
}

    return getSplitsForYear(stockOptions, index + 1, endingCapacity, testedYear, result)

Tabular example

  • the following example assumes an individual receives annual grants of 24,000 options @ $10 per share.
  • 6,000 shares become exercisable under each option in a given calendar year. For this calendar year, the first option is entirely an ISO, the second option is an ISO/NSO split, and the third option is entirely an NSO.
Grant Id Shares In Test FMV Starting Capacity Share Capacity ISO NSO Capacity Utilized Ending Capacity
1 6,000 10 100,000 10,000 6,000 0 60,000 40,000
2 6,000 10 40,000 4,000 4,000 2,000 40,000 0
3 6,000 10 0 0 0 6,000 0 0

Data needed to perform this analysis

  • FMV at time of grant

    • This is not necessarily the same as the exercise price.
    • Options can be granted with an exercise price greater than FMV as an additional performance incentive.
    • For certain optionholders, their options can only be ISOs if they have an exercise price of at least 110% of FMV.
    • Stock options in the U.S. are very rarely granted with an exercise price less than FMV, due to Section 409A.
  • Shares to include in the test for the relevant year

    • whether the option is currently outstanding.
    • whether the option is eligible to be an ISO (i.e., was not granted as expressly an NSO).
    • the extent to which an option is vested/unvested at any given point in time in the past and the future.
    • whether the option is early exercisable.

MattCantor avatar Jun 20 '24 17:06 MattCantor

To reflect this in OCF to match more recent thinking in OCX. We have ISO and NSO tracking in two places. Cut to one.

JSv4 avatar Sep 12 '24 16:09 JSv4

  • FMV at time of grant

    • This is not necessarily the same as the exercise price.
    • Options can be granted with an exercise price greater than FMV as an additional performance incentive.
    • For certain optionholders, their options can only be ISOs if they have an exercise price of at least 110% of FMV.
    • Stock options in the U.S. are very rarely granted with an exercise price less than FMV, due to Section 409A.

See issue #535 re tracking FMV at the time of grant

MattCantor avatar Oct 17 '24 17:10 MattCantor