STUD.com
← Objectives

Compute · Assess & Decide · Analysis & Finance

Compute Founder Vesting Acceleration Payout on Change of Control

A precise breakdown of how many founder shares vest at a change-of-control event under the grant's acceleration terms, so the founder knows their stake before signing.

You receive: A pure function: given total grant, vesting term/cliff, time elapsed at the event, the acceleration type (single/double trigger), the acceleration percentage of remaining unvested shares, and whether the founder is also terminated, it returns sharesVestedBeforeEvent, sharesAcceleratedAtEvent, sharesStillUnvested, and totalVestedAfterEvent.

Part of Choose Business Model

What's verified: STUD verifies the acceleration arithmetic against the grant terms supplied. It does NOT decide whether single- or double-trigger is the right deal, whether the acceleration terms will be accepted by an acquirer or investors, or interpret the actual legal stock agreement; it computes the share counts implied by the parameters the buyer froze.

Opens soon

Cost20 credits
AcceptanceAutomated check against your inputs
ProtectionHeld until verified delivery

This objective is verified and ready. It opens soon, once sign-in and payments are live.

Deliverable interface

The exact vocabulary the automated check enforces: keys, tokens, entry points, and worked examples. Generated from the verification source.

{
 "constants": {},
 "entryName": "compute_vesting_acceleration",
 "expectNote": "expect is the comparison-space value (your return value goes through normalize first when one is published)",
 "hiddenCaseCount": 18,
 "hiddenCaseNames": [
  "cover_single_no",
  "cover_single_yes",
  "cover_double_no",
  "cover_double_yes",
  "cover_precliff",
  "cover_zero_accel",
  "gen0",
  "gen1",
  "gen2",
  "gen3",
  "gen4",
  "gen5",
  "gen6",
  "gen7",
  "gen8",
  "gen9",
  "gen10",
  "gen11"
 ],
 "inputKeys": [
  "accelerationPctOfRemaining",
  "cliffMonths",
  "founderTerminated",
  "monthsElapsedAtEvent",
  "totalGrantShares",
  "triggerType",
  "vestingMonths"
 ],
 "normalizeSource": "def _normalize_founder_vesting_acceleration_payout(r):\n    if not isinstance(r, dict): return r\n    def i(x): return None if x is None else int(round(float(x)))\n    return {\"sharesVestedBeforeEvent\": i(r.get(\"sharesVestedBeforeEvent\")), \"sharesAcceleratedAtEvent\": i(r.get(\"sharesAcceleratedAtEvent\")),\n            \"sharesStillUnvested\": i(r.get(\"sharesStillUnvested\")), \"totalVestedAfterEvent\": i(r.get(\"totalVestedAfterEvent\"))}\n",
 "returnShapes": [
  [
   "sharesAcceleratedAtEvent",
   "sharesStillUnvested",
   "sharesVestedBeforeEvent",
   "totalVestedAfterEvent"
  ]
 ],
 "signature": "def compute_vesting_acceleration(inp):",
 "submission": "python exposing the entry function; inp is one input object; graded on held-out cases",
 "tier": "calculator",
 "visibleCases": [
  {
   "expect": {
    "sharesAcceleratedAtEvent": 250000,
    "sharesStillUnvested": 250000,
    "sharesVestedBeforeEvent": 500000,
    "totalVestedAfterEvent": 750000
   },
   "input": {
    "accelerationPctOfRemaining": 50,
    "cliffMonths": 12,
    "founderTerminated": "no",
    "monthsElapsedAtEvent": 24,
    "totalGrantShares": 1000000,
    "triggerType": "single",
    "vestingMonths": 48
   },
   "name": "single_50pct"
  },
  {
   "expect": {
    "sharesAcceleratedAtEvent": 0,
    "sharesStillUnvested": 500000,
    "sharesVestedBeforeEvent": 500000,
    "totalVestedAfterEvent": 500000
   },
   "input": {
    "accelerationPctOfRemaining": 100,
    "cliffMonths": 12,
    "founderTerminated": "no",
    "monthsElapsedAtEvent": 24,
    "totalGrantShares": 1000000,
    "triggerType": "double",
    "vestingMonths": 48
   },
   "name": "double_notfired"
  },
  {
   "expect": {
    "sharesAcceleratedAtEvent": 500000,
    "sharesStillUnvested": 0,
    "sharesVestedBeforeEvent": 500000,
    "totalVestedAfterEvent": 1000000
   },
   "input": {
    "accelerationPctOfRemaining": 100,
    "cliffMonths": 12,
    "founderTerminated": "yes",
    "monthsElapsedAtEvent": 24,
    "totalGrantShares": 1000000,
    "triggerType": "double",
    "vestingMonths": 48
   },
   "name": "double_fired"
  },
  {
   "expect": {
    "sharesAcceleratedAtEvent": 200000,
    "sharesStillUnvested": 200000,
    "sharesVestedBeforeEvent": 0,
    "totalVestedAfterEvent": 200000
   },
   "input": {
    "accelerationPctOfRemaining": 50,
    "cliffMonths": 12,
    "founderTerminated": "no",
    "monthsElapsedAtEvent": 6,
    "totalGrantShares": 400000,
    "triggerType": "single",
    "vestingMonths": 48
   },
   "name": "precliff_single"
  }
 ],
 "vocabulary": [
  "1",
  "accelerationPctOfRemaining",
  "cliffMonths",
  "double",
  "founderTerminated",
  "monthsElapsedAtEvent",
  "sharesAcceleratedAtEvent",
  "sharesStillUnvested",
  "sharesVestedBeforeEvent",
  "single",
  "totalGrantShares",
  "totalVestedAfterEvent",
  "triggerType",
  "true",
  "vestingMonths",
  "y",
  "yes"
 ]
}

Get early access to STUD the day it goes live.