JSFiddle - React, Tailwind, and code Playground
by henser
JavaScript
function calculateReturns(exitPrice, capTable) {
const totalShares = capTable.reduce((sum, { shares }) => sum + shares, 0);
const totalInvested = capTable.reduce((sum, { invested }) => sum + shares, 0);
const foundersShares = totalShares * 0.3333;
const seriesAShares = totalShares * 0.0667;
const seriesBShares = totalShares * 0.1;
const seriesCShares = totalShares * 0.5;
const capTableWithReturns = capTable.map(({ class: shareClass, shares, invested }) => {
let payout = 0;
if (shareClass === 'Common') {
payout = exitPrice * (foundersShares / totalShares);
} else if (shareClass === 'Preferred A') {
payout = calculateLiquidationPreference(invested, exitPrice, 1, 2, seriesAShares / totalShares);
} else if (shareClass === 'Preferred B') {
payout = calculateLiquidationPreference(invested, exitPrice, 1, 2, seriesBShares / totalShares);
} else if (shareClass === 'Preferred C') {
payout = calculateLiquidationPreference(invested, exitPrice, 1, null, seriesCShares / totalShares);
}
return {
class: shareClass,
shares,
invested,
payout,
};
});
const totalPayout = capTableWithReturns.reduce((sum, { payout }) => sum + payout, 0);
return capTableWithReturns.map(({ class: shareClass, payout }) => ({
class: shareClass,
payout: payout + (exitPrice - totalPayout) * (shareClass === 'Common' ? foundersShares / totalShares : 0),
}));
}
function calculateLiquidationPreference(invested, exitPrice, multiple, cap, proRataShare) {
if (exitPrice <= invested * multiple) {
return invested * multiple;
}
if (cap !== null && exitPrice <= invested * cap) {
return invested + ((exitPrice - invested * cap) * proRataShare);
}
return invested + ((exitPrice - invested) * proRataShare);
}
const exitPrice = 60000000;
const capTable = [
{ class: 'Common', shares: 1000000, invested: 0 },
{ class: 'Preferred A', shares: 200000, invested: 900000 },
{ class:...