Skip to main content

Waterfalls App

The waterfalls app handles computing distribution waterfalls - the rules that determine how fund profits are distributed among LPs and the GP.

Overview

A waterfall defines how distributions flow through different tiers:
  1. Return of Capital (ROC) - Return LP contributions
  2. Preferred Return - Pay LPs their preferred return
  3. Catch-up - GP catches up to their share
  4. Final Split - Remaining profits split between LP/GP

Life-to-Date Computation

Waterfalls are computed life-to-date (LTD). The system aggregates all historical transactions to determine how much has hit each tier.

Key Fields

FieldDescription
participating_partners_distribution_amountLTD distributions hitting this tier
current_dist_participating_partners_distribution_amountCurrent distribution hitting this tier
The sum of current_dist_participating_partners_distribution_amount across all tiers always equals the net distribution for that security ownership.

Current Distribution Calculation

For most cases, when participating_partners_distribution_amount increases:
current_amount = current_run.amount - previous_run.amount

Complex Scenarios

When participating_partners_distribution_amount decreases (e.g., after a capital call that increases the ROC hurdle), the calculation is more complex. Example:
  • Previous: 100ROC,100 ROC, 10 pref
  • 50capitalcallincreasesROChurdleto50 capital call increases ROC hurdle to 150
  • $20 distribution: all goes to ROC, none to pref
  • Pref participating_partners_distribution_amount = $0
  • But we don’t want current_dist = -$10 (clawback)
Solution: Set current_dist_participating_partners_distribution_amount:
  • ROC tier: $20
  • Pref tier: 0(not0 (not -10)

Positive Distribution Logic

1

Sort tiers by order

Process tiers from first to last.
2

Calculate max additional

max_additional = tier_max - ltd_distributions_for_tier
3

Allocate to tier

allocate = min(max_additional, remaining_distribution)
4

Handle over-allocation

If tier is over-allocated (LTD > tier max), deduct from next tier.

Negative Distribution Logic

For negative distributions (e.g., certain equalization scenarios):
  • Sort tiers in reverse order
  • Deduct up to LTD distribution amount for each tier
  • Use $0 as the “tier min”

Clawback Handling

When summing current_dist_participating_partners_distribution_amount, the total may not equal the latest participating_partners_distribution_amount. This discrepancy is reconciled at LPA-defined “trigger events” through GP carry clawback (not yet supported in the system).

WaterfallTierTransaction Model

class WaterfallTierTransaction(CustomerTimeStampedModel):
    security_ownership = ForeignKey(SecurityOwnership)
    waterfall_tier = ForeignKey(WaterfallTier)
    waterfall_run = ForeignKey(WaterfallRun)
    participating_partners_distribution_amount = DecimalField()
    current_dist_participating_partners_distribution_amount = DecimalField()