STUD.com
← Objectives

Compute · Assess & Decide · Analysis & Finance

Compute a convertible-note / pre-money SAFE conversion price (cap vs discount) and simple round dilution

You get the conversion price per share for a PRE-money convertible note or pre-money SAFE (the lower of the cap-implied and discount-implied price), the shares it converts into, the round's post-money valuation, and the new lead investor's post-money ownership percentage.

You receive: A reviewed conversion-and-dilution calculator (a pure function) plus its passing held-out test report, run on your note terms and round terms.

Part of Pitch Investors

What's verified: STUD verifies the ARITHMETIC of a PRE-money convertible-note or pre-money-SAFE conversion given the terms you supply: that the note converts at the LOWER of the cap-implied price (valuation cap divided by your pre-round fully-diluted share count) and the discount-implied price (the round price less your discount), that the check divides into shares at that price, and that post-money and the new lead's ownership follow the stated ratios. STUD does NOT verify that your cap, discount, valuation, or share count are real or fair, that any investor would agree to these terms, or that the valuation is defensible. Important limits: (a) THIS DOES NOT MODEL THE POST-MONEY SAFE, the dominant US seed instrument since 2018, where the holder's ownership is fixed at investment divided by the post-money cap over the post-conversion fully-diluted capitalization (including the option-pool top-up). Relative to a post-money SAFE, this pre-money method UNDERSTATES the holder's ownership and the founder's dilution; use it only for a pre-money note or pre-money SAFE. (b) The cap-implied price is only as accurate as the fully-diluted share count you supply; omitting the option pool from that count understates the shares issued and your dilution. (c) It reports the new lead's simple post-money ownership (their cash divided by post-money), not a full fully-diluted cap-table percentage across all holders, and accrued note interest and simultaneous conversion of multiple instruments are out of scope.

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_dilution_safe_conversion",
 "expectNote": "expect is the comparison-space value (your return value goes through normalize first when one is published)",
 "hiddenCaseCount": 12,
 "hiddenCaseNames": [
  "book_prepost_money_numbers",
  "cap_equals_discount_tie",
  "zero_discount_nonbinding_cap_zero_lead",
  "deep_discount_no_cap",
  "low_cap_binds_hard",
  "large_fully_diluted_base",
  "small_seed_round",
  "no_discount_cap_binds",
  "high_discount_low_cap_both_present",
  "tiny_check_big_round",
  "cap_far_above_round",
  "mid_stage_priced_round"
 ],
 "inputKeys": [
  "discountPct",
  "newLeadInvestment",
  "preRoundFullyDilutedShares",
  "roundPreMoney",
  "safeInvestment",
  "valuationCap"
 ],
 "normalizeSource": "def _normalize_compute_dilution_safe_conversion(r):\n    if not isinstance(r, dict):\n        return repr(r)\n    try:\n        # Round each field to the SAME precision the reference uses (6): the grader compares\n        # normalize(submission) to the RAW reference output with exact equality.\n        return {\n            \"roundPricePerShare\": round(float(r[\"roundPricePerShare\"]), 6),\n            \"discountPricePerShare\": round(float(r[\"discountPricePerShare\"]), 6),\n            \"capPricePerShare\": round(float(r[\"capPricePerShare\"]), 6),\n            \"conversionPricePerShare\": round(float(r[\"conversionPricePerShare\"]), 6),\n            \"safeSharesIssued\": round(float(r[\"safeSharesIssued\"]), 6),\n            \"postMoneyValuation\": round(float(r[\"postMoneyValuation\"]), 6),\n            \"leadOwnershipPost\": round(float(r[\"leadOwnershipPost\"]), 6),\n        }\n    except Exception:\n        return repr(r)\n",
 "returnShapes": [
  [
   "capPricePerShare",
   "conversionPricePerShare",
   "discountPricePerShare",
   "leadOwnershipPost",
   "postMoneyValuation",
   "roundPricePerShare",
   "safeSharesIssued"
  ]
 ],
 "signature": "def compute_dilution_safe_conversion(inp):",
 "submission": "python exposing the entry function; inp is one input object; graded on held-out cases",
 "tier": "calculator",
 "visibleCases": [
  {
   "expect": {
    "capPricePerShare": 3,
    "conversionPricePerShare": 3,
    "discountPricePerShare": 4,
    "leadOwnershipPost": 0.090909,
    "postMoneyValuation": 5500000,
    "roundPricePerShare": 5,
    "safeSharesIssued": 33333.333333
   },
   "input": {
    "discountPct": 20,
    "newLeadInvestment": 500000,
    "preRoundFullyDilutedShares": 1000000,
    "roundPreMoney": 5000000,
    "safeInvestment": 100000,
    "valuationCap": 3000000
   },
   "name": "cap_wins_book_canonical"
  },
  {
   "expect": {
    "capPricePerShare": 6,
    "conversionPricePerShare": 4,
    "discountPricePerShare": 4,
    "leadOwnershipPost": 0.166667,
    "postMoneyValuation": 6000000,
    "roundPricePerShare": 5,
    "safeSharesIssued": 25000
   },
   "input": {
    "discountPct": 20,
    "newLeadInvestment": 1000000,
    "preRoundFullyDilutedShares": 1000000,
    "roundPreMoney": 5000000,
    "safeInvestment": 100000,
    "valuationCap": 6000000
   },
   "name": "discount_wins_high_cap"
  }
 ],
 "vocabulary": [
  "capPricePerShare",
  "conversionPricePerShare",
  "discountPct",
  "discountPricePerShare",
  "leadOwnershipPost",
  "newLeadInvestment",
  "postMoneyValuation",
  "preRoundFullyDilutedShares",
  "roundPreMoney",
  "roundPricePerShare",
  "safeInvestment",
  "safeSharesIssued",
  "valuationCap"
 ]
}

Get early access to STUD the day it goes live.