Open JSv4 opened 3 months ago
Kicking this off with some thoughts regarding calculating ISO/NSO splits:
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)
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 |
FMV at time of grant
Shares to include in the test for the relevant year
To reflect this in OCF to match more recent thinking in OCX. We have ISO and NSO tracking in two places. Cut to one.
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.