資本政策表をラウンドまで自分で回す
目標
架空の会社の資本政策表に、ベスティング・退職者の買い戻し・ポストマネーSAFEの転換・オプションプールの増加を含むシードラウンドを、順に適用し、段階ごとに誰がどれだけ希薄化されるかを計算します。
なぜ重要なのか
持分の条件は契約書に書かれますが、その結果は、計算してみる前には見えません。ベスティングのない持分、互いを希薄化するSAFE、プレマネーに入ったプールの増加は、創業者の取り分を静かに変えます。自分で計算できてこそ、交渉の席の数字を読めます。(法律・税務の助言ではありません。)
用意するもの: /opt/fixtures/founder/equity/company.json
founders:name, shares, vesting_start, cliff_months, vesting_months, left_on(去った日、なければnull)pool:granted(付与されたオプション)、unissued(未付与のプール)safes:investor, amount, post_money_capround:date, investor, pre_money, investment, pool_target
定義
- 満了した月数: 開始日から基準日までの(年の差×12 + 月の差)で、基準日の日が開始日の日より小さければ1を引きます(負なら0)。
- ベスティング: 月数 < cliffなら0、そうでなければ
shares × min(달 수, vesting_months) // vesting_months(プレースホルダーは月数です)。去った人は、left_on基準のベスティング分だけが残り、残りは買い戻して消却します。残った創業者は、全量を保有します。 - ラウンド前の株式C = 創業者の保有 + pool_granted + pool_unissued。
- SAFEの転換:
f_i = amount / post_money_cap、F = Σf_i、S_i = floor(f_i × C / (1 − F))。転換後の株式D = C + ΣS。 - ラウンド:
k = (pre_money + investment) / pre_money、U = pool_unissued、p = pool_target。プールの増加P = max(0, floor((p·D·k − U) / (1 − p·k)))、1株あたりの価格= pre_money / (D + P)、投資家の株式数= floor(investment / 주당 가격)、実質プレマネー= 주당 가격 × D(プレースホルダーは1株あたりの価格です)。 - 持分比率は0–1の間の比率で、小数第4位で四捨五入。
ステップ
/root/founder/equity/equity.pyに、vested(shares, start, cliff, total, on)を作る(日付は"YYYY-MM-DD"の文字列、整数を返す)。/root/founder/equity/departures.jsonに、去った人ごとに{"left_on", "months", "vested", "repurchased"}を書く(キーは名前)。/root/founder/equity/cap_pre.jsonに、holders(名前・pool_granted・pool_unissued → 株式数、去った人も残った株式として含める)、total、ownershipを書く。equity.pyに、safe_shares(C, safes)(safesは用意したデータのリストそのままで、同じ順序の株式数のリストを返す)を作り、/root/founder/equity/safes.jsonに、shares(投資家 → 株式数)、total_after(D)、ownership(投資家 → Dに対する比率)を書く。/root/founder/equity/naive.jsonに、よくある間違い(f_i × Cを切り捨てた株式をSAFEに与えた場合)のsharesと、そのときのownership(C + Σ間違い版の株式に対する比率)を書く。equity.pyに、priced_round(D, U, pre_money, investment, pool_target)→{"pool_increase", "price", "investor_shares", "post_fd", "effective_pre_money"}を作り、/root/founder/equity/round.jsonに、用意したデータで計算した結果を書く(priceは小数第2位、effective_pre_moneyは整数に丸める)。/root/founder/equity/cap_post.jsonに、ラウンド後のholders(pool_unissuedは増加分を加え、ラウンドの投資家を追加)、total、ownershipを書く。/root/founder/equity/dilution.jsonに、minji([ラウンド前、SAFE転換後、ラウンド後]の持分比率3つ)、founders_after(残った創業者全体の、ラウンド後の持分比率)、headline_pre_money、effective_pre_money、investor_ownership(ラウンドの投資家)を書く。
参考
- 整数の除算と切り捨て(
//、math.floor)を、定義どおりに守ってください。1株の違いも、採点ツールは見逃しません。 - よくある間違い: クリフ前の退職者にベスティングを与えること、月数を日単位の丸めで数えること、SAFEの比率をCにそのまま掛けること、プールの増加を投資後の株式に入れること、持分比率をパーセント(53.35)で書くことです。
ベスティング: 満了した月とクリフ
/root/founder/equity/equity.pyに、vested(shares, start, cliff, total, on)を作る。
まず、満了した月数を数えます。基準日の「日」が開始日の「日」より小さければ、その月は、まだ満了していません。クリフの前なら0、その後は整数の除算(//)です。
去った人の取り分
/root/founder/equity/departures.jsonに、去った人ごとにleft_on・months・vested・repurchasedを書く。
left_onがある創業者だけを書きます。repurchasedは、元の株式 − ベスティングされた株式です。
ラウンド前の資本政策表
/root/founder/equity/cap_pre.jsonに、holders・total・ownershipを書く。
去った人はベスティング分だけ、残った創業者は全量、そしてpool_granted・pool_unissuedを、1つの表に置きます。持分比率は、0–1の比率です。
ポストマネーSAFE2枚を転換する
equity.pyにsafe_shares(C, safes)を加え、/root/founder/equity/safes.jsonに、shares・total_after・ownershipを書く。
各SAFEは、転換後の全体の株式から、投資額 ÷ キャップの分を持たなければなりません。SAFEどうしも互いを希薄化するので、比率の合計Fで、C × f / (1 − F)を計算します。
よくある間違い: 比率をそのまま掛けると
/root/founder/equity/naive.jsonに、f_i × Cを切り捨てたsharesと、そのときのownership(C + Σに対する比率)を書く。
このステップは、わざと間違った計算です。約束された比率(投資額 ÷ キャップ)より、投資家の取り分が小さく出ることを確認してください。
プールの増加をプレマネーに入れるシードラウンド
equity.pyにpriced_round(D, U, pre_money, investment, pool_target)を加え、/root/founder/equity/round.jsonに結果を書く。
k = ポスト ÷ プレです。プールの増加Pを、定義の式で求めて切り捨てた後、1株あたりの価格 = プレ ÷ (D + P)、投資家の株式数 = 投資 ÷ 価格の切り捨てです。
ラウンド後の資本政策表
/root/founder/equity/cap_post.jsonに、holders・total・ownershipを書く。
SAFE投資家を加えた表で、pool_unissuedに増加分を加え、ラウンドの投資家(用意したデータのround.investor)を、新しい行として入れます。
誰がどれだけ希薄化されたか
/root/founder/equity/dilution.jsonに、minji(3つの時点)・founders_after・headline_pre_money・effective_pre_money・investor_ownershipを書く。
SAFE転換後のminjiの持分比率 = minjiの株式 ÷ Dです。実質プレマネーは、ステップ6の結果をそのまま使います。